GestoreTransazioniStateful.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.core.transazioni;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.openspcoop2.core.commons.dao.DAOFactory;
import org.openspcoop2.core.config.OpenspcoopAppender;
import org.openspcoop2.core.config.Property;
import org.openspcoop2.core.config.utils.OpenSPCoopAppenderUtilities;
import org.openspcoop2.core.transazioni.Transazione;
import org.openspcoop2.core.transazioni.constants.RuoloTransazione;
import org.openspcoop2.core.transazioni.dao.ITransazioneService;
import org.openspcoop2.generic_project.beans.UpdateField;
import org.openspcoop2.generic_project.exception.NotFoundException;
import org.openspcoop2.generic_project.expression.IPaginatedExpression;
import org.openspcoop2.generic_project.utils.ServiceManagerProperties;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
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.tracciamento.ITracciaProducer;
import org.openspcoop2.protocol.sdk.tracciamento.Traccia;
import org.openspcoop2.protocol.utils.EsitiProperties;
import org.slf4j.Logger;


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

	private Logger log = null;
	private Logger logSql = null;
//	private String datasource = null;
	private String tipoDatabase = null;
	private boolean debug = false;
	
	private ITracciaProducer tracciamentoOpenSPCoopAppender = null;
	private IDiagnosticProducer msgDiagnosticiOpenSPCoopAppender = null;
	private IDumpProducer dumpOpenSPCoopAppender = null;
	private boolean transazioniRegistrazioneDumpHeadersCompactEnabled = false;
	
	public GestoreTransazioniStateful(Logger log,Logger logSql,
			//String dataSource,
			String tipoDatabase,boolean debug) throws Exception{
		
		this.log = log;
		this.logSql = logSql;
		this.tipoDatabase = tipoDatabase;
//		this.datasource = dataSource;
		this.debug = debug;
			
		boolean usePdDConnection = true;
		
		try{
			
			// Init
			this.tracciamentoOpenSPCoopAppender = new org.openspcoop2.pdd.logger.TracciamentoOpenSPCoopProtocolAppender();
			OpenspcoopAppender tracciamentoOpenSPCoopAppender = new OpenspcoopAppender();
			tracciamentoOpenSPCoopAppender.setTipo("__gestoreTransazioniStateful");
			List<Property> tracciamentoOpenSPCoopAppenderProperties = new ArrayList<Property>();

			// Verra poi utilizzata la connessione ottenuta ogni volta che il timer viene eseguito, infatti si usa usePdDConnection
			OpenSPCoopAppenderUtilities.addParameters(this.logSql, tracciamentoOpenSPCoopAppenderProperties, 
					null, // nessun datasource
					null, null, null, null,  // nessuna connection
					this.tipoDatabase,
					usePdDConnection, // viene usata la connessione della PdD 
					this.debug
					);
			OpenSPCoopAppenderUtilities.addCheckProperties(tracciamentoOpenSPCoopAppenderProperties, false);

			tracciamentoOpenSPCoopAppender.setPropertyList(tracciamentoOpenSPCoopAppenderProperties);
			this.tracciamentoOpenSPCoopAppender.initializeAppender(tracciamentoOpenSPCoopAppender);
			this.tracciamentoOpenSPCoopAppender.isAlive();
			
		}catch(Exception e){
			throw new Exception("Errore durante l'inizializzazione del TracciamentoAppender: "+e.getMessage(),e);
		} 
		
		try{
			
			// Init
			this.msgDiagnosticiOpenSPCoopAppender = new org.openspcoop2.pdd.logger.MsgDiagnosticoOpenSPCoopProtocolAppender();
			OpenspcoopAppender diagnosticoOpenSPCoopAppender = new OpenspcoopAppender();
			diagnosticoOpenSPCoopAppender.setTipo("__gestoreTransazioniStateful");
			List<Property> diagnosticoOpenSPCoopAppenderProperties = new ArrayList<Property>();

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

			diagnosticoOpenSPCoopAppender.setPropertyList(diagnosticoOpenSPCoopAppenderProperties);
			this.msgDiagnosticiOpenSPCoopAppender.initializeAppender(diagnosticoOpenSPCoopAppender);
			this.msgDiagnosticiOpenSPCoopAppender.isAlive();
			
		}catch(Exception e){
			throw new Exception("Errore durante l'inizializzazione del DiagnosticoAppender: "+e.getMessage(),e);
		} 
		
		try{
			
			// Init
			this.dumpOpenSPCoopAppender = new org.openspcoop2.pdd.logger.DumpOpenSPCoopProtocolAppender();
			OpenspcoopAppender dumpOpenSPCoopAppender = new OpenspcoopAppender();
			dumpOpenSPCoopAppender.setTipo("__gestoreTransazioniStateful");
			List<Property> dumpOpenSPCoopAppenderProperties = new ArrayList<Property>();

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

			dumpOpenSPCoopAppender.setPropertyList(dumpOpenSPCoopAppenderProperties);
			this.dumpOpenSPCoopAppender.initializeAppender(dumpOpenSPCoopAppender);
			this.dumpOpenSPCoopAppender.isAlive();
			
			// Indicazioni sulle modalita' di salvataggio degli header del dump
			this.transazioniRegistrazioneDumpHeadersCompactEnabled = OpenSPCoop2Properties.getInstance().isTransazioniRegistrazioneDumpHeadersCompactEnabled();
			
		}catch(Exception e){
			throw new Exception("Errore durante l'inizializzazione del DumpAppender: "+e.getMessage(),e);
		} 

	}
	
	
	public void verificaOggettiPresentiRepository(DAOFactory daoFactory,  ServiceManagerProperties daoFactoryServiceManagerPropertiesTransazioni,
			Logger daoFactoryLoggerTransazioni, Connection con) throws Exception{
		
		
		try{
			if(this.debug)
				this.log.debug("\n\n****************************************************************************************************");
			boolean autoCommit = false;
			con.setAutoCommit(autoCommit);
		
			
			org.openspcoop2.core.transazioni.dao.jdbc.JDBCServiceManager jdbcServiceManager =
					(org.openspcoop2.core.transazioni.dao.jdbc.JDBCServiceManager) daoFactory.getServiceManager(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance(), 
							con, autoCommit,
							daoFactoryServiceManagerPropertiesTransazioni, daoFactoryLoggerTransazioni);
			jdbcServiceManager.getJdbcProperties().setShowSql(this.debug);
			ITransazioneService transazioneService = jdbcServiceManager.getTransazioneService();
			
			int size = RepositoryGestioneStateful.size();
			if(this.debug)
				this.log.debug("Trovati "+size+" elementi da gestire");
			while(size>0){
				
				StatefulObject so = RepositoryGestioneStateful.removeObject();
				try{
					
					String type = "";
					if(so.getType()!=null){
						type = so.getType().toString();
					}
					String className = "";
					if(so.getObject()!=null){
						type = so.getObject().getClass().getName();
					}
					String idTransazione = "";
					if(so.getObject()!=null){
						idTransazione = so.getIdTransazione();
					}
					
					if(so.getIdTransazione()==null){
						throw new Exception("Oggetto presente nel repository (Tipo:"+type+")(Class:"+className+") senza associato un id di transazione");
					}
					if(so.getType()==null){
						throw new Exception("Oggetto presente nel repository (ID:"+idTransazione+")(Class:"+className+") senza associato un tipo");
					}
					if(so.getObject()==null){
						throw new Exception("Oggetto presente nel repository (ID:"+idTransazione+")(Tipo:"+type+") senza un valore");
					}
					
					if(this.debug)
						this.log.debug("-------------- "+so.getType().toString()+"/"+so.getObject().getClass().getName()+"/"+so.getIdTransazione()+" --------------");
					
					TransactionDB transactionDB = readTransazione(transazioneService, so.getIdTransazione());
					if(transactionDB==null){
						// Transazione non ancora inserita nel database dal modulo PostOutResponseHandler
						if(this.debug)
							this.log.debug("Transazione non ancora presente, reinserisco nel repository");
						RepositoryGestioneStateful.addObject(so);
						continue;
					}
					
					gestioneStatefulObject(transazioneService, con, so, transactionDB,true);
					
					con.commit();
					if(this.debug)
						this.log.debug("Commit eseguito con successo");
					
				}catch(Exception e){
					try{
						if(this.debug)
							this.log.debug("Errore durante la gestione dell'oggetto (reinserisco nel repository): "+e.getMessage());
						RepositoryGestioneStateful.addObject(so);
						con.rollback();
					}catch(Exception eRollback){}
					throw e;
				}finally{
					size--;
				}
			}
									
			
		}finally{
			try{
				con.setAutoCommit(true);
			}catch(Exception eRollback){
				// ignore
			}
		}
		
	}
	
	public void gestioneStatefulObject(ITransazioneService transazioneService,Connection con,StatefulObject so) throws Exception{
		gestioneStatefulObject(transazioneService, con, so, null,false);
	}
	public void gestioneStatefulObject(ITransazioneService transazioneService,Connection con,StatefulObject so,TransactionDB transactionDB) throws Exception{
		gestioneStatefulObject(transazioneService, con, so, transactionDB,false);
	}
	private void gestioneStatefulObject(ITransazioneService transazioneService,Connection con,StatefulObject so,TransactionDB transactionDB,boolean thread) throws Exception{
		
		String tipoGestione = "[Thread] ";
		if(!thread)
			tipoGestione = "[GestioneDiretta] ";
		
		switch (so.getType()) {
		case MSGDIAGNOSTICO:
			
			this.msgDiagnosticiOpenSPCoopAppender.log(con,(MsgDiagnostico)so.getObject());		
			if(this.debug)
				this.log.debug(tipoGestione+"MsgDiagnostico inserito nel database");
			
			break;
		
		case TRACCIA:
			
			Traccia traccia = (Traccia) so.getObject();
			this.tracciamentoOpenSPCoopAppender.log(con, traccia);
			if(this.debug)
				this.log.debug(tipoGestione+"Traccia ("+traccia.getTipoMessaggio()+") inserita nel database");
			
			break;
			
		case MESSAGGIO:
			
			this.dumpOpenSPCoopAppender.dump(con, (Messaggio)so.getObject(), this.transazioniRegistrazioneDumpHeadersCompactEnabled);		
			if(this.debug)
				this.log.debug(tipoGestione+"DumpMessaggio inserito nel database");
			
			break;
			
//		case DATA_USCITA_RICHIESTA:
//			
//			updateDataUscitaRichiesta(transazioneService, (Date)so.getObject(), so.getIdTransazione());
//			if(this.debug)
//				this.log.debug(tipoGestione+"Informazione sulla data di uscita della richiesta aggiornata");
//			
//			break;
//			
//		case DATA_INGRESSO_RISPOSTA:
//			
//			updateDataIngressoRisposta(transazioneService, (Date)so.getObject(), so.getIdTransazione());
//			if(this.debug)
//				this.log.debug(tipoGestione+"Informazione sulla data di ingresso della risposta aggiornata");
//			
//			break;
//			
//		case DIMENSIONE_USCITA_RICHIESTA:
//			
//			updateDimensioneUscitaRichiesta(transazioneService, (Long)so.getObject(), so.getIdTransazione());
//			if(this.debug)
//				this.log.debug(tipoGestione+"Informazione sulla dimensione di uscita della richiesta aggiornata");
//			
//			break;
//			
//		case DIMENSIONE_INGRESSO_RISPOSTA:
//			
//			updateDimensioneIngressoRisposta(transazioneService, (Long)so.getObject(), so.getIdTransazione());
//			if(this.debug)
//				this.log.debug(tipoGestione+"Informazione sulla dimensione di ingresso della risposta aggiornata");
//			
//			break;
//			
//		case LOCATION:
//			
//			updateLocationConnettore(transazioneService, (String)so.getObject(), so.getIdTransazione());
//			if(this.debug)
//				this.log.debug(tipoGestione+"Informazione sulla location aggiornata");
//			
//			break;
//			
//		case TIPO_CONNETTORE:
//			
//			updateTipoConnettore(transazioneService, (String)so.getObject(), so.getIdTransazione());
//			if(this.debug)
//				this.log.debug(tipoGestione+"Informazione sul tipo di connettore aggiornata");
//			
//			break;
//			
//		case CODICE_TRASPORTO_RICHIESTA:
//			
//			updateCodiceTrasportoRichiesta(transazioneService, (String)so.getObject(), so.getIdTransazione());
//			if(this.debug)
//				this.log.debug(tipoGestione+"Informazione sul codice di trasporto aggiornata");
//			
//			break;
//			
//		case SCENARIO_COOPERAZIONE:
//			
//			updateScenarioDiCooperazione(transazioneService, (String)so.getObject(), so.getIdTransazione());
//			if(this.debug)
//				this.log.debug(tipoGestione+"Informazione sullo scenario di cooperazione aggiornata");
//			
//			break;
			
		case OUT_REQUEST_STATEFUL_OBJECT:
			
			updateOutRequestStatefulObject(transazioneService, (OutRequestStatefulObject)so.getObject(), so.getIdTransazione());
			if(this.debug)
				this.log.debug(tipoGestione+"Informazione emesse dall'out request handler aggiornate");
			
			break;
		
		case IN_RESPONSE_STATEFUL_OBJECT:
			
			updateInResponseStatefulObject(transazioneService, (InResponseStatefulObject)so.getObject(), so.getIdTransazione());
			if(this.debug)
				this.log.debug(tipoGestione+"Informazione emesse dall'in response handler aggiornate");
			
			break;
		}
	}
	
	
	public TransactionDB readTransazione(ITransazioneService transazioneService,String idTransazione) throws Exception{
		
		IPaginatedExpression expression = transazioneService.newPaginatedExpression();
		expression.equals(Transazione.model().ID_TRANSAZIONE, idTransazione);
		
		List<Map<String, Object>> result = null;
		try{
			result = transazioneService.select(expression,
					Transazione.model().PROTOCOLLO,Transazione.model().ESITO, Transazione.model().ESITO_CONTESTO);
			if(result==null || result.size()<=0){
				if(this.debug){
					this.log.debug("Transazione con id ["+idTransazione+"] non trovata");
				}
				return null;
			}
		}catch(NotFoundException notFound){
			if(this.debug){
				this.log.debug("Transazione con id ["+idTransazione+"] non trovata (DriverNotFound): "+notFound.getMessage());
			}
			return null;
		}
		if(result.size()>1){
			if(this.debug){
				this.log.debug("Trovata piu' di una Transazione con id ["+idTransazione+"]");
			}
		}
		Map<String, Object> map = result.remove(0);
		
		TransactionDB tr = new TransactionDB();
		tr.setIdTransazione(idTransazione);
				
		Object oProtocollo = map.get(Transazione.model().PROTOCOLLO.getFieldName());
		if(oProtocollo==null || !(oProtocollo instanceof String) ){
			throw new Exception("Salvata transazione senza protocollo ["+oProtocollo+"]");
		}
		String protocollo = (String) oProtocollo;
		
		Object oEsito = map.get(Transazione.model().ESITO.getFieldName());
		if(oEsito==null || !(oEsito instanceof Integer) ){
			throw new Exception("Salvata transazione senza esito ["+oEsito+"]");
		}
		Integer esito = (Integer) oEsito;
		
		Object oEsitoContesto = map.get(Transazione.model().ESITO_CONTESTO.getFieldName());
		if(oEsitoContesto==null || !(oEsitoContesto instanceof String) ){
			throw new Exception("Salvata transazione senza esito contesto ["+oEsitoContesto+"]");
		}
		String esitoContesto = (String) oEsitoContesto;
		
		tr.setEsitoTransazione(EsitiProperties.getInstanceFromProtocolName(this.log,protocollo).convertToEsitoTransazione(esito, esitoContesto));
		
		if(this.debug){
			this.log.debug("Trovata transazione");
		}
		return tr;
		
	}
	
	
