TracciamentoManager.java
- /*
- * GovWay - A customizable API Gateway
- * https://govway.org
- *
- * Copyright (c) 2005-2025 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.transazioni;
- import java.io.File;
- import java.sql.Connection;
- import java.sql.SQLException;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.List;
- import org.openspcoop2.core.commons.CoreException;
- import org.openspcoop2.core.commons.dao.DAOFactory;
- import org.openspcoop2.core.commons.dao.DAOFactoryProperties;
- import org.openspcoop2.core.config.OpenspcoopAppender;
- import org.openspcoop2.core.config.PortaApplicativa;
- import org.openspcoop2.core.config.PortaDelegata;
- import org.openspcoop2.core.config.Property;
- import org.openspcoop2.core.config.utils.OpenSPCoopAppenderUtilities;
- import org.openspcoop2.core.constants.Costanti;
- import org.openspcoop2.core.constants.CostantiLabel;
- import org.openspcoop2.core.constants.TipoPdD;
- import org.openspcoop2.core.controllo_traffico.beans.MisurazioniTransazione;
- import org.openspcoop2.core.id.IDPortaApplicativa;
- import org.openspcoop2.core.id.IDPortaDelegata;
- import org.openspcoop2.core.id.IDServizio;
- import org.openspcoop2.core.id.IDSoggetto;
- import org.openspcoop2.core.registry.driver.IDServizioFactory;
- import org.openspcoop2.core.transazioni.Transazione;
- import org.openspcoop2.core.transazioni.constants.DiagnosticColumnType;
- import org.openspcoop2.core.transazioni.dao.IDumpMessaggioService;
- import org.openspcoop2.core.transazioni.dao.ITransazioneService;
- import org.openspcoop2.core.transazioni.utils.TransazioneDaoExt;
- import org.openspcoop2.generic_project.beans.UpdateField;
- import org.openspcoop2.generic_project.exception.ExpressionException;
- import org.openspcoop2.generic_project.exception.ExpressionNotImplementedException;
- import org.openspcoop2.generic_project.exception.NotFoundException;
- import org.openspcoop2.generic_project.exception.NotImplementedException;
- import org.openspcoop2.generic_project.exception.ServiceException;
- import org.openspcoop2.generic_project.expression.IExpression;
- import org.openspcoop2.generic_project.utils.ServiceManagerProperties;
- import org.openspcoop2.monitor.sdk.transaction.FaseTracciamento;
- import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
- import org.openspcoop2.pdd.config.DBTransazioniManager;
- import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
- import org.openspcoop2.pdd.config.Resource;
- import org.openspcoop2.pdd.core.CostantiPdD;
- import org.openspcoop2.pdd.core.controllo_traffico.CostantiControlloTraffico;
- import org.openspcoop2.pdd.core.controllo_traffico.handler.PostOutResponseHandlerGestioneControlloTraffico;
- import org.openspcoop2.pdd.core.handlers.HandlerException;
- import org.openspcoop2.pdd.core.handlers.transazioni.ExceptionSerialzerFileSystem;
- import org.openspcoop2.pdd.core.handlers.transazioni.ISalvataggioDiagnosticiManager;
- import org.openspcoop2.pdd.core.handlers.transazioni.ISalvataggioTracceManager;
- import org.openspcoop2.pdd.core.handlers.transazioni.StatoSalvataggioDiagnostici;
- import org.openspcoop2.pdd.core.handlers.transazioni.StatoSalvataggioTracce;
- import org.openspcoop2.pdd.core.token.InformazioniNegoziazioneToken;
- import org.openspcoop2.pdd.core.token.InformazioniToken;
- import org.openspcoop2.pdd.core.token.attribute_authority.InformazioniAttributi;
- import org.openspcoop2.pdd.core.transazioni.Transaction;
- import org.openspcoop2.pdd.core.transazioni.TransactionContext;
- import org.openspcoop2.pdd.core.transazioni.TransactionNotExistsException;
- import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
- import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
- import org.openspcoop2.pdd.logger.filetrace.FileTraceConfig;
- import org.openspcoop2.pdd.logger.filetrace.FileTraceManager;
- import org.openspcoop2.pdd.services.ServicesUtils;
- import org.openspcoop2.protocol.engine.SecurityTokenUtilities;
- import org.openspcoop2.protocol.sdk.Context;
- import org.openspcoop2.protocol.sdk.SecurityToken;
- import org.openspcoop2.protocol.sdk.builder.EsitoTransazione;
- import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
- import org.openspcoop2.protocol.sdk.diagnostica.IDiagnosticProducer;
- import org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico;
- import org.openspcoop2.protocol.sdk.dump.IDumpProducer;
- import org.openspcoop2.protocol.sdk.dump.Messaggio;
- import org.openspcoop2.protocol.sdk.state.RequestInfo;
- import org.openspcoop2.protocol.sdk.tracciamento.ITracciaProducer;
- import org.openspcoop2.protocol.sdk.tracciamento.Traccia;
- import org.openspcoop2.utils.BooleanNullable;
- import org.openspcoop2.utils.Map;
- import org.openspcoop2.utils.MapKey;
- import org.openspcoop2.utils.date.DateManager;
- import org.openspcoop2.utils.date.DateUtils;
- import org.openspcoop2.utils.date.UnitaTemporale;
- import org.slf4j.Logger;
- /**
- * TracciamentoManager
- *
- * @author Andrea Poli (apoli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- *
- */
- public class TracciamentoManager {
- private boolean transazioniEnabled = true;
- public boolean isTransazioniEnabled() {
- return this.transazioniEnabled;
- }
-
- /**
- * Database resources
- */
- private DAOFactory daoFactory = null;
- private ServiceManagerProperties daoFactoryServiceManagerPropertiesTransazioni = null;
- private Logger daoFactoryLoggerTransazioni = null;
- /**
- * OpenSPCoop2Properties/ConfigurazionePdDManager resources
- */
- private OpenSPCoop2Properties openspcoopProperties = null;
- public OpenSPCoop2Properties getOpenspcoopProperties() {
- return this.openspcoopProperties;
- }
- private ConfigurazionePdDManager configPdDManager = null;
-
- /**
- * Indicazione se funzionare in modalita' debug
- */
- private boolean debug = false;
- /**
- * Tracciamento e MsgDiagnostici appender
- */
- private ITracciaProducer tracciamentoOpenSPCoopAppender = null;
- private IDiagnosticProducer msgDiagnosticiOpenSPCoopAppender = null;
- private IDumpProducer dumpOpenSPCoopAppender = null;
- /**
- * Informazioni tracce e diagnostici
- */
- private boolean transazioniRegistrazioneTracceProtocolPropertiesEnabled = false;
- private boolean transazioniRegistrazioneTracceHeaderRawEnabled = false;
- private boolean transazioniRegistrazioneTracceDigestEnabled = false;
- private ISalvataggioTracceManager salvataggioTracceManager = null;
- private ISalvataggioDiagnosticiManager salvataggioDiagnosticiManager = null;
- private boolean transazioniRegistrazioneDumpHeadersCompactEnabled = false;
-
- private FaseTracciamento fase;
- private boolean usePdDConnection = true;
- private String tipoDatabaseRuntime = null;
-
- /**
- * Logger
- */
- private Logger log = null;
- public void logDebug(String msg) {
- if(this.log!=null) {
- this.log.debug(msg);
- }
- }
- public void logDebug(String msg, Exception e) {
- if(this.log!=null) {
- this.log.debug(msg,e);
- }
- }
- public void logWarn(String msg) {
- if(this.log!=null) {
- this.log.warn(msg);
- }
- }
- public void logError(String msg) {
- if(this.log!=null) {
- this.log.error(msg);
- }
- }
- public void logError(String msg, Throwable e) {
- if(this.log!=null) {
- this.log.error(msg,e);
- }
- }
- private Logger logSql = null;
- public void logSqlDebug(String msg) {
- if(this.logSql!=null) {
- this.logSql.debug(msg);
- }
- }
-
- private static final String TIPO_RECOVERY_FS = "__timerFileSystemRecovery";
-
- public TracciamentoManager(FaseTracciamento fase) throws CoreException{
- this.fase = fase;
-
- this.openspcoopProperties = OpenSPCoop2Properties.getInstance();
- this.transazioniEnabled = this.openspcoopProperties.isTransazioniEnabled();
- if(!this.transazioniEnabled) {
- return;
- }
-
- // Debug
- this.debug = this.openspcoopProperties.isTransazioniDebug();
-
- // Log
- this.log = OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioni(this.debug);
- this.logSql = OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioniSql(this.debug);
-
- this.tipoDatabaseRuntime = this.openspcoopProperties.getDatabaseType();
- if(this.tipoDatabaseRuntime==null){
- throw new CoreException("Tipo Database non definito");
- }
-
- this.configPdDManager = ConfigurazionePdDManager.getInstance();
-
- this.initTransactionResources();
-
- this.usePdDConnection = true;
-
- if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
- initTracciamento(this.tipoDatabaseRuntime, this.usePdDConnection);
- }
-
- if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
- initDiagnostica(this.tipoDatabaseRuntime, this.usePdDConnection);
- initDump(this.tipoDatabaseRuntime, this.usePdDConnection);
- }
-
- initConfigurazioneTracciamento();
- }
-
- private void initTransactionResources() throws CoreException {
- // DB
- try{
- DAOFactoryProperties daoFactoryProperties = null;
- this.daoFactoryLoggerTransazioni = this.logSql;
- this.daoFactory = DAOFactory.getInstance(this.daoFactoryLoggerTransazioni);
- daoFactoryProperties = DAOFactoryProperties.getInstance(this.daoFactoryLoggerTransazioni);
- this.daoFactoryServiceManagerPropertiesTransazioni = daoFactoryProperties.getServiceManagerProperties(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance());
- this.daoFactoryServiceManagerPropertiesTransazioni.setShowSql(this.debug);
- this.daoFactoryServiceManagerPropertiesTransazioni.setDatabaseType(DBTransazioniManager.getInstance().getTipoDatabase());
- }catch(Exception e){
- throw new CoreException("Errore durante l'inizializzazione delle risorse per l'accesso al database: "+e.getMessage(),e);
- }
- }
-
- private void initTracciamento(String tipoDatabaseRuntime, boolean usePdDConnection) throws CoreException {
- try{
-
- // Init
- this.tracciamentoOpenSPCoopAppender = new org.openspcoop2.pdd.logger.TracciamentoOpenSPCoopProtocolAppender();
- OpenspcoopAppender tracciamentoOpenSPCoopAppenderEngine = new OpenspcoopAppender();
- tracciamentoOpenSPCoopAppenderEngine.setTipo(TIPO_RECOVERY_FS);
- List<Property> tracciamentoOpenSPCoopAppenderProperties = new ArrayList<>();
- // Verra poi utilizzata la connessione ottenuta ogni volta che il timer viene eseguito, infatti si usa usePdDConnection
- OpenSPCoopAppenderUtilities.addParameters(this.daoFactoryLoggerTransazioni, tracciamentoOpenSPCoopAppenderProperties,
- null, // nessun datasource
- null, null, null, null, // nessuna connection
- tipoDatabaseRuntime,
- usePdDConnection, // viene usata la connessione della PdD
- this.debug
- );
- OpenSPCoopAppenderUtilities.addCheckProperties(tracciamentoOpenSPCoopAppenderProperties, false);
- tracciamentoOpenSPCoopAppenderEngine.setPropertyList(tracciamentoOpenSPCoopAppenderProperties);
- this.tracciamentoOpenSPCoopAppender.initializeAppender(tracciamentoOpenSPCoopAppenderEngine);
- this.tracciamentoOpenSPCoopAppender.isAlive();
-
- }catch(Exception e){
- throw new CoreException("Errore durante l'inizializzazione del TracciamentoAppender: "+e.getMessage(),e);
- }
- }
-
- private void initDiagnostica(String tipoDatabaseRuntime, boolean usePdDConnection) throws CoreException {
- try{
-
- // Init
- this.msgDiagnosticiOpenSPCoopAppender = new org.openspcoop2.pdd.logger.MsgDiagnosticoOpenSPCoopProtocolAppender();
- OpenspcoopAppender diagnosticoOpenSPCoopAppenderEngine = new OpenspcoopAppender();
- diagnosticoOpenSPCoopAppenderEngine.setTipo(TIPO_RECOVERY_FS);
- List<Property> diagnosticoOpenSPCoopAppenderProperties = new ArrayList<>();
- // Verra poi utilizzata la connessione ottenuta ogni volta che il timer viene eseguito, infatti si usa usePdDConnection
- OpenSPCoopAppenderUtilities.addParameters(this.daoFactoryLoggerTransazioni, diagnosticoOpenSPCoopAppenderProperties,
- null, // nessun datasource
- null, null, null, null, // nessuna connection
- tipoDatabaseRuntime,
- usePdDConnection, // viene usata la connessione della PdD
- this.debug
- );
- OpenSPCoopAppenderUtilities.addCheckProperties(diagnosticoOpenSPCoopAppenderProperties, false);
- diagnosticoOpenSPCoopAppenderEngine.setPropertyList(diagnosticoOpenSPCoopAppenderProperties);
- this.msgDiagnosticiOpenSPCoopAppender.initializeAppender(diagnosticoOpenSPCoopAppenderEngine);
- this.msgDiagnosticiOpenSPCoopAppender.isAlive();
-
- }catch(Exception e){
- throw new CoreException("Errore durante l'inizializzazione del DiagnosticoAppender: "+e.getMessage(),e);
- }
- }
-
- private void initDump(String tipoDatabaseRuntime, boolean usePdDConnection) throws CoreException {
- try{
-
- // Init
- this.dumpOpenSPCoopAppender = new org.openspcoop2.pdd.logger.DumpOpenSPCoopProtocolAppender();
- OpenspcoopAppender dumpOpenSPCoopAppenderEngine = new OpenspcoopAppender();
- dumpOpenSPCoopAppenderEngine.setTipo(TIPO_RECOVERY_FS);
- List<Property> dumpOpenSPCoopAppenderProperties = new ArrayList<>();
- // Verra poi utilizzata la connessione ottenuta ogni volta che il timer viene eseguito, infatti si usa usePdDConnection
- OpenSPCoopAppenderUtilities.addParameters(this.daoFactoryLoggerTransazioni, dumpOpenSPCoopAppenderProperties,
- null, // nessun datasource
- null, null, null, null, // nessuna connection
- tipoDatabaseRuntime,
- usePdDConnection, // viene usata la connessione della PdD
- this.debug
- );
- OpenSPCoopAppenderUtilities.addCheckProperties(dumpOpenSPCoopAppenderProperties, false);
- dumpOpenSPCoopAppenderEngine.setPropertyList(dumpOpenSPCoopAppenderProperties);
- this.dumpOpenSPCoopAppender.initializeAppender(dumpOpenSPCoopAppenderEngine);
- this.dumpOpenSPCoopAppender.isAlive();
-
- }catch(Exception e){
- throw new CoreException("Errore durante l'inizializzazione del DumpAppender: "+e.getMessage(),e);
- }
- }
-
- private void initConfigurazioneTracciamento() throws CoreException {
- // Configurazione tracce e diagnostici
- try{
- // Indicazione se devo registrare tutte le tracce o solo quelle non ricostruibili
- this.transazioniRegistrazioneTracceProtocolPropertiesEnabled = this.openspcoopProperties.isTransazioniRegistrazioneTracceProtocolPropertiesEnabled();
- this.transazioniRegistrazioneTracceHeaderRawEnabled = this.openspcoopProperties.isTransazioniRegistrazioneTracceHeaderRawEnabled();
- this.transazioniRegistrazioneTracceDigestEnabled = this.openspcoopProperties.isTransazioniRegistrazioneTracceDigestEnabled();
-
- // Indicazioni sulle modalita' di salvataggio degli header del dump
- this.transazioniRegistrazioneDumpHeadersCompactEnabled = this.openspcoopProperties.isTransazioniRegistrazioneDumpHeadersCompactEnabled();
-
- // salvataggio
- this.salvataggioTracceManager = this.openspcoopProperties.getTransazioniRegistrazioneTracceManager();
- this.salvataggioDiagnosticiManager = this.openspcoopProperties.getTransazioniRegistrazioneDiagnosticiManager();
- } catch (Exception e) {
- throw new CoreException("Errore durante la lettura della configurazione della registrazione di tracce/diagnostici: " + e.getLocalizedMessage(), e);
- }
- }
-
-
- private static final MapKey<String> DISABLE_TRANSACTION_FILTER = Map.newMapKey("DISABLE_TRANSACTION_FILTER");
- private boolean existsTransactionFilter(InformazioniTransazione info) {
- return info!=null && info.getContext()!=null && info.getContext().containsKey(DISABLE_TRANSACTION_FILTER);
- }
- private String getTransactionFilter(InformazioniTransazione info) {
- return (info!=null && info.getContext()!=null) ? (String) info.getContext().get(DISABLE_TRANSACTION_FILTER) : null;
- }
- private void disableTransactionFilter(InformazioniTransazione info) {
- if(!existsTransactionFilter(info) && info!=null && info.getContext()!=null) {
- info.getContext().put(DISABLE_TRANSACTION_FILTER, this.fase.name());
- }
- }
-
- private static final MapKey<String> DISABLE_TRANSACTION_FILTER_DB = Map.newMapKey("DISABLE_TRANSACTION_FILTER_DB");
- private boolean existsTransactionFilterDB(InformazioniTransazione info) {
- return info!=null && info.getContext()!=null && info.getContext().containsKey(DISABLE_TRANSACTION_FILTER_DB);
- }
- private void disableTransactionFilterDB(InformazioniTransazione info) {
- if(!existsTransactionFilter(info) && info!=null && info.getContext()!=null) {
- info.getContext().put(DISABLE_TRANSACTION_FILTER_DB, this.fase.name());
- }
- }
-
- private static final MapKey<String> DISABLE_TRANSACTION_FILTER_FILETRACE = Map.newMapKey("DISABLE_TRANSACTION_FILTER_FILETRACE");
- private boolean existsTransactionFilterFileTrace(InformazioniTransazione info) {
- return info!=null && info.getContext()!=null && info.getContext().containsKey(DISABLE_TRANSACTION_FILTER_FILETRACE);
- }
- private void disableTransactionFilterFileTrace(InformazioniTransazione info) {
- if(!existsTransactionFilter(info) && info!=null && info.getContext()!=null) {
- info.getContext().put(DISABLE_TRANSACTION_FILTER_FILETRACE, this.fase.name());
- }
- }
-
-
- public void invoke(InformazioniTransazione info, String esitoContext, java.util.Map<String, List<String>> headerInUscita,
- org.openspcoop2.pdd.logger.MsgDiagnostico msgdiagErrore) throws HandlerException {
- invokeEngine(info, null, esitoContext, headerInUscita,
- msgdiagErrore);
- }
- public void invoke(InformazioniTransazione info, String esitoContext,
- org.openspcoop2.pdd.logger.MsgDiagnostico msgdiagErrore) throws HandlerException {
- invokeEngine(info, null, esitoContext, null,
- msgdiagErrore);
- }
- public void invoke(InformazioniTransazione info, EsitoTransazione esito, java.util.Map<String, List<String>> headerInUscita,
- org.openspcoop2.pdd.logger.MsgDiagnostico msgdiagErrore) throws HandlerException {
- invokeEngine(info, esito, null, headerInUscita,
- msgdiagErrore);
- }
- public void invoke(InformazioniTransazione info, EsitoTransazione esito) throws HandlerException {
- invokeEngine(info, esito, null, null, null);
- }
- private void invokeEngine(InformazioniTransazione info, EsitoTransazione esito, String esitoContext,
- java.util.Map<String, List<String>> headerInUscita,
- org.openspcoop2.pdd.logger.MsgDiagnostico msgdiagErrore) throws HandlerException {
-
- if(!this.transazioniEnabled) {
- return;
- }
-
- TransazioniProcessTimes times = null;
- long timeStart = -1;
- if(this.openspcoopProperties.isTransazioniRegistrazioneSlowLog()) {
- times = new TransazioniProcessTimes();
- timeStart = DateManager.getTimeMillis();
- }
- try {
- invoke(info, esito, esitoContext, headerInUscita,
- msgdiagErrore,
- times);
- }
- catch(HandlerException he) {
- he.setIntegrationFunctionError(IntegrationFunctionError.GOVWAY_RESOURCES_NOT_AVAILABLE);
- throw he;
- }
- finally {
- if(times!=null) {
- long timeEnd = DateManager.getTimeMillis();
- long timeProcess = timeEnd-timeStart;
- if(timeProcess>=this.openspcoopProperties.getTransazioniRegistrazioneSlowLogThresholdMs()) {
- StringBuilder sb = new StringBuilder();
- sb.append(timeProcess);
- if(times.idTransazione!=null) {
- sb.append(" <").append(times.idTransazione).append(">");
- }
- sb.append(" ["+this.fase+"]");
- sb.append(" ").append(times.toString());
- String msg = sb.toString();
- OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioniSlowLog().info(msg);
- }
- }
- }
-
- }
- private void invoke(InformazioniTransazione info,
- EsitoTransazione esito, String esitoContext,
- java.util.Map<String, List<String>> headerInUscita,
- org.openspcoop2.pdd.logger.MsgDiagnostico msgdiagErrore,
- TransazioniProcessTimes times) throws HandlerException {
- if (info==null)
- throw new HandlerException("Informazioni transazione is null");
-
- Context context = info.getContext();
- TipoPdD tipoPorta = info.getTipoPorta();
-
- /* ---- Recupero contesto ----- */
- if (context==null)
- throw new HandlerException("Contesto is null");
- if (context.getObject(Costanti.ID_TRANSAZIONE)==null)
- throw new HandlerException("Identificativo della transazione assente");
- String idTransazione = (String) context.getObject(Costanti.ID_TRANSAZIONE);
- if (idTransazione==null)
- throw new HandlerException("Identificativo della transazione assente");
- /**System.out.println("------------- "+this.fase+" ("+idTransazione+")("+context.getTipoPorta().getTipo()+") -------------------");*/
- String prefixIdTransazione = "Transazione ID["+idTransazione+"] ";
- Transaction transaction = null;
- try {
- transaction = FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) ? TransactionContext.removeTransaction(idTransazione) : TransactionContext.getTransaction(idTransazione);
- }catch(TransactionNotExistsException n) {
- // ignore
- }
- if(times!=null) {
- times.idTransazione = idTransazione;
- }
-
- /* ---- Verifica Configurazione della Transazione per registrazione nello storico ----- */
-
- ConfigurazioneTracciamento configurazioneTracciamento = null;
- boolean dbEnabledBloccante = true;
- boolean dbEnabledNonBloccante = false;
- boolean fileTraceEnabledBloccante = false;
- boolean fileTraceEnabledNonBloccante = false;
- File fileTraceConfig = null;
- boolean fileTraceConfigGlobal = true;
- boolean existsAnotherFiletraceTrackingPhase = false;
- try{
- if(msgdiagErrore==null) {
- String nomePorta = null;
- if(transaction!=null && transaction.getRequestInfo()!=null &&
- transaction.getRequestInfo().getProtocolContext()!=null &&
- transaction.getRequestInfo().getProtocolContext().getInterfaceName()!=null) {
- nomePorta = transaction.getRequestInfo().getProtocolContext().getInterfaceName();
- }
- RequestInfo requestInfo = transaction!=null ? transaction.getRequestInfo() : null;
- msgdiagErrore = org.openspcoop2.pdd.logger.MsgDiagnostico.newInstance(info.getTipoPorta(),info.getIdModulo(), nomePorta, requestInfo, this.configPdDManager);
- msgdiagErrore.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_BUSTE);
- msgdiagErrore.setPddContext(info.getContext(), info.getProtocolFactory());
- }
-
- configurazioneTracciamento = getConfigurazioneTracciamento(idTransazione, context, tipoPorta, transaction);
-
- if(configurazioneTracciamento!=null) {
- dbEnabledBloccante = configurazioneTracciamento.isDbEnabled();
- if(dbEnabledBloccante) {
- switch (this.fase) {
- case IN_REQUEST:
- dbEnabledBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoDBRequestInEnabledBloccante();
- dbEnabledNonBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoDBRequestInEnabledNonBloccante();
- break;
- case OUT_REQUEST:
- dbEnabledBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoDBRequestOutEnabledBloccante();
- dbEnabledNonBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoDBRequestOutEnabledNonBloccante();
- break;
- case OUT_RESPONSE:
- dbEnabledBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoDBResponseOutEnabledBloccante();
- dbEnabledNonBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoDBResponseOutEnabledNonBloccante();
- break;
- case POST_OUT_RESPONSE:
- dbEnabledBloccante = configurazioneTracciamento.getRegole()==null || configurazioneTracciamento.getRegole().isTracciamentoDBResponseOutCompleteEnabled();
- break;
- }
- }
-
- fileTraceEnabledBloccante = configurazioneTracciamento.isFileTraceEnabled();
- if(fileTraceEnabledBloccante) {
- fileTraceConfig = configurazioneTracciamento.getFileTraceConfig();
- fileTraceConfigGlobal = configurazioneTracciamento.isFileTraceConfigGlobal();
- }
- if(fileTraceEnabledBloccante) {
- switch (this.fase) {
- case IN_REQUEST:
- fileTraceEnabledBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoFileTraceRequestInEnabledBloccante();
- fileTraceEnabledNonBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoFileTraceRequestInEnabledNonBloccante();
-
- // per ripulire le risorse
- if(this.openspcoopProperties.isTransazioniFileTraceDumpBinarioReleaseInLastTrackingPhase() && configurazioneTracciamento.isFileTraceEnabled()) {
- existsAnotherFiletraceTrackingPhase =
- // postOutResponse
- (configurazioneTracciamento.getRegole()==null ||
- configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutCompleteEnabled() ||
- configurazioneTracciamento.isInitFileTraceByExternalPropertyPort())
- ||
- // outRequest
- (configurazioneTracciamento.getRegole().isTracciamentoFileTraceRequestOutEnabledBloccante() || configurazioneTracciamento.getRegole().isTracciamentoFileTraceRequestOutEnabledNonBloccante())
- ||
- // outResponse
- (configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutEnabledBloccante() || configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutEnabledNonBloccante())
- ;
- }
- break;
- case OUT_REQUEST:
- fileTraceEnabledBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoFileTraceRequestOutEnabledBloccante();
- fileTraceEnabledNonBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoFileTraceRequestOutEnabledNonBloccante();
-
- // per ripulire le risorse
- if(this.openspcoopProperties.isTransazioniFileTraceDumpBinarioReleaseInLastTrackingPhase() && configurazioneTracciamento.isFileTraceEnabled()) {
- existsAnotherFiletraceTrackingPhase =
- // postOutResponse
- (configurazioneTracciamento.getRegole()==null ||
- configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutCompleteEnabled() ||
- configurazioneTracciamento.isInitFileTraceByExternalPropertyPort())
- ||
- // outResponse
- (configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutEnabledBloccante() || configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutEnabledNonBloccante())
- ;
- }
- break;
- case OUT_RESPONSE:
- fileTraceEnabledBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutEnabledBloccante();
- fileTraceEnabledNonBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutEnabledNonBloccante();
-
- // per ripulire le risorse
- if(this.openspcoopProperties.isTransazioniFileTraceDumpBinarioReleaseInLastTrackingPhase() && configurazioneTracciamento.isFileTraceEnabled()) {
- existsAnotherFiletraceTrackingPhase =
- // postOutResponse
- (configurazioneTracciamento.getRegole()==null ||
- configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutCompleteEnabled() ||
- configurazioneTracciamento.isInitFileTraceByExternalPropertyPort())
- ;
- }
- break;
- case POST_OUT_RESPONSE:
- fileTraceEnabledBloccante = configurazioneTracciamento.getRegole()==null ||
- configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutCompleteEnabled() ||
- configurazioneTracciamento.isInitFileTraceByExternalPropertyPort();
- break;
- }
- }
- }
-
- }catch (Exception e) {
- this.logError(prefixIdTransazione+"errore durante la lettura della configurazione del tracciamento da effettuare: "+e.getMessage(),e);
- }
-
- /* ---- Verifica Esito della Transazione per registrazione nello storico ----- */
-
- boolean exitTransactionAfterRateLimitingRemoveThreadNoTraceDB = false;
- boolean noFileTrace = false;
- if(!dbEnabledBloccante && !dbEnabledNonBloccante
- &&
- !fileTraceEnabledBloccante && !fileTraceEnabledNonBloccante
- ) {
- noFileTrace = true;
- exitTransactionAfterRateLimitingRemoveThreadNoTraceDB = true;
- }
- else {
- try{
- boolean forceDisableTransactionFilter = false;
- if(FaseTracciamento.OUT_RESPONSE.equals(this.fase) || FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
- forceDisableTransactionFilter = this.existsTransactionFilter(info);
- }
- else if(FaseTracciamento.IN_REQUEST.equals(this.fase) || FaseTracciamento.OUT_REQUEST.equals(this.fase)){
- this.disableTransactionFilter(info);
- }
-
- if(forceDisableTransactionFilter) {
- if(this.debug){
- this.logDebug("["+idTransazione+"] Vengono registrati tutte le Transazioni indipendentemente dagli esiti poichè è stata precedentente effettuato un tracciamento nella fase "+getTransactionFilter(info));
- }
- }
- else {
- StringBuilder bf = new StringBuilder();
- String tipoFiltroEsiti = null;
- boolean filtroEsitiDB = false;
- boolean filtroEsitiFileTrace = false;
- List<String> esitiDaRegistrare = null;
- if(configurazioneTracciamento!=null) {
- esitiDaRegistrare = configurazioneTracciamento.getEsitiDaRegistrare(bf);
- tipoFiltroEsiti = configurazioneTracciamento.getTipoFiltroEsiti();
- filtroEsitiDB = configurazioneTracciamento.isFiltroEsitiDB();
- filtroEsitiFileTrace = configurazioneTracciamento.isFiltroEsitiFileTrace();
- }
-
- if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
- if(filtroEsitiDB && this.existsTransactionFilterDB(info)) {
- filtroEsitiDB=false;
- }
- if(filtroEsitiFileTrace && this.existsTransactionFilterFileTrace(info)) {
- filtroEsitiFileTrace=false;
- }
- }
-
- if(esitiDaRegistrare==null || esitiDaRegistrare.isEmpty() || (!filtroEsitiDB && !filtroEsitiFileTrace)){
- esitiDaRegistrare = null;
- if(this.debug){
- this.logDebug("["+idTransazione+"] Vengono registrati tutte le Transazioni indipendentemente dagli esiti");
- }
- }
- else{
- if(this.debug){
- this.logDebug("["+idTransazione+"] ("+tipoFiltroEsiti+") Esiti delle Transazioni da registare: "+bf.toString());
- }
- if(esito!=null){
-
- boolean esitoDaRegistrare = ConfigurazioneTracciamentoUtils.isEsitoDaRegistrare(this.log, info.getProtocolFactory(), context,
- esitiDaRegistrare, esito);
-
- if(!esitoDaRegistrare){
- String msg = prefixIdTransazione+"non salvata nello storico "+tipoFiltroEsiti+" come richiesto dalla configurazione del tracciamento: "+
- ConfigurazioneTracciamentoUtils.getEsitoTransazionDetail(this.log, info.getProtocolFactory(),esito);
- if(ConfigurazioneTracciamentoUtils.isEsitoOk(this.log, info.getProtocolFactory(),esito)) {
- this.logWarn(msg);
- }
- else{
- this.logError(msg);
- }
-
- // BUG OP-825
- // la gestione RateLimiting deve essere sempre fatta senno se si configurara di non registrare una transazione, poi si ha l'effetto che i contatori del Controllo del Traffico non vengono diminuiti.
- if(filtroEsitiDB) {
- exitTransactionAfterRateLimitingRemoveThreadNoTraceDB = true;
- }
- else if(FaseTracciamento.OUT_RESPONSE.equals(this.fase) &&
- (dbEnabledBloccante || dbEnabledNonBloccante)) {
- this.disableTransactionFilterDB(info);
- }
-
- if(filtroEsitiFileTrace) {
- noFileTrace = true;
- }
- else if(FaseTracciamento.OUT_RESPONSE.equals(this.fase) &&
- (fileTraceEnabledBloccante || fileTraceEnabledNonBloccante)) {
- this.disableTransactionFilterFileTrace(info);
- }
- }
- else{
- this.disableTransactionFilter(info);
- }
- }
- else{
- this.logError(prefixIdTransazione+"senza un esito");
- }
- }
- }
- }catch (Exception e) {
- this.logError(prefixIdTransazione+"errore durante la lettura della configurazione del tracciamento da effettuare rispetto agli esiti: "+e.getMessage(),e);
- }
-
- if(!exitTransactionAfterRateLimitingRemoveThreadNoTraceDB && !dbEnabledBloccante && !dbEnabledNonBloccante) {
- exitTransactionAfterRateLimitingRemoveThreadNoTraceDB = true;
- }
- if(!noFileTrace && !fileTraceEnabledBloccante && !fileTraceEnabledNonBloccante) {
- noFileTrace = true;
- }
-
- }
-
-
-
-
-
-
- /* ---- Recupero dati della transazione dal contesto ----- */
-
- Boolean controlloCongestioneMaxRequestThreadRegistrato = null;
- if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) && this.openspcoopProperties.isControlloTrafficoEnabled()){
- Object objControlloCongestioneMaxRequestThreadRegistrato = context.getObject(CostantiControlloTraffico.PDD_CONTEXT_MAX_REQUEST_THREAD_REGISTRATO);
- if(objControlloCongestioneMaxRequestThreadRegistrato!=null){
- controlloCongestioneMaxRequestThreadRegistrato = (Boolean) objControlloCongestioneMaxRequestThreadRegistrato;
- /**System.out.println("CHECK POST OUT ["+context.getTipoPorta().name()+"] controlloCongestioneMaxRequestViolated["+controlloCongestioneMaxRequestViolated+"] controllo["+PddInterceptorConfig.isControlloCongestioneTraceTransazioneMaxThreadsViolated()+"]");*/
- }
- }
-
- // Check Transaction
- if (transaction==null)
- throw new HandlerException("Dati della transazione assenti");
- if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
- transaction.setDeleted();
- }
- MisurazioniTransazione misurazioniTransazione = null;
- Transazione transazioneDTO = null;
- HandlerException fileTraceException = null;
- try{
-
- RequestInfo requestInfo = null;
- if(context!=null && context.containsKey(Costanti.REQUEST_INFO)){
- requestInfo = (RequestInfo) context.getObject(Costanti.REQUEST_INFO);
- }
-
- IDSoggetto idDominio = this.openspcoopProperties.getIdentitaPortaDefault(info.getProtocolFactory().getProtocol(), requestInfo);
- if(info.getProtocollo()!=null && info.getProtocollo().getDominio()!=null && !info.getProtocollo().getDominio().equals(idDominio)){
- idDominio = info.getProtocollo().getDominio();
- }
- else if(requestInfo!=null &&
- requestInfo.getIdentitaPdD()!=null && !requestInfo.getIdentitaPdD().equals(idDominio)){
- idDominio = requestInfo.getIdentitaPdD();
- }
-
- String modulo = "Tracciamento-"+this.fase;
-
- ExceptionSerialzerFileSystem exceptionSerializerFileSystem = new ExceptionSerialzerFileSystem(this.log);
-
-
- // ### Lettura dati Transazione ###
-
- boolean pddStateless = true;
- TransazioneUtilities transazioneUtilities = null;
- HandlerException he = null;
- long timeStart = -1;
- try{
- if(exitTransactionAfterRateLimitingRemoveThreadNoTraceDB && noFileTrace) {
- if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) && this.openspcoopProperties.isControlloTrafficoEnabled()){
- misurazioniTransazione = TransazioneUtilities.fillMisurazioniTransazione(info, this.fase, transaction, esito, transazioneDTO);
- }
- return; // entro nel finally e se sono post out rimuovo il thread per il controllo del traffico
- }
-
- if(times!=null) {
- timeStart = DateManager.getTimeMillis();
- }
-
- // Stateless
- /** if ( (context.getIntegrazione()==null) ||
- // (context.getIntegrazione().isGestioneStateless()==null) ||
- // (context.getIntegrazione().isGestioneStateless()==false)
- // ){
- // pddStateless = false;
- // }*/
- // Cambio l'approccio per poter simulare anche gli errori nei diagnostici dove possibile
- // Tanto tutte le comunicazioni sono stateless a meno che non vengano tramutate in stateful
- if ( info.getIntegrazione()!=null &&
- info.getIntegrazione().isGestioneStateless()!=null &&
- !info.getIntegrazione().isGestioneStateless().booleanValue()){
- pddStateless = false;
- }
-
- /* ---- Salvo informazioni sulla transazioni nell'oggetto transazioniDTO ----- */
- transazioneUtilities = new TransazioneUtilities(this.log, this.openspcoopProperties,
- this.transazioniRegistrazioneTracceHeaderRawEnabled,
- this.transazioniRegistrazioneTracceDigestEnabled,
- this.transazioniRegistrazioneTracceProtocolPropertiesEnabled,
- configurazioneTracciamento!=null ? configurazioneTracciamento.getInformazioniSalvareTransazioni() : null);
- transazioneDTO = transazioneUtilities.fillTransaction(info, transaction, idDominio,
- ( (times!=null && this.openspcoopProperties.isTransazioniRegistrazioneSlowLogBuildTransactionDetails()) ? times : null),
- this.fase,
- esito, esitoContext,
- info.getTransazioneDaAggiornare()); // NOTA: questo metodo dovrebbe non lanciare praticamente mai eccezione
- if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) && this.openspcoopProperties.isControlloTrafficoEnabled()){
- misurazioniTransazione = TransazioneUtilities.fillMisurazioniTransazione(info, this.fase, transaction, esito, transazioneDTO);
- }
- if(FaseTracciamento.OUT_RESPONSE.equals(this.fase)) {
- info.setTransazioneDaAggiornare(transazioneDTO);
- }
-
- }catch (Throwable e) {
- try{
- if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
- exceptionSerializerFileSystem.registrazioneFileSystemDiagnosticiTracceDumpEmessiPdD(transaction, idTransazione, null,
- true, true, true, true);
- }
- } catch (Exception eClose) {
- // ignore
- }
- // Effettuo il log anche nel core per evitare che un eventuale filtro a OFF sul core della PdD eviti la scrittura di questi errori
- String msg = "Errore durante la scrittura della transazione sul database (Lettura dati Transazione): " + e.getLocalizedMessage();
- this.logError("["+idTransazione+"] "+msg,e);
- he = new HandlerException(msg,e);
- }
- finally {
- if(times!=null) {
- long timeEnd = DateManager.getTimeMillis();
- long timeProcess = timeEnd-timeStart;
- times.fillTransaction = timeProcess;
- }
-
- // ### Gestione Controllo Congestione ###
- // Nota: il motivo del perchè viene effettuato qua la "remove"
- // risiede nel fatto che la risposta al client è già stata data
- // però il "thread occupato" dal client non è ancora stato liberato per una nuova richiesta
- // Se la remove viene messa nel finally del try-catch sottostante prima della remove si "paga"
- // i tempi di attesa dell'inserimento della transazione sul database
- if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) && this.openspcoopProperties.isControlloTrafficoEnabled()){
-
- try {
- if(times!=null) {
- timeStart = DateManager.getTimeMillis();
- }
- PostOutResponseHandlerGestioneControlloTraffico outHandler = new PostOutResponseHandlerGestioneControlloTraffico();
- outHandler.process(controlloCongestioneMaxRequestThreadRegistrato, this.log, idTransazione, misurazioniTransazione, info,
- ( (times!=null && this.openspcoopProperties.isTransazioniRegistrazioneSlowLogRateLimitingDetails()) ? times : null));
- }catch (Throwable e) {
- this.logError("["+idTransazione+"] Errore durante la registrazione di terminazione del thread: "+e.getMessage(),e);
- }finally {
- if(times!=null) {
- long timeEnd = DateManager.getTimeMillis();
- long timeProcess = timeEnd-timeStart;
- times.controlloTraffico = timeProcess;
- }
- }
- }
-
- // ### FileTrace ###
- if((fileTraceEnabledBloccante || fileTraceEnabledNonBloccante) && !noFileTrace) {
-
- InformazioniToken informazioniToken = null;
- InformazioniAttributi informazioniAttributi = null;
- InformazioniNegoziazioneToken informazioniNegoziazioneToken = null;
- SecurityToken securityToken = null;
- if(transaction!=null) {
- informazioniToken = transaction.getInformazioniToken();
- informazioniNegoziazioneToken = transaction.getInformazioniNegoziazioneToken();
- }
- if(context!=null) {
- Object oInformazioniAttributiNormalizzati = context.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_ATTRIBUTI_INFORMAZIONI_NORMALIZZATE);
- if(oInformazioniAttributiNormalizzati instanceof InformazioniAttributi) {
- informazioniAttributi = (InformazioniAttributi) oInformazioniAttributiNormalizzati;
- }
- securityToken = SecurityTokenUtilities.readSecurityToken(context);
- }
-
- fileTraceException = logWithFileTrace(fileTraceConfig, fileTraceConfigGlobal,
- times,
- transazioneDTO, transaction, esito,
- informazioniToken,
- informazioniAttributi,
- informazioniNegoziazioneToken,
- securityToken,
- info,
- headerInUscita,
- requestInfo,
- idTransazione,
- fileTraceEnabledBloccante,
- msgdiagErrore,
- existsAnotherFiletraceTrackingPhase); // anche qua vi e' un try catch con Throwable
- }
-
- }
-
- if(he!=null) {
- throw he;
- }
- else if(exitTransactionAfterRateLimitingRemoveThreadNoTraceDB){
- // La risorsa viene rilasciata nel finally
- /**this.releaseResources(transaction, idTransazione, context);*/
-
- // se non devo tracciare su db ma ho avuto un errore su file trace devo registrarlo
- if(fileTraceException!=null) {
- throw fileTraceException;
- }
-
- return;
- }
-
-
-
- // Il controllo stateful è stato spostato sotto il blocco soprastante, per assicurare la gestione del traffico (decremento dei contatori)
-
- // NOTA: se l'integrazione e' null o l'indicazione se la gestione stateless e' null, significa che la PdD non e' ancora riuscita
- // a capire che tipo di gestione deve adottare. Queste transazioni devono essere sempre registrate perche' riguardano cooperazioni andate in errore all'inizio,
- // es. Porta Delegata non esistente, busta malformata....
- if(info.getIntegrazione()!=null &&
- info.getIntegrazione().isGestioneStateless()!=null &&
- !info.getIntegrazione().isGestioneStateless().booleanValue() &&
- !this.openspcoopProperties.isTransazioniStatefulEnabled()){
- /**if(this.debug)*/
- this.logError("["+idTransazione+"] Transazione non registrata, gestione stateful non abilitata");
- // NOTA: Da fare thread che ripulisce header di trasporto o dump messaggi non associati a transazioni.
- // La risorsa viene rilasciata nel finally
- /**this._releaseResources(transaction, idTransazione, context);*/
-
- // se non devo tracciare su db ma ho avuto un errore su file trace devo registrarlo
- if(fileTraceException!=null) {
- throw fileTraceException;
- }
-
- return;
- }
-
-
-
-
-
-
-
-
- // ### Gestione Transazione ###
-
- boolean autoCommit = true;
- DBTransazioniManager dbManager = null;
- Resource resource = null;
- Connection connection = null;
- boolean errore = false;
- boolean registraTracciaRichiesta = (FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) && info.getTransazioneDaAggiornare()==null)
- ||
- (FaseTracciamento.OUT_RESPONSE.equals(this.fase));
- boolean registraTracciaRichiestaInfoTransazione = false;
- boolean registraTracciaRisposta = (FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) && info.getTransazioneDaAggiornare()==null)
- ||
- (FaseTracciamento.OUT_RESPONSE.equals(this.fase));
- boolean registraTracciaRispostaInfoTransazione = false;
- boolean registrazioneMessaggiDiagnostici = true;
- boolean registrazioneDumpMessaggi = true;
- boolean insertTransazione = false;
- try {
-
-
- /* ---- Recupero informazioni sulla modalita' di salvataggio delle tracce ----- */
-
- String informazioneTracciaRichiestaDaSalvare = null;
- String informazioneTracciaRispostaDaSalvare = null;
- HashMap<DiagnosticColumnType, String> informazioniDiagnosticiDaSalvare = null;
- try {
- if(times!=null) {
- timeStart = DateManager.getTimeMillis();
- }
-
- // TRACCIA RICHIESTA
- if(
- registraTracciaRichiesta
- &&
- this.salvataggioTracceManager!=null) {
-
- registraTracciaRichiestaInfoTransazione = true;
-
- StatoSalvataggioTracce statoTracciaRichiesta =
- this.salvataggioTracceManager.getInformazioniSalvataggioTracciaRichiesta(this.log, info, transaction, transazioneDTO, pddStateless);
- if(statoTracciaRichiesta!=null) {
- registraTracciaRichiesta = (!statoTracciaRichiesta.isCompresso());
- informazioneTracciaRichiestaDaSalvare = statoTracciaRichiesta.getInformazioneCompressa();
- }
- if(this.debug){
- this.logDebug("["+idTransazione+"] Emissione traccia richiesta: "+registraTracciaRichiesta);
- if(statoTracciaRichiesta!=null) {
- this.logDebug("["+idTransazione+"] Informazioni Salvataggio traccia richiesta (compresso:"+statoTracciaRichiesta.isCompresso()+
- " errore:"+statoTracciaRichiesta.isErrore()+"): "+statoTracciaRichiesta.getInformazione());
- }
- }
- else{
- if(statoTracciaRichiesta!=null && statoTracciaRichiesta.isErrore()){
- this.logWarn("["+idTransazione+"] Informazioni Salvataggio traccia richiesta in errore: "+statoTracciaRichiesta.getInformazione());
- }
- }
- }
-
- // TRACCIA RISPOSTA
- if(
- registraTracciaRisposta
- &&
- this.salvataggioTracceManager!=null) {
-
- registraTracciaRispostaInfoTransazione = true;
-
- StatoSalvataggioTracce statoTracciaRisposta =
- this.salvataggioTracceManager.getInformazioniSalvataggioTracciaRisposta(this.log, info, transaction, transazioneDTO, pddStateless);
- if(statoTracciaRisposta!=null) {
- registraTracciaRisposta = (!statoTracciaRisposta.isCompresso());
- informazioneTracciaRispostaDaSalvare = statoTracciaRisposta.getInformazioneCompressa();
- }
- if(this.debug){
- this.logDebug("["+idTransazione+"] Emissione traccia risposta: "+registraTracciaRisposta);
- if(statoTracciaRisposta!=null) {
- this.logDebug("["+idTransazione+"] Informazioni Salvataggio traccia risposta (compresso:"+statoTracciaRisposta.isCompresso()+
- " errore:"+statoTracciaRisposta.isErrore()+"): "+statoTracciaRisposta.getInformazione());
- }
- }
- else{
- if(statoTracciaRisposta!=null && statoTracciaRisposta.isErrore()){
- this.logWarn("["+idTransazione+"] Informazioni Salvataggio traccia risposta in errore: "+statoTracciaRisposta.getInformazione());
- }
- }
- }
-
- // MESSAGGI DIAGNOSTICI
- if(this.salvataggioDiagnosticiManager!=null) {
- StatoSalvataggioDiagnostici statoDiagnostici =
- this.salvataggioDiagnosticiManager.getInformazioniSalvataggioDiagnostici(this.log, info, transaction, transazioneDTO, pddStateless);
- if(statoDiagnostici!=null) {
- registrazioneMessaggiDiagnostici = (!statoDiagnostici.isCompresso());
- informazioniDiagnosticiDaSalvare = statoDiagnostici.getInformazioneCompressa();
- }
- if(this.debug){
- this.logDebug("["+idTransazione+"] Emissione diagnostici: "+registrazioneMessaggiDiagnostici);
- if(statoDiagnostici!=null) {
- this.logDebug("["+idTransazione+"] Informazioni Salvataggio diagnostici (compresso:"+statoDiagnostici.isCompresso()+
- " errore :"+statoDiagnostici.isErrore()+"): "+statoDiagnostici.getInformazione());
- }
- }
- else{
- if(statoDiagnostici!=null && statoDiagnostici.isErrore()){
- this.logWarn("["+idTransazione+"] Informazioni Salvataggio diagnostici in errore: "+statoDiagnostici.getInformazione());
- }
- }
- if(registrazioneMessaggiDiagnostici && !FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
- registrazioneMessaggiDiagnostici = false; // con salvataggioDiagnosticiManager si scrivono nella tabella msgdiagnostici solo in fondo
- }
- }
- }finally {
- if(times!=null) {
- long timeEnd = DateManager.getTimeMillis();
- long timeProcess = timeEnd-timeStart;
- times.processTransactionInfo = timeProcess;
- }
- }
-
- // IMPOSTO INFORMAZIONI IN TRANSAZIONE DTO
-
- // ** dati tracce **
- transazioneDTO.setTracciaRichiesta(informazioneTracciaRichiestaDaSalvare);
- transazioneDTO.setTracciaRisposta(informazioneTracciaRispostaDaSalvare);
-
- // ** dati diagnostica **
- if(informazioniDiagnosticiDaSalvare!=null){
- transazioneDTO.setDiagnostici(informazioniDiagnosticiDaSalvare.get(DiagnosticColumnType.META_INF));
- transazioneDTO.setDiagnosticiList1(informazioniDiagnosticiDaSalvare.get(DiagnosticColumnType.LIST1));
- transazioneDTO.setDiagnosticiList2(informazioniDiagnosticiDaSalvare.get(DiagnosticColumnType.LIST2));
- transazioneDTO.setDiagnosticiListExt(informazioniDiagnosticiDaSalvare.get(DiagnosticColumnType.LIST_EXT));
- transazioneDTO.setDiagnosticiExt(informazioniDiagnosticiDaSalvare.get(DiagnosticColumnType.EXT));
- }
-
-
- // DUMP
-
- boolean registrazioneContenuti = false;
- for(int i=0; i<transaction.sizeMessaggi(); i++){
- Messaggio messaggio = transaction.getMessaggio(i);
- if(!messaggio.isStored()) {
- registrazioneContenuti=true;
- break;
- }
- }
-
- // CONTENUTI
- boolean registrazioneRisorse = transaction.getTransactionServiceLibrary()!=null || (transaction.getRisorse()!=null && !transaction.getRisorse().isEmpty()); /**transaction.sizeMessaggi()>0;*/
-
-
- // AUTO-COMMIT
- if(registraTracciaRichiesta || registraTracciaRisposta || registrazioneMessaggiDiagnostici || registrazioneContenuti || registrazioneRisorse){
- autoCommit = false; // devo registrare piu' informazioni oltre alla transazione
- }
- if(this.debug)
- this.logSqlDebug("["+idTransazione+"] AutoCommit: "+this.debug);
-
-
-
-
-
-
-
- // Dopo aver assegnato tutti i valori all'oggetto transazione, in modo da poterlo salvare su filesystem
- if(
- (FaseTracciamento.OUT_REQUEST.equals(this.fase) && this.openspcoopProperties.isTransazioniTracciamentoDBOutRequestThrowRequestException() )
- ||
- (FaseTracciamento.OUT_RESPONSE.equals(this.fase) && this.openspcoopProperties.isTransazioniTracciamentoDBOutResponseThrowRequestException() )
- ||
- (FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) &&
- (
- this.openspcoopProperties.isTransazioniTracciamentoDBPostOutResponseThrowRequestException()
- ||
- this.openspcoopProperties.isTransazioniTracciamentoDBPostOutResponseThrowResponseException()
- )
- )
- ) {
- throwTrackingExceptionIfExists(info);
- }
-
-
-
-
-
-
-
- /* ---- Connection/Service Manager ----- */
-
- if(this.debug)
- this.logSqlDebug("["+idTransazione+"] recupero jdbcServiceManager in corso ...");
-
- // Ottiene la connessione al db
- try {
- if(times!=null) {
- timeStart = DateManager.getTimeMillis();
- }
- dbManager = DBTransazioniManager.getInstance();
- resource = dbManager.getResource(idDominio, modulo, idTransazione);
- }finally {
- if(times!=null) {
- long timeEnd = DateManager.getTimeMillis();
- long timeProcess = timeEnd-timeStart;
- times.getConnection = timeProcess;
- }
- }
- if(resource==null){
- throw new CoreException("Risorsa al database non disponibile");
- }
- connection = (Connection) resource.getResource();
- if(connection == null)
- throw new CoreException("Connessione non disponibile");
- if(!autoCommit){
- connection.setAutoCommit(false);
- }
- org.openspcoop2.core.transazioni.dao.jdbc.JDBCServiceManager jdbcServiceManager =
- (org.openspcoop2.core.transazioni.dao.jdbc.JDBCServiceManager)
- this.daoFactory.getServiceManager(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance(),
- connection, autoCommit,
- this.daoFactoryServiceManagerPropertiesTransazioni, this.daoFactoryLoggerTransazioni);
- jdbcServiceManager.getJdbcProperties().setShowSql(this.debug);
- ITransazioneService transazioneService = jdbcServiceManager.getTransazioneService();
- if(this.debug)
- this.logSqlDebug("["+idTransazione+"] recupero jdbcServiceManager effettuato");
-
- /**System.out.println("\n\n\n****** ["+this.fase+"]["+transazioneDTO.getIdTransazione()+"] (autoCommit:"+autoCommit+") ["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] *******");*/
-
-
-
- /* ---- Inserimento dati transazione ----- */
-
- // Inserisco transazione
- if(this.debug)
- this.logDebug("["+idTransazione+"] inserimento transazione in corso ...");
-
- try {
- if(times!=null) {
- timeStart = DateManager.getTimeMillis();
- }
- insertTransazione = registraTransazione(transazioneDTO,
- transazioneService, info,
- autoCommit, registraTracciaRichiestaInfoTransazione, registraTracciaRispostaInfoTransazione);
- }finally {
- if(times!=null) {
- long timeEnd = DateManager.getTimeMillis();
- long timeProcess = timeEnd-timeStart;
- times.insertTransaction = timeProcess;
- }
- }
- if(this.debug)
- this.logDebug("["+idTransazione+"] inserita transazione");
-
-
-
-
- /* ---- Inserimento dati tracce ----- */
-
- List<Traccia> tracceSalvate = new ArrayList<>();
- try {
- timeStart = -1;
-
- if(
- !FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)
- &&
- (
- (registraTracciaRichiesta && transaction.getTracciaRichiesta()!=null)
- ||
- (registraTracciaRisposta && transaction.getTracciaRisposta()!=null)
- )
- ){
- initTracciamento(this.tipoDatabaseRuntime, this.usePdDConnection);
- }
-
- if( registraTracciaRichiesta && transaction.getTracciaRichiesta()!=null){
- if(times!=null) {
- timeStart = DateManager.getTimeMillis();
- }
- if(transaction.getTracciaRichiesta().isStored()) {
- if(this.debug)
- this.logDebug("["+idTransazione+"] registrazione traccia richiesta skipped");
- }
- else {
- if(this.debug)
- this.logDebug("["+idTransazione+"] registrazione traccia richiesta...");
- /**System.out.println("["+this.fase+"]["+transazioneDTO.getIdTransazione()+"]["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] INSERT TRACCIA RICHIESTA");*/
- this.tracciamentoOpenSPCoopAppender.log(connection, transaction.getTracciaRichiesta());
- if(this.debug)
- this.logDebug("["+idTransazione+"] registrazione traccia richiesta completata");
- if(autoCommit) {
- transaction.getTracciaRichiesta().setStored(true);
- }
- else {
- tracceSalvate.add(transaction.getTracciaRichiesta());
- }
- }
- }
- if( registraTracciaRisposta && transaction.getTracciaRisposta()!=null){
- if(times!=null && timeStart==-1) {
- timeStart = DateManager.getTimeMillis();
- }
- if(transaction.getTracciaRisposta().isStored()) {
- if(this.debug)
- this.logDebug("["+idTransazione+"] registrazione traccia richiesta skipped");
- }
- else {
- if(this.debug)
- this.logDebug("["+idTransazione+"] registrazione traccia risposta...");
- /**System.out.println("["+this.fase+"]["+transazioneDTO.getIdTransazione()+"]["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] INSERT TRACCIA RISPOSTA");*/
- this.tracciamentoOpenSPCoopAppender.log(connection, transaction.getTracciaRisposta());
- if(this.debug)
- this.logDebug("["+idTransazione+"] registrazione traccia risposta completata");
- if(autoCommit) {
- transaction.getTracciaRisposta().setStored(true);
- }
- else {
- tracceSalvate.add(transaction.getTracciaRisposta());
- }
- }
- }
- }finally {
- if(times!=null && timeStart>0) {
- long timeEnd = DateManager.getTimeMillis();
- long timeProcess = timeEnd-timeStart;
- times.insertTrace = timeProcess;
- }
- }
-
-
-
-
- /* ---- Inserimento messaggi diagnostici ----- */
-
- List<MsgDiagnostico> diagnosticiSalvati = new ArrayList<>();
- try {
- timeStart = -1;
- if(registrazioneMessaggiDiagnostici){
-
- if(!FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
- initDiagnostica(this.tipoDatabaseRuntime, this.usePdDConnection);
- }
-
- if(times!=null && transaction!=null && transaction.sizeMsgDiagnostici()>0) {
- timeStart = DateManager.getTimeMillis();
- }
- for(int i=0; i<transaction.sizeMsgDiagnostici(); i++){
- MsgDiagnostico msgDiagnostico = transaction.getMsgDiagnostico(i);
- if(msgDiagnostico.isStored()) {
- if(this.debug)
- this.logDebug("["+idTransazione+"] registrazione diagnostico con codice ["+msgDiagnostico.getCodice()+"] skipped");
- continue;
- }
- if(msgDiagnostico.getIdSoggetto()==null){
- msgDiagnostico.setIdSoggetto(idDominio);
- }
- if(this.debug)
- this.logDebug("["+idTransazione+"] registrazione diagnostico con codice ["+msgDiagnostico.getCodice()+"] ...");
- /**System.out.println("["+this.fase+"]["+transazioneDTO.getIdTransazione()+"]["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] INSERT DIAG ["+msgDiagnostico.getCodice()+"]");*/
- this.msgDiagnosticiOpenSPCoopAppender.log(connection,msgDiagnostico);
- if(this.debug)
- this.logDebug("["+idTransazione+"] registrazione diagnostico con codice ["+msgDiagnostico.getCodice()+"] completata");
- if(autoCommit) {
- msgDiagnostico.setStored(true);
- }
- else {
- diagnosticiSalvati.add(msgDiagnostico);
- }
- }
- }
- }finally {
- if(times!=null && timeStart>0) {
- long timeEnd = DateManager.getTimeMillis();
- long timeProcess = timeEnd-timeStart;
- times.insertDiagnostics = timeProcess;
- }
- }
-
-
-
-
-
-
- /* ---- Inserimento dump ----- */
-
- List<Messaggio> messaggiSalvati = new ArrayList<>();
- try {
- timeStart = -1;
- if(times!=null && transaction!=null && transaction.sizeMessaggi()>0) {
- timeStart = DateManager.getTimeMillis();
- }
- for(int i=0; i<transaction.sizeMessaggi(); i++){
- Messaggio messaggio = transaction.getMessaggio(i);
- if(messaggio.isStored()) {
- if(this.debug)
- this.logDebug("["+idTransazione+"] registrazione messaggio di tipo ["+messaggio.getTipoMessaggio()+"] skipped");
- continue;
- }
- try {
- if(!FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
- initDump(this.tipoDatabaseRuntime, this.usePdDConnection);
- }
-
- if(messaggio.getProtocollo()==null) {
- messaggio.setProtocollo(transazioneDTO.getProtocollo());
- }
- if(messaggio.getDominio()==null) {
- messaggio.setDominio(idDominio);
- }
- if(messaggio.getTipoPdD()==null) {
- messaggio.setTipoPdD(info.getTipoPorta());
- }
- if(messaggio.getIdFunzione()==null) {
- messaggio.setIdFunzione(modulo);
- }
- if(messaggio.getIdBusta()==null &&
- info.getProtocollo()!=null) {
- messaggio.setIdBusta(info.getProtocollo().getIdRichiesta());
- }
- if(messaggio.getFruitore()==null &&
- info.getProtocollo()!=null) {
- messaggio.setFruitore(info.getProtocollo().getFruitore());
- }
- if(messaggio.getServizio()==null &&
- info.getProtocollo()!=null) {
- IDServizio idServizio = IDServizioFactory.getInstance().
- getIDServizioFromValuesWithoutCheck(info.getProtocollo().getTipoServizio(),
- info.getProtocollo().getServizio(),
- info.getProtocollo().getErogatore()!=null ? info.getProtocollo().getErogatore().getTipo() : null,
- info.getProtocollo().getErogatore()!=null ? info.getProtocollo().getErogatore().getNome() : null,
- info.getProtocollo().getVersioneServizio()!=null ? info.getProtocollo().getVersioneServizio() : -1);
- messaggio.setServizio(idServizio);
- }
- if(this.debug)
- this.logDebug("["+idTransazione+"] registrazione messaggio di tipo ["+messaggio.getTipoMessaggio()+"] ...");
- /**System.out.println("["+this.fase+"]["+transazioneDTO.getIdTransazione()+"]["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] INSERT MESSAGGIO ["+messaggio.getTipoMessaggio()+"]");*/
- this.dumpOpenSPCoopAppender.dump(connection,messaggio,this.transazioniRegistrazioneDumpHeadersCompactEnabled);
- if(this.debug)
- this.logDebug("["+idTransazione+"] registrazione messaggio di tipo ["+messaggio.getTipoMessaggio()+"] completata");
- if(autoCommit) {
- messaggio.setStored(true);
- }
- else {
- messaggiSalvati.add(messaggio);
- }
- }finally {
- try {
- if(messaggio.getBody()!=null) {
- messaggio.getBody().unlock();
- messaggio.getBody().clearResources();
- }
- }catch(Exception t){
- this.logError("["+idTransazione+"] errore durante il rilascio delle risorse del messaggio: "+t.getMessage(),t);
- }
- }
- }
- }finally {
- if(times!=null && timeStart>0) {
- long timeEnd = DateManager.getTimeMillis();
- long timeProcess = timeEnd-timeStart;
- times.insertContents = timeProcess;
- }
- }
-
-
-
- /* ---- Inserimento risorse contenuti (library personalizzata) ----- */
-
- if(registrazioneRisorse){
- /**System.out.println("["+this.fase+"]["+transazioneDTO.getIdTransazione()+"]["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] RISORSE");*/
- try {
- if(times!=null) {
- timeStart = DateManager.getTimeMillis();
- }
- IDumpMessaggioService dumpMessageService = jdbcServiceManager.getDumpMessaggioService();
- ContenutiUtilities contenutiUtilities = new ContenutiUtilities(this.log);
- contenutiUtilities.insertContenuti(transazioneDTO,
- transaction.getTracciaRichiesta(), transaction.getTracciaRisposta(),
- transaction.getMsgDiagnostici(),
- dumpMessageService, transaction.getRisorse(), transaction.getTransactionServiceLibrary(), this.daoFactory);
- }finally {
- if(times!=null) {
- long timeEnd = DateManager.getTimeMillis();
- long timeProcess = timeEnd-timeStart;
- times.insertResources = timeProcess;
- }
- }
- }
-
-
- String hdrTest = this.openspcoopProperties.getTransazioniTestsuiteManuallyFaultHeaderDBBeforeCommit();
- if(hdrTest!=null && requestInfo!=null && requestInfo.getProtocolContext()!=null && requestInfo.getProtocolContext().getHeaderFirstValue(hdrTest)!=null &&
- this.fase.name().equals(requestInfo.getProtocolContext().getHeaderFirstValue(hdrTest))) {
- throw new CoreException("Test Manually Exception generated in phase '"+this.fase+"'");
- }
-
-
- // COMMIT
- if(!autoCommit) {
- try {
- if(times!=null) {
- timeStart = DateManager.getTimeMillis();
- }
- connection.commit();
-
- if(!tracceSalvate.isEmpty()) {
- for (Traccia traccia : tracceSalvate) {
- traccia.setStored(true);
- }
- }
- if(!diagnosticiSalvati.isEmpty()) {
- for (MsgDiagnostico msgDiagnostico : diagnosticiSalvati) {
- msgDiagnostico.setStored(true);
- }
- }
- if(!messaggiSalvati.isEmpty()) {
- for (Messaggio messaggio : messaggiSalvati) {
- messaggio.setStored(true);
- }
- }
-
- }finally {
- if(times!=null) {
- long timeEnd = DateManager.getTimeMillis();
- long timeProcess = timeEnd-timeStart;
- times.commit = timeProcess;
- }
- }
- }
-
-
- // DOPO COMMIT RIUSCITO
- if(!autoCommit && insertTransazione &&
- !FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)){
- addTransactionAlreadyRegistered(info);
- }
-
-
- } catch (SQLException sqlEx) {
- errore = true;
- try{
- if(!autoCommit &&
- connection!=null) {
- connection.rollback();
- }
- }catch(Exception eRollback){
- // ignore
- }
- // Effettuo il log anche nel core per evitare che un eventuale filtro a OFF sul core della PdD eviti la scrittura di questi errori
- String msg = "Errore durante la scrittura della transazione sul database (sql): " + sqlEx.getLocalizedMessage();
- this.logError("["+idTransazione+"] "+msg,sqlEx);
- if(!FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)){
- logRegistrazioneNonRiuscita(msgdiagErrore, false, sqlEx, idTransazione,
- null, null, null);
- }
- HandlerException errorDB = new HandlerException(msg,sqlEx);
- addTrackingException(info, errorDB);
- if(dbEnabledBloccante) {
- throw errorDB;
- }
- } catch (Exception e) {
- errore = true;
- try{
- if(!autoCommit &&
- connection!=null) {
- connection.rollback();
- }
- }catch(Exception eRollback){
- // ignore
- }
- // Effettuo il log anche nel core per evitare che un eventuale filtro a OFF sul core della PdD eviti la scrittura di questi errori
- String msg = "Errore durante la scrittura della transazione sul database: " + e.getLocalizedMessage();
- this.logError("["+idTransazione+"] "+msg,e);
- if(!FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)){
- logRegistrazioneNonRiuscita(msgdiagErrore, false, e, idTransazione,
- null, null, null);
- }
- HandlerException errorDB = new HandlerException(msg,e);
- addTrackingException(info, errorDB);
- if(dbEnabledBloccante) {
- throw errorDB;
- }
- } finally {
-
- // Ripristino Autocomit
- try {
- if(!autoCommit &&
- connection!=null) {
- connection.setAutoCommit(true);
- }
- } catch (Exception e) {
- // ignore
- }
-
- // Chiusura della connessione al database
- try {
- if(resource!=null)
- dbManager.releaseResource(idDominio, modulo, resource);
- } catch (Exception e) {
- // ignore
- }
-
- // Registrazione su FileSystem informazioni se la gestione e' andata in errore
- if(errore && FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)){
-
- try {
- exceptionSerializerFileSystem.registrazioneFileSystemDiagnosticiTracceDumpEmessiPdD(transaction, idTransazione, transazioneDTO,
- registraTracciaRichiesta, registraTracciaRisposta, registrazioneMessaggiDiagnostici, registrazioneDumpMessaggi);
- } catch (Exception e) {
- // ignore
- }
- try {
- exceptionSerializerFileSystem.registrazioneFileSystem(transazioneDTO, idTransazione);
- } catch (Exception e) {
- // ignore
- }
- }
-
- }
-
- }finally{
- this.releaseResourcesEngine(transaction, idTransazione, info);
-
- }
-
-
- if(fileTraceException!=null) {
- throw fileTraceException;
- }
- }
- private ConfigurazioneTracciamento getConfigurazioneTracciamento(String idTransazione, Context context, TipoPdD tipoPorta, Transaction transaction){
-
- if(context!=null) {
- // nop
- }
-
- ConfigurazioneTracciamento configurazioneTracciamento = null;
- try {
- if(transaction!=null && transaction.getRequestInfo()!=null &&
- transaction.getRequestInfo().getProtocolContext()!=null &&
- transaction.getRequestInfo().getProtocolContext().getInterfaceName()!=null) {
- switch (tipoPorta) {
- case DELEGATA:
- IDPortaDelegata idPD = new IDPortaDelegata();
- idPD.setNome(transaction.getRequestInfo().getProtocolContext().getInterfaceName());
- PortaDelegata pd = this.configPdDManager.getPortaDelegataSafeMethod(idPD, transaction.getRequestInfo());
- configurazioneTracciamento = new ConfigurazioneTracciamento(this.log, this.configPdDManager, pd);
- break;
- case APPLICATIVA:
- IDPortaApplicativa idPA = new IDPortaApplicativa();
- idPA.setNome(transaction.getRequestInfo().getProtocolContext().getInterfaceName());
- PortaApplicativa pa = this.configPdDManager.getPortaApplicativaSafeMethod(idPA, transaction.getRequestInfo());
- configurazioneTracciamento = new ConfigurazioneTracciamento(this.log, this.configPdDManager, pa);
- break;
- default:
- break;
- }
- }
- if(configurazioneTracciamento==null) {
- configurazioneTracciamento = new ConfigurazioneTracciamento(this.log, this.configPdDManager,tipoPorta);
- }
- }catch(Exception e) {
- this.logDebug("["+idTransazione+"] Errore avvenuto durante la lettura della configurazione del tracciamento: "+e.getMessage(),e);
- }
- return configurazioneTracciamento;
- }
-
- private void releaseResourcesEngine(Transaction transactionParam, String idTransazione, InformazioniTransazione info) {
-
- if(!FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
- return;
- }
-
- if(transactionParam!=null) {
- // nop
- }
-
- Transaction transaction = null;
- try {
- transaction = TransactionContext.removeTransaction(idTransazione);
- if(transaction!=null) {
- transaction.setDeleted();
- }
- // altrimenti e' gia' stata eliminata
- } catch (Exception e) {
- this.logError("["+idTransazione+"] Errore durante la rimozione della registrazione delle transazione",e);
- }
-
- /* ---- Elimino informazione per filtro duplicati ----- */
- if(info!=null && info.getProtocollo()!=null){
- // Aggiunto check Applicativa e Delegata per evitare che comunicazioni dove i due domini sono entrambi gestiti sul solito GovWay si eliminano a vicenda gli id.
- if(TipoPdD.APPLICATIVA.equals(info.getTipoPorta()) && info.getProtocollo().getIdRichiesta()!=null){
- try {
- TransactionContext.removeIdentificativoProtocollo(info.getProtocollo().getIdRichiesta());
- } catch (Exception e) {
- this.logError("["+idTransazione+"] Errore durante la rimozione della registrazione dell'identificativo di protocollo della richiesta ["+info.getProtocollo().getIdRichiesta()+"]",e);
- }
- }
- if(TipoPdD.DELEGATA.equals(info.getTipoPorta()) && info.getProtocollo().getIdRisposta()!=null){
- try {
- TransactionContext.removeIdentificativoProtocollo(info.getProtocollo().getIdRisposta());
- } catch (Exception e) {
- this.logError("["+idTransazione+"] Errore durante la rimozione della registrazione dell'identificativo di protocollo della risposta ["+info.getProtocollo().getIdRisposta()+"]",e);
- }
- }
- }
-
- }
-
- private HandlerException logWithFileTrace(File fileTraceConfig, boolean fileTraceConfigGlobal,
- TransazioniProcessTimes times,
- Transazione transazioneDTO, Transaction transaction, EsitoTransazione esito,
- InformazioniToken informazioniToken,
- InformazioniAttributi informazioniAttributi,
- InformazioniNegoziazioneToken informazioniNegoziazioneToken,
- SecurityToken securityToken,
- InformazioniTransazione info,
- java.util.Map<String, List<String>> headerInUscita,
- RequestInfo requestInfo,
- String idTransazione,
- boolean fileTraceEnabledBloccante,
- org.openspcoop2.pdd.logger.MsgDiagnostico msgdiagErrore,
- boolean existsAnotherFiletraceTrackingPhase) {
- FileTraceManager fileTraceManager = null;
- long timeStart = -1;
- try {
- if(times!=null) {
- timeStart = DateManager.getTimeMillis();
- }
- FileTraceConfig config = FileTraceConfig.getConfig(fileTraceConfig, fileTraceConfigGlobal);
- fileTraceManager = new FileTraceManager(this.log, config);
- fileTraceManager.buildTransazioneInfo(info.getProtocolFactory(), transazioneDTO, transaction,
- informazioniToken,
- informazioniAttributi,
- informazioniNegoziazioneToken,
- securityToken,
- info.getContext(),
- headerInUscita,
- this.fase);
-
- String hdrTest = this.openspcoopProperties.getTransazioniTestsuiteManuallyFaultHeaderFileTraceBeforeLog();
- if(hdrTest!=null && requestInfo!=null && requestInfo.getProtocolContext()!=null && requestInfo.getProtocolContext().getHeaderFirstValue(hdrTest)!=null &&
- this.fase.name().equals(requestInfo.getProtocolContext().getHeaderFirstValue(hdrTest))) {
- throw new CoreException("Test Manually Exception generated (fileTrace) in phase '"+this.fase+"'");
- }
-
- fileTraceManager.invoke(info.getTipoPorta(),
- info.getContext(), requestInfo, TransazioneUtilities.convertToBusta(transazioneDTO),
- this.fase);
-
- }catch (Throwable e) {
- String error = "["+idTransazione+"] File trace fallito: "+e.getMessage();
- this.logError(error,e);
- BooleanNullable changeEsito = BooleanNullable.NULL();
- StringBuilder errorLog = new StringBuilder();
- logRegistrazioneNonRiuscita(msgdiagErrore, true, e, idTransazione,
- transaction, changeEsito, errorLog);
- if(changeEsito.getValue()!=null && changeEsito.getValue().booleanValue()) {
- esito = ServicesUtils.updateEsitoConAnomalie(esito, this.log, info.getProtocolFactory());
- transazioneDTO.setEsito(esito.getCode());
- if(transazioneDTO.getErrorLog()==null) {
- transazioneDTO.setErrorLog(errorLog.toString());
- }
- }
- if(fileTraceEnabledBloccante) {
- return new HandlerException(error,e);
- }
- }finally {
- try {
- if(!existsAnotherFiletraceTrackingPhase && fileTraceManager!=null) {
- fileTraceManager.cleanResourcesForOnlyFileTrace(transaction);
- }
- }catch(Exception eClean) {
- this.logError("["+idTransazione+"] File trace 'clean' fallito: "+eClean.getMessage(),eClean);
- }
- if(times!=null) {
- long timeEnd = DateManager.getTimeMillis();
- long timeProcess = timeEnd-timeStart;
- times.fileTrace = timeProcess;
- }
- }
-
- return null;
- }
-
-
- private static final MapKey<String> TRACKING_EXCEPTION = org.openspcoop2.utils.Map.newMapKey("TRACKING_EXCEPTION");
- private static final MapKey<String> TRACKING_EXCEPTION_PHASE = org.openspcoop2.utils.Map.newMapKey("TRACKING_EXCEPTION_PHASE");
- private void throwTrackingExceptionIfExists(InformazioniTransazione info) throws HandlerException {
- if(info!=null && info.getContext()!=null && info.getContext().containsKey(TRACKING_EXCEPTION)) {
- HandlerException e = (HandlerException) info.getContext().get(TRACKING_EXCEPTION);
- FaseTracciamento faseExc = (FaseTracciamento) info.getContext().get(TRACKING_EXCEPTION_PHASE);
- String label = null;
- if(FaseTracciamento.IN_REQUEST.equals(faseExc)) {
- label = CostantiLabel.LABEL_CONFIGURAZIONE_AVANZATA_REQ_IN;
- }
- else if(FaseTracciamento.OUT_REQUEST.equals(faseExc)) {
- label = CostantiLabel.LABEL_CONFIGURAZIONE_AVANZATA_REQ_OUT;
- }
- else {
- label = CostantiLabel.LABEL_CONFIGURAZIONE_AVANZATA_RES_OUT;
- }
- throw new HandlerException("database rilevato non disponibile nella fase '"+label+"': "+e.getMessage(),e);
- }
- }
- private void addTrackingException(InformazioniTransazione info, HandlerException e) {
- if(info!=null && info.getContext()!=null && !info.getContext().containsKey(TRACKING_EXCEPTION)) {
- boolean add = false;
- if (
- (
- (
- FaseTracciamento.OUT_REQUEST.equals(this.fase)
- )
- &&
- (
- this.openspcoopProperties.isTransazioniTracciamentoDBOutRequestThrowRequestException()
- )
- )
- ||
- (
- (
- FaseTracciamento.IN_REQUEST.equals(this.fase) ||
- FaseTracciamento.OUT_REQUEST.equals(this.fase)
- )
- &&
- (
- this.openspcoopProperties.isTransazioniTracciamentoDBOutResponseThrowRequestException()
- ||
- this.openspcoopProperties.isTransazioniTracciamentoDBPostOutResponseThrowRequestException()
- )
- )
- ||
- (
- (
- FaseTracciamento.OUT_RESPONSE.equals(this.fase)
- )
- &&
- (
- this.openspcoopProperties.isTransazioniTracciamentoDBPostOutResponseThrowResponseException()
- )
- )
- ){
- add = true;
- }
- if(add) {
- info.getContext().put(TRACKING_EXCEPTION, e);
- info.getContext().put(TRACKING_EXCEPTION_PHASE, this.fase);
- }
- }
- }
-
-
- private static final MapKey<String> TRANSACTION_REGISTERED = org.openspcoop2.utils.Map.newMapKey("TRANSACTION_REGISTERED");
- private boolean isTransactionAlreadyRegistered(InformazioniTransazione info) {
- return info!=null && info.getContext()!=null && info.getContext().containsKey(TRANSACTION_REGISTERED);
- }
- private void addTransactionAlreadyRegistered(InformazioniTransazione info) {
- if(info!=null && info.getContext()!=null) {
- info.getContext().put(TRANSACTION_REGISTERED, "true");
- }
- }
- private boolean registraTransazione(Transazione transazioneDTO,
- ITransazioneService transazioneService, InformazioniTransazione info,
- boolean autoCommit, boolean registraTracciaRichiestaInfoTransazione, boolean registraTracciaRispostaInfoTransazione) throws ServiceException, NotImplementedException, NotFoundException, ExpressionNotImplementedException, ExpressionException {
- if(FaseTracciamento.IN_REQUEST.equals(this.fase)
- ||
- !isTransactionAlreadyRegistered(info)) {
- /**System.out.println("["+this.fase+"]["+transazioneDTO.getIdTransazione()+"]["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] INSERT con contesto["+transazioneDTO.getEsitoContesto()+"]");*/
- transazioneService.create(transazioneDTO);
- /**
- * DEVO AGGIUNGERLO DOPO IL COMMIT */
- if(autoCommit && !FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)){
- addTransactionAlreadyRegistered(info);
- }
- return true;
- }
- else if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) && info.getTransazioneDaAggiornare()!=null){
- /**System.out.println("["+this.fase+"]["+transazioneDTO.getIdTransazione()+"]["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] UPDATE PUNTUALE con contesto["+transazioneDTO.getEsitoContesto()+"]");*/
- List<UpdateField> list = new ArrayList<>();
- list.add(new UpdateField(Transazione.model().ESITO, transazioneDTO.getEsito()));
- list.add(new UpdateField(Transazione.model().ESITO_SINCRONO, transazioneDTO.getEsitoSincrono()));
- list.add(new UpdateField(Transazione.model().ESITO_CONTESTO, transazioneDTO.getEsitoContesto()));
- list.add(new UpdateField(Transazione.model().CONSEGNE_MULTIPLE_IN_CORSO, transazioneDTO.getConsegneMultipleInCorso()));
- list.add(new UpdateField(Transazione.model().CODICE_RISPOSTA_USCITA, transazioneDTO.getCodiceRispostaUscita()));
- list.add(new UpdateField(Transazione.model().EVENTI_GESTIONE, transazioneDTO.getEventiGestione()));
- list.add(new UpdateField(Transazione.model().DATA_USCITA_RISPOSTA, transazioneDTO.getDataUscitaRisposta()));
- list.add(new UpdateField(Transazione.model().DATA_USCITA_RISPOSTA_STREAM, transazioneDTO.getDataUscitaRispostaStream()));
- list.add(new UpdateField(Transazione.model().RISPOSTA_INGRESSO_BYTES, transazioneDTO.getRispostaIngressoBytes()));
- list.add(new UpdateField(Transazione.model().RISPOSTA_USCITA_BYTES, transazioneDTO.getRispostaUscitaBytes()));
- list.add(new UpdateField(Transazione.model().FAULT_INTEGRAZIONE, transazioneDTO.getFaultIntegrazione()));
- list.add(new UpdateField(Transazione.model().FORMATO_FAULT_INTEGRAZIONE, transazioneDTO.getFormatoFaultIntegrazione()));
- list.add(new UpdateField(Transazione.model().FAULT_COOPERAZIONE, transazioneDTO.getFaultCooperazione()));
- list.add(new UpdateField(Transazione.model().FORMATO_FAULT_COOPERAZIONE, transazioneDTO.getFormatoFaultCooperazione()));
- list.add(new UpdateField(Transazione.model().ERROR_LOG, transazioneDTO.getErrorLog()));
- list.add(new UpdateField(Transazione.model().WARNING_LOG, transazioneDTO.getWarningLog()));
-
- // ** dati tracce **
- if(this.salvataggioTracceManager!=null) {
- if(registraTracciaRichiestaInfoTransazione) {
- list.add(new UpdateField(Transazione.model().TRACCIA_RICHIESTA, transazioneDTO.getTracciaRichiesta()));
- }
- if(registraTracciaRispostaInfoTransazione) {
- list.add(new UpdateField(Transazione.model().TRACCIA_RISPOSTA, transazioneDTO.getTracciaRisposta()));
- }
- }
- // ** dati diagnostica **
- if(this.salvataggioDiagnosticiManager!=null){
- list.add(new UpdateField(Transazione.model().DIAGNOSTICI, transazioneDTO.getDiagnostici()));
- list.add(new UpdateField(Transazione.model().DIAGNOSTICI_LIST_1, transazioneDTO.getDiagnosticiList1()));
- list.add(new UpdateField(Transazione.model().DIAGNOSTICI_LIST_2, transazioneDTO.getDiagnosticiList2()));
- list.add(new UpdateField(Transazione.model().DIAGNOSTICI_LIST_EXT, transazioneDTO.getDiagnosticiListExt()));
- list.add(new UpdateField(Transazione.model().DIAGNOSTICI_EXT, transazioneDTO.getDiagnosticiExt()));
- }
-
- boolean isTransazioniUpdateUseDayInterval = this.openspcoopProperties.isTransazioniUpdateUseDayInterval();
- if(isTransazioniUpdateUseDayInterval) {
- IExpression condition = transazioneService.newExpression();
- Date left = DateUtils.convertToLeftInterval(transazioneDTO.getDataIngressoRichiesta(), UnitaTemporale.GIORNALIERO);
- condition.greaterEquals(Transazione.model().DATA_INGRESSO_RICHIESTA, left);
- Date right = DateUtils.convertToRightInterval(transazioneDTO.getDataIngressoRichiesta(), UnitaTemporale.GIORNALIERO);
- condition.lessEquals(Transazione.model().DATA_INGRESSO_RICHIESTA, right);
- transazioneService.updateFields(transazioneDTO.getIdTransazione(), condition, list.toArray(new UpdateField[1]));
- }
- else {
- transazioneService.updateFields(transazioneDTO.getIdTransazione(), list.toArray(new UpdateField[1]));
- }
- return false;
- }
- else {
- /**System.out.println("["+this.fase+"]["+transazioneDTO.getIdTransazione()+"]["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] UPDATE con contesto["+transazioneDTO.getEsitoContesto()+"]");*/
-
- boolean isTransazioniUpdateUseDayInterval = this.openspcoopProperties.isTransazioniUpdateUseDayInterval();
- if(isTransazioniUpdateUseDayInterval) {
- TransazioneDaoExt ext = new TransazioneDaoExt(transazioneDTO);
- ext.setUseDayIntervalForUpdate(true);
- transazioneService.update(transazioneDTO.getIdTransazione(), ext);
- }
- else {
- transazioneService.update(transazioneDTO.getIdTransazione(), transazioneDTO);
- }
- return false;
- }
- }
-
- private void logRegistrazioneNonRiuscita(org.openspcoop2.pdd.logger.MsgDiagnostico msgdiagErrore, boolean fileTrace, Throwable e, String idTransazione,
- Transaction transaction, BooleanNullable changeEsito, StringBuilder sbErrorLog) {
- if(fileTrace || !FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)){
- try {
- msgdiagErrore.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE, e.getMessage());
- msgdiagErrore.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, fileTrace ? "fileTrace" : "database");
- switch (this.fase) {
- case IN_REQUEST:
- msgdiagErrore.addKeyword(CostantiPdD.KEY_FASE_TRACCIAMENTO, CostantiLabel.LABEL_CONFIGURAZIONE_AVANZATA_REQ_IN);
- break;
- case OUT_REQUEST:
- msgdiagErrore.addKeyword(CostantiPdD.KEY_FASE_TRACCIAMENTO, CostantiLabel.LABEL_CONFIGURAZIONE_AVANZATA_REQ_OUT);
- break;
- case OUT_RESPONSE:
- msgdiagErrore.addKeyword(CostantiPdD.KEY_FASE_TRACCIAMENTO, CostantiLabel.LABEL_CONFIGURAZIONE_AVANZATA_RES_OUT);
- break;
- case POST_OUT_RESPONSE:
- msgdiagErrore.addKeyword(CostantiPdD.KEY_FASE_TRACCIAMENTO, CostantiLabel.LABEL_CONFIGURAZIONE_AVANZATA_RES_OUT_COMPLETE);
- break;
- }
- if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) && transaction!=null) {
- // siamo per forza in fileTrace
- msgdiagErrore.addLogPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_TRACCIAMENTO, "registrazioneTransazioneNonRiuscita", transaction, sbErrorLog);
- if(changeEsito!=null) {
- changeEsito.setValue(true);
- }
- }
- else {
- msgdiagErrore.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_TRACCIAMENTO, "registrazioneTransazioneNonRiuscita");
- }
- }catch(Throwable t) {
- String error = "["+idTransazione+"] Registrazione dell'anomalia avvenuta durante il tracciamento non riuscita: "+t.getMessage();
- this.log.error(error,t);
- }
- }
- }
- }