//	private void updateDataUscitaRichiesta(ITransazioneService transazioneService,Date data,String idTransazione) throws Exception{
//		
//		UpdateField updateField = new UpdateField(Transazione.model().DATA_USCITA_RICHIESTA, data);
//		transazioneService.updateFields(idTransazione, updateField);
//		
//	}
//	
//	private void updateDataIngressoRisposta(ITransazioneService transazioneService,Date data,String idTransazione) throws Exception{
//		
//		UpdateField updateField = new UpdateField(Transazione.model().DATA_INGRESSO_RISPOSTA, data);
//		transazioneService.updateFields(idTransazione, updateField);
//		
//	}
//	
//	private void updateDimensioneUscitaRichiesta(ITransazioneService transazioneService,Long dimensione,String idTransazione) throws Exception{
//		
//		UpdateField updateField = new UpdateField(Transazione.model().RICHIESTA_USCITA_BYTES, dimensione);
//		transazioneService.updateFields(idTransazione, updateField);
//	
//	}
//	
//	private void updateDimensioneIngressoRisposta(ITransazioneService transazioneService,Long dimensione,String idTransazione) throws Exception{
//		
//		UpdateField updateField = new UpdateField(Transazione.model().RISPOSTA_INGRESSO_BYTES, dimensione);
//		transazioneService.updateFields(idTransazione, updateField);
//		
//	}
//	
//	private void updateLocationConnettore(ITransazioneService transazioneService,String value,String idTransazione) throws Exception{
//		
//		UpdateField updateField = new UpdateField(Transazione.model().LOCATION_CONNETTORE, value);
//		transazioneService.updateFields(idTransazione, updateField);
//		
//	}
//	
//	private void updateTipoConnettore(ITransazioneService transazioneService,String value,String idTransazione) throws Exception{
//		
//		// TODO leggere le attuali informazioni e aggiornarle
//		
//	}
//	
//	private void updateCodiceTrasportoRichiesta(ITransazioneService transazioneService,String value,String idTransazione) throws Exception{
//		
//		// TODO leggere le attuali informazioni e aggiornarle
//		
//	}
//	
//	
//	private void updateScenarioDiCooperazione(ITransazioneService transazioneService,String value,String idTransazione) throws Exception{
//		
//		UpdateField updateField = new UpdateField(Transazione.model().RUOLO_TRANSAZIONE, value);
//		transazioneService.updateFields(idTransazione, updateField);
//		
//	}
	
	private void updateOutRequestStatefulObject(ITransazioneService transazioneService,OutRequestStatefulObject object,String idTransazione) throws Exception{
		
		List<UpdateField> updateFields = new ArrayList<UpdateField>();
		
		if(object.getDataUscitaRichiesta()!=null){
			UpdateField updateField = new UpdateField(Transazione.model().DATA_USCITA_RICHIESTA, object.getDataUscitaRichiesta());
			updateFields.add(updateField);
		}
					
		RuoloTransazione ruolo = null;
		if(object.getScenarioCooperazione()!=null){
			ruolo = RuoloTransazione.getEnumConstantFromOpenSPCoopValue(object.getScenarioCooperazione());
			UpdateField updateField = new UpdateField(Transazione.model().RUOLO_TRANSAZIONE, ruolo.getValoreAsInt());
			updateFields.add(updateField);
		}
		
		if(object.getLocation()!=null){
			UpdateField updateField = new UpdateField(Transazione.model().LOCATION_CONNETTORE, object.getLocation());
			updateFields.add(updateField);
		}
		
		if(object.getTipoConnettore()!=null){
			// TODO leggere le attuali informazioni e aggiornarle
		}
		
		if(object.getServiziApplicativiErogatore()!=null && object.getServiziApplicativiErogatore().size()>0){
			StringBuilder sa_erogatori = new StringBuilder();
			for (int i=0; i<object.getServiziApplicativiErogatore().size(); i++) {
				if (i>0){
					sa_erogatori.append(",");
				}
				sa_erogatori.append( object.getServiziApplicativiErogatore().get(i) );
			}
			UpdateField updateField = new UpdateField(Transazione.model().SERVIZIO_APPLICATIVO_EROGATORE, sa_erogatori.toString());
			updateFields.add(updateField);
		}
		
		if(object.getEventiGestione()!=null && object.getEventiGestione().size()>0){
			
			StringBuilder bf = new StringBuilder();
			for (String s : object.getEventiGestione()) {
				if(bf.length()>0){
					bf.append(",");
				}
				bf.append(s);
			}
			
			String attuale = null;
			try{
				IPaginatedExpression expression = transazioneService.newPaginatedExpression();
				expression.equals(Transazione.model().ID_TRANSAZIONE, idTransazione);
				List<Object> list = transazioneService.select(expression, Transazione.model().EVENTI_GESTIONE);
				if(list!=null && list.size()>0){
					Object o = list.get(0);
					if(o!=null && o instanceof String){
						attuale = (String) o;
					}
				}
			}catch(NotFoundException notFound){}

			if(attuale!=null){
				attuale = attuale + ",";
				attuale = attuale + bf.toString();
			}
			else{
				attuale = bf.toString();
			}
			
			UpdateField updateField = new UpdateField(Transazione.model().EVENTI_GESTIONE, attuale);
			updateFields.add(updateField);
		}
		
		if(updateFields.size()>0)
			transazioneService.updateFields(idTransazione, updateFields.toArray(new UpdateField[1]));
		
	}
	
	
	private void updateInResponseStatefulObject(ITransazioneService transazioneService,InResponseStatefulObject object,String idTransazione) throws Exception{
		
		List<UpdateField> updateFields = new ArrayList<UpdateField>();
		
		if(object.getDataRichiestaInoltrata()!=null){
			UpdateField updateField = new UpdateField(Transazione.model().DATA_USCITA_RICHIESTA_STREAM, object.getDataRichiestaInoltrata());
			updateFields.add(updateField);
		}
		
		if(object.getDataAccettazioneRisposta()!=null){
			UpdateField updateField = new UpdateField(Transazione.model().DATA_ACCETTAZIONE_RISPOSTA, object.getDataAccettazioneRisposta());
			updateFields.add(updateField);
		}
		
		if(object.getDataIngressoRisposta()!=null){
			UpdateField updateField = new UpdateField(Transazione.model().DATA_INGRESSO_RISPOSTA, object.getDataIngressoRisposta());
			updateFields.add(updateField);
		}
		
		if(object.getDataUscitaRichiesta()!=null){
			UpdateField updateField = new UpdateField(Transazione.model().DATA_USCITA_RICHIESTA, object.getDataUscitaRichiesta());
			updateFields.add(updateField);
		}
		
		if(object.getLocation()!=null){
			UpdateField updateField = new UpdateField(Transazione.model().LOCATION_CONNETTORE, object.getLocation());
			updateFields.add(updateField);
		}
		
		if(object.getReturnCode()!=null){
			// TODO leggere le attuali informazioni e aggiornarle
		}
		
		if(object.getFaultIntegrazione()!=null){
			UpdateField updateField = new UpdateField(Transazione.model().FAULT_INTEGRAZIONE, object.getFaultIntegrazione());
			updateFields.add(updateField);
		}
		
		if(object.getFormatoFaultIntegrazione()!=null){
			UpdateField updateField = new UpdateField(Transazione.model().FORMATO_FAULT_INTEGRAZIONE, object.getFormatoFaultIntegrazione());
			updateFields.add(updateField);
		}
		
		if(object.getFaultCooperazione()!=null){
			UpdateField updateField = new UpdateField(Transazione.model().FAULT_COOPERAZIONE, object.getFaultCooperazione());
			updateFields.add(updateField);
		}
		
		if(object.getFormatoFaultCooperazione()!=null){
			UpdateField updateField = new UpdateField(Transazione.model().FORMATO_FAULT_COOPERAZIONE, object.getFormatoFaultCooperazione());
			updateFields.add(updateField);
		}
		
		if(object.getEventiGestione()!=null && object.getEventiGestione().size()>0){
			
			StringBuilder bf = new StringBuilder();
			for (String s : object.getEventiGestione()) {
				if(bf.length()>0){
					bf.append(",");
				}
				bf.append(s);
			}
			
			String attuale = null;
			try{
				IPaginatedExpression expression = transazioneService.newPaginatedExpression();
				expression.equals(Transazione.model().ID_TRANSAZIONE, idTransazione);
				List<Object> list = transazioneService.select(expression, Transazione.model().EVENTI_GESTIONE);
				if(list!=null && list.size()>0){
					Object o = list.get(0);
					if(o!=null && o instanceof String){
						attuale = (String) o;
					}
				}
			}catch(NotFoundException notFound){}

			if(attuale!=null){
				attuale = attuale + ",";
				attuale = attuale + bf.toString();
			}
			else{
				attuale = bf.toString();
			}
			
			UpdateField updateField = new UpdateField(Transazione.model().EVENTI_GESTIONE, attuale);
			updateFields.add(updateField);
		}
		
		if(updateFields.size()>0)
			transazioneService.updateFields(idTransazione, updateFields.toArray(new UpdateField[1]));
		
	}
	
	
}