GestoreTransazioniStateful.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */
  20. package org.openspcoop2.pdd.core.transazioni;

  21. import java.sql.Connection;
  22. import java.util.ArrayList;
  23. import java.util.List;
  24. import java.util.Map;

  25. import org.openspcoop2.core.commons.dao.DAOFactory;
  26. import org.openspcoop2.core.config.OpenspcoopAppender;
  27. import org.openspcoop2.core.config.Property;
  28. import org.openspcoop2.core.config.utils.OpenSPCoopAppenderUtilities;
  29. import org.openspcoop2.core.transazioni.Transazione;
  30. import org.openspcoop2.core.transazioni.constants.RuoloTransazione;
  31. import org.openspcoop2.core.transazioni.dao.ITransazioneService;
  32. import org.openspcoop2.generic_project.beans.UpdateField;
  33. import org.openspcoop2.generic_project.exception.NotFoundException;
  34. import org.openspcoop2.generic_project.expression.IPaginatedExpression;
  35. import org.openspcoop2.generic_project.utils.ServiceManagerProperties;
  36. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  37. import org.openspcoop2.protocol.sdk.diagnostica.IDiagnosticProducer;
  38. import org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico;
  39. import org.openspcoop2.protocol.sdk.dump.IDumpProducer;
  40. import org.openspcoop2.protocol.sdk.dump.Messaggio;
  41. import org.openspcoop2.protocol.sdk.tracciamento.ITracciaProducer;
  42. import org.openspcoop2.protocol.sdk.tracciamento.Traccia;
  43. import org.openspcoop2.protocol.utils.EsitiProperties;
  44. import org.slf4j.Logger;


  45. /**    
  46.  * GestoreTransazioniStateful
  47.  *
  48.  * @author Poli Andrea (poli@link.it)
  49.  * @author $Author$
  50.  * @version $Rev$, $Date$
  51.  */
  52. public class GestoreTransazioniStateful {

  53.     private Logger log = null;
  54.     private Logger logSql = null;
  55. //  private String datasource = null;
  56.     private String tipoDatabase = null;
  57.     private boolean debug = false;
  58.    
  59.     private ITracciaProducer tracciamentoOpenSPCoopAppender = null;
  60.     private IDiagnosticProducer msgDiagnosticiOpenSPCoopAppender = null;
  61.     private IDumpProducer dumpOpenSPCoopAppender = null;
  62.     private boolean transazioniRegistrazioneDumpHeadersCompactEnabled = false;
  63.    
  64.     public GestoreTransazioniStateful(Logger log,Logger logSql,
  65.             //String dataSource,
  66.             String tipoDatabase,boolean debug) throws Exception{
  67.        
  68.         this.log = log;
  69.         this.logSql = logSql;
  70.         this.tipoDatabase = tipoDatabase;
  71. //      this.datasource = dataSource;
  72.         this.debug = debug;
  73.            
  74.         boolean usePdDConnection = true;
  75.        
  76.         try{
  77.            
  78.             // Init
  79.             this.tracciamentoOpenSPCoopAppender = new org.openspcoop2.pdd.logger.TracciamentoOpenSPCoopProtocolAppender();
  80.             OpenspcoopAppender tracciamentoOpenSPCoopAppender = new OpenspcoopAppender();
  81.             tracciamentoOpenSPCoopAppender.setTipo("__gestoreTransazioniStateful");
  82.             List<Property> tracciamentoOpenSPCoopAppenderProperties = new ArrayList<Property>();

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

  92.             tracciamentoOpenSPCoopAppender.setPropertyList(tracciamentoOpenSPCoopAppenderProperties);
  93.             this.tracciamentoOpenSPCoopAppender.initializeAppender(tracciamentoOpenSPCoopAppender);
  94.             this.tracciamentoOpenSPCoopAppender.isAlive();
  95.            
  96.         }catch(Exception e){
  97.             throw new Exception("Errore durante l'inizializzazione del TracciamentoAppender: "+e.getMessage(),e);
  98.         }
  99.        
  100.         try{
  101.            
  102.             // Init
  103.             this.msgDiagnosticiOpenSPCoopAppender = new org.openspcoop2.pdd.logger.MsgDiagnosticoOpenSPCoopProtocolAppender();
  104.             OpenspcoopAppender diagnosticoOpenSPCoopAppender = new OpenspcoopAppender();
  105.             diagnosticoOpenSPCoopAppender.setTipo("__gestoreTransazioniStateful");
  106.             List<Property> diagnosticoOpenSPCoopAppenderProperties = new ArrayList<Property>();

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

  116.             diagnosticoOpenSPCoopAppender.setPropertyList(diagnosticoOpenSPCoopAppenderProperties);
  117.             this.msgDiagnosticiOpenSPCoopAppender.initializeAppender(diagnosticoOpenSPCoopAppender);
  118.             this.msgDiagnosticiOpenSPCoopAppender.isAlive();
  119.            
  120.         }catch(Exception e){
  121.             throw new Exception("Errore durante l'inizializzazione del DiagnosticoAppender: "+e.getMessage(),e);
  122.         }
  123.        
  124.         try{
  125.            
  126.             // Init
  127.             this.dumpOpenSPCoopAppender = new org.openspcoop2.pdd.logger.DumpOpenSPCoopProtocolAppender();
  128.             OpenspcoopAppender dumpOpenSPCoopAppender = new OpenspcoopAppender();
  129.             dumpOpenSPCoopAppender.setTipo("__gestoreTransazioniStateful");
  130.             List<Property> dumpOpenSPCoopAppenderProperties = new ArrayList<Property>();

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

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

  150.     }
  151.    
  152.    
  153.     public void verificaOggettiPresentiRepository(DAOFactory daoFactory,  ServiceManagerProperties daoFactoryServiceManagerPropertiesTransazioni,
  154.             Logger daoFactoryLoggerTransazioni, Connection con) throws Exception{
  155.        
  156.        
  157.         try{
  158.             if(this.debug)
  159.                 this.log.debug("\n\n****************************************************************************************************");
  160.             boolean autoCommit = false;
  161.             con.setAutoCommit(autoCommit);
  162.        
  163.            
  164.             org.openspcoop2.core.transazioni.dao.jdbc.JDBCServiceManager jdbcServiceManager =
  165.                     (org.openspcoop2.core.transazioni.dao.jdbc.JDBCServiceManager) daoFactory.getServiceManager(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance(),
  166.                             con, autoCommit,
  167.                             daoFactoryServiceManagerPropertiesTransazioni, daoFactoryLoggerTransazioni);
  168.             jdbcServiceManager.getJdbcProperties().setShowSql(this.debug);
  169.             ITransazioneService transazioneService = jdbcServiceManager.getTransazioneService();
  170.            
  171.             int size = RepositoryGestioneStateful.size();
  172.             if(this.debug)
  173.                 this.log.debug("Trovati "+size+" elementi da gestire");
  174.             while(size>0){
  175.                
  176.                 StatefulObject so = RepositoryGestioneStateful.removeObject();
  177.                 try{
  178.                    
  179.                     String type = "";
  180.                     if(so.getType()!=null){
  181.                         type = so.getType().toString();
  182.                     }
  183.                     String className = "";
  184.                     if(so.getObject()!=null){
  185.                         type = so.getObject().getClass().getName();
  186.                     }
  187.                     String idTransazione = "";
  188.                     if(so.getObject()!=null){
  189.                         idTransazione = so.getIdTransazione();
  190.                     }
  191.                    
  192.                     if(so.getIdTransazione()==null){
  193.                         throw new Exception("Oggetto presente nel repository (Tipo:"+type+")(Class:"+className+") senza associato un id di transazione");
  194.                     }
  195.                     if(so.getType()==null){
  196.                         throw new Exception("Oggetto presente nel repository (ID:"+idTransazione+")(Class:"+className+") senza associato un tipo");
  197.                     }
  198.                     if(so.getObject()==null){
  199.                         throw new Exception("Oggetto presente nel repository (ID:"+idTransazione+")(Tipo:"+type+") senza un valore");
  200.                     }
  201.                    
  202.                     if(this.debug)
  203.                         this.log.debug("-------------- "+so.getType().toString()+"/"+so.getObject().getClass().getName()+"/"+so.getIdTransazione()+" --------------");
  204.                    
  205.                     TransactionDB transactionDB = readTransazione(transazioneService, so.getIdTransazione());
  206.                     if(transactionDB==null){
  207.                         // Transazione non ancora inserita nel database dal modulo PostOutResponseHandler
  208.                         if(this.debug)
  209.                             this.log.debug("Transazione non ancora presente, reinserisco nel repository");
  210.                         RepositoryGestioneStateful.addObject(so);
  211.                         continue;
  212.                     }
  213.                    
  214.                     gestioneStatefulObject(transazioneService, con, so, transactionDB,true);
  215.                    
  216.                     con.commit();
  217.                     if(this.debug)
  218.                         this.log.debug("Commit eseguito con successo");
  219.                    
  220.                 }catch(Exception e){
  221.                     try{
  222.                         if(this.debug)
  223.                             this.log.debug("Errore durante la gestione dell'oggetto (reinserisco nel repository): "+e.getMessage());
  224.                         RepositoryGestioneStateful.addObject(so);
  225.                         con.rollback();
  226.                     }catch(Exception eRollback){}
  227.                     throw e;
  228.                 }finally{
  229.                     size--;
  230.                 }
  231.             }
  232.                                    
  233.            
  234.         }finally{
  235.             try{
  236.                 con.setAutoCommit(true);
  237.             }catch(Exception eRollback){
  238.                 // ignore
  239.             }
  240.         }
  241.        
  242.     }
  243.    
  244.     public void gestioneStatefulObject(ITransazioneService transazioneService,Connection con,StatefulObject so) throws Exception{
  245.         gestioneStatefulObject(transazioneService, con, so, null,false);
  246.     }
  247.     public void gestioneStatefulObject(ITransazioneService transazioneService,Connection con,StatefulObject so,TransactionDB transactionDB) throws Exception{
  248.         gestioneStatefulObject(transazioneService, con, so, transactionDB,false);
  249.     }
  250.     private void gestioneStatefulObject(ITransazioneService transazioneService,Connection con,StatefulObject so,TransactionDB transactionDB,boolean thread) throws Exception{
  251.        
  252.         String tipoGestione = "[Thread] ";
  253.         if(!thread)
  254.             tipoGestione = "[GestioneDiretta] ";
  255.        
  256.         switch (so.getType()) {
  257.         case MSGDIAGNOSTICO:
  258.            
  259.             this.msgDiagnosticiOpenSPCoopAppender.log(con,(MsgDiagnostico)so.getObject());      
  260.             if(this.debug)
  261.                 this.log.debug(tipoGestione+"MsgDiagnostico inserito nel database");
  262.            
  263.             break;
  264.        
  265.         case TRACCIA:
  266.            
  267.             Traccia traccia = (Traccia) so.getObject();
  268.             this.tracciamentoOpenSPCoopAppender.log(con, traccia);
  269.             if(this.debug)
  270.                 this.log.debug(tipoGestione+"Traccia ("+traccia.getTipoMessaggio()+") inserita nel database");
  271.            
  272.             break;
  273.            
  274.         case MESSAGGIO:
  275.            
  276.             this.dumpOpenSPCoopAppender.dump(con, (Messaggio)so.getObject(), this.transazioniRegistrazioneDumpHeadersCompactEnabled);      
  277.             if(this.debug)
  278.                 this.log.debug(tipoGestione+"DumpMessaggio inserito nel database");
  279.            
  280.             break;
  281.            
  282. //      case DATA_USCITA_RICHIESTA:
  283. //          
  284. //          updateDataUscitaRichiesta(transazioneService, (Date)so.getObject(), so.getIdTransazione());
  285. //          if(this.debug)
  286. //              this.log.debug(tipoGestione+"Informazione sulla data di uscita della richiesta aggiornata");
  287. //          
  288. //          break;
  289. //          
  290. //      case DATA_INGRESSO_RISPOSTA:
  291. //          
  292. //          updateDataIngressoRisposta(transazioneService, (Date)so.getObject(), so.getIdTransazione());
  293. //          if(this.debug)
  294. //              this.log.debug(tipoGestione+"Informazione sulla data di ingresso della risposta aggiornata");
  295. //          
  296. //          break;
  297. //          
  298. //      case DIMENSIONE_USCITA_RICHIESTA:
  299. //          
  300. //          updateDimensioneUscitaRichiesta(transazioneService, (Long)so.getObject(), so.getIdTransazione());
  301. //          if(this.debug)
  302. //              this.log.debug(tipoGestione+"Informazione sulla dimensione di uscita della richiesta aggiornata");
  303. //          
  304. //          break;
  305. //          
  306. //      case DIMENSIONE_INGRESSO_RISPOSTA:
  307. //          
  308. //          updateDimensioneIngressoRisposta(transazioneService, (Long)so.getObject(), so.getIdTransazione());
  309. //          if(this.debug)
  310. //              this.log.debug(tipoGestione+"Informazione sulla dimensione di ingresso della risposta aggiornata");
  311. //          
  312. //          break;
  313. //          
  314. //      case LOCATION:
  315. //          
  316. //          updateLocationConnettore(transazioneService, (String)so.getObject(), so.getIdTransazione());
  317. //          if(this.debug)
  318. //              this.log.debug(tipoGestione+"Informazione sulla location aggiornata");
  319. //          
  320. //          break;
  321. //          
  322. //      case TIPO_CONNETTORE:
  323. //          
  324. //          updateTipoConnettore(transazioneService, (String)so.getObject(), so.getIdTransazione());
  325. //          if(this.debug)
  326. //              this.log.debug(tipoGestione+"Informazione sul tipo di connettore aggiornata");
  327. //          
  328. //          break;
  329. //          
  330. //      case CODICE_TRASPORTO_RICHIESTA:
  331. //          
  332. //          updateCodiceTrasportoRichiesta(transazioneService, (String)so.getObject(), so.getIdTransazione());
  333. //          if(this.debug)
  334. //              this.log.debug(tipoGestione+"Informazione sul codice di trasporto aggiornata");
  335. //          
  336. //          break;
  337. //          
  338. //      case SCENARIO_COOPERAZIONE:
  339. //          
  340. //          updateScenarioDiCooperazione(transazioneService, (String)so.getObject(), so.getIdTransazione());
  341. //          if(this.debug)
  342. //              this.log.debug(tipoGestione+"Informazione sullo scenario di cooperazione aggiornata");
  343. //          
  344. //          break;
  345.            
  346.         case OUT_REQUEST_STATEFUL_OBJECT:
  347.            
  348.             updateOutRequestStatefulObject(transazioneService, (OutRequestStatefulObject)so.getObject(), so.getIdTransazione());
  349.             if(this.debug)
  350.                 this.log.debug(tipoGestione+"Informazione emesse dall'out request handler aggiornate");
  351.            
  352.             break;
  353.        
  354.         case IN_RESPONSE_STATEFUL_OBJECT:
  355.            
  356.             updateInResponseStatefulObject(transazioneService, (InResponseStatefulObject)so.getObject(), so.getIdTransazione());
  357.             if(this.debug)
  358.                 this.log.debug(tipoGestione+"Informazione emesse dall'in response handler aggiornate");
  359.            
  360.             break;
  361.         }
  362.     }
  363.    
  364.    
  365.     public TransactionDB readTransazione(ITransazioneService transazioneService,String idTransazione) throws Exception{
  366.        
  367.         IPaginatedExpression expression = transazioneService.newPaginatedExpression();
  368.         expression.equals(Transazione.model().ID_TRANSAZIONE, idTransazione);
  369.        
  370.         List<Map<String, Object>> result = null;
  371.         try{
  372.             result = transazioneService.select(expression,
  373.                     Transazione.model().PROTOCOLLO,Transazione.model().ESITO, Transazione.model().ESITO_CONTESTO);
  374.             if(result==null || result.size()<=0){
  375.                 if(this.debug){
  376.                     this.log.debug("Transazione con id ["+idTransazione+"] non trovata");
  377.                 }
  378.                 return null;
  379.             }
  380.         }catch(NotFoundException notFound){
  381.             if(this.debug){
  382.                 this.log.debug("Transazione con id ["+idTransazione+"] non trovata (DriverNotFound): "+notFound.getMessage());
  383.             }
  384.             return null;
  385.         }
  386.         if(result.size()>1){
  387.             if(this.debug){
  388.                 this.log.debug("Trovata piu' di una Transazione con id ["+idTransazione+"]");
  389.             }
  390.         }
  391.         Map<String, Object> map = result.remove(0);
  392.        
  393.         TransactionDB tr = new TransactionDB();
  394.         tr.setIdTransazione(idTransazione);
  395.                
  396.         Object oProtocollo = map.get(Transazione.model().PROTOCOLLO.getFieldName());
  397.         if(oProtocollo==null || !(oProtocollo instanceof String) ){
  398.             throw new Exception("Salvata transazione senza protocollo ["+oProtocollo+"]");
  399.         }
  400.         String protocollo = (String) oProtocollo;
  401.        
  402.         Object oEsito = map.get(Transazione.model().ESITO.getFieldName());
  403.         if(oEsito==null || !(oEsito instanceof Integer) ){
  404.             throw new Exception("Salvata transazione senza esito ["+oEsito+"]");
  405.         }
  406.         Integer esito = (Integer) oEsito;
  407.        
  408.         Object oEsitoContesto = map.get(Transazione.model().ESITO_CONTESTO.getFieldName());
  409.         if(oEsitoContesto==null || !(oEsitoContesto instanceof String) ){
  410.             throw new Exception("Salvata transazione senza esito contesto ["+oEsitoContesto+"]");
  411.         }
  412.         String esitoContesto = (String) oEsitoContesto;
  413.        
  414.         tr.setEsitoTransazione(EsitiProperties.getInstanceFromProtocolName(this.log,protocollo).convertToEsitoTransazione(esito, esitoContesto));
  415.        
  416.         if(this.debug){
  417.             this.log.debug("Trovata transazione");
  418.         }
  419.         return tr;
  420.        
  421.     }
  422.    
  423.    
  424. //  private void updateDataUscitaRichiesta(ITransazioneService transazioneService,Date data,String idTransazione) throws Exception{
  425. //      
  426. //      UpdateField updateField = new UpdateField(Transazione.model().DATA_USCITA_RICHIESTA, data);
  427. //      transazioneService.updateFields(idTransazione, updateField);
  428. //      
  429. //  }
  430. //  
  431. //  private void updateDataIngressoRisposta(ITransazioneService transazioneService,Date data,String idTransazione) throws Exception{
  432. //      
  433. //      UpdateField updateField = new UpdateField(Transazione.model().DATA_INGRESSO_RISPOSTA, data);
  434. //      transazioneService.updateFields(idTransazione, updateField);
  435. //      
  436. //  }
  437. //  
  438. //  private void updateDimensioneUscitaRichiesta(ITransazioneService transazioneService,Long dimensione,String idTransazione) throws Exception{
  439. //      
  440. //      UpdateField updateField = new UpdateField(Transazione.model().RICHIESTA_USCITA_BYTES, dimensione);
  441. //      transazioneService.updateFields(idTransazione, updateField);
  442. //  
  443. //  }
  444. //  
  445. //  private void updateDimensioneIngressoRisposta(ITransazioneService transazioneService,Long dimensione,String idTransazione) throws Exception{
  446. //      
  447. //      UpdateField updateField = new UpdateField(Transazione.model().RISPOSTA_INGRESSO_BYTES, dimensione);
  448. //      transazioneService.updateFields(idTransazione, updateField);
  449. //      
  450. //  }
  451. //  
  452. //  private void updateLocationConnettore(ITransazioneService transazioneService,String value,String idTransazione) throws Exception{
  453. //      
  454. //      UpdateField updateField = new UpdateField(Transazione.model().LOCATION_CONNETTORE, value);
  455. //      transazioneService.updateFields(idTransazione, updateField);
  456. //      
  457. //  }
  458. //  
  459. //  private void updateTipoConnettore(ITransazioneService transazioneService,String value,String idTransazione) throws Exception{
  460. //      
  461. //      // TODO leggere le attuali informazioni e aggiornarle
  462. //      
  463. //  }
  464. //  
  465. //  private void updateCodiceTrasportoRichiesta(ITransazioneService transazioneService,String value,String idTransazione) throws Exception{
  466. //      
  467. //      // TODO leggere le attuali informazioni e aggiornarle
  468. //      
  469. //  }
  470. //  
  471. //  
  472. //  private void updateScenarioDiCooperazione(ITransazioneService transazioneService,String value,String idTransazione) throws Exception{
  473. //      
  474. //      UpdateField updateField = new UpdateField(Transazione.model().RUOLO_TRANSAZIONE, value);
  475. //      transazioneService.updateFields(idTransazione, updateField);
  476. //      
  477. //  }
  478.    
  479.     private void updateOutRequestStatefulObject(ITransazioneService transazioneService,OutRequestStatefulObject object,String idTransazione) throws Exception{
  480.        
  481.         List<UpdateField> updateFields = new ArrayList<UpdateField>();
  482.        
  483.         if(object.getDataUscitaRichiesta()!=null){
  484.             UpdateField updateField = new UpdateField(Transazione.model().DATA_USCITA_RICHIESTA, object.getDataUscitaRichiesta());
  485.             updateFields.add(updateField);
  486.         }
  487.                    
  488.         RuoloTransazione ruolo = null;
  489.         if(object.getScenarioCooperazione()!=null){
  490.             ruolo = RuoloTransazione.getEnumConstantFromOpenSPCoopValue(object.getScenarioCooperazione());
  491.             UpdateField updateField = new UpdateField(Transazione.model().RUOLO_TRANSAZIONE, ruolo.getValoreAsInt());
  492.             updateFields.add(updateField);
  493.         }
  494.        
  495.         if(object.getLocation()!=null){
  496.             UpdateField updateField = new UpdateField(Transazione.model().LOCATION_CONNETTORE, object.getLocation());
  497.             updateFields.add(updateField);
  498.         }
  499.        
  500.         if(object.getTipoConnettore()!=null){
  501.             // TODO leggere le attuali informazioni e aggiornarle
  502.         }
  503.        
  504.         if(object.getServiziApplicativiErogatore()!=null && object.getServiziApplicativiErogatore().size()>0){
  505.             StringBuilder sa_erogatori = new StringBuilder();
  506.             for (int i=0; i<object.getServiziApplicativiErogatore().size(); i++) {
  507.                 if (i>0){
  508.                     sa_erogatori.append(",");
  509.                 }
  510.                 sa_erogatori.append( object.getServiziApplicativiErogatore().get(i) );
  511.             }
  512.             UpdateField updateField = new UpdateField(Transazione.model().SERVIZIO_APPLICATIVO_EROGATORE, sa_erogatori.toString());
  513.             updateFields.add(updateField);
  514.         }
  515.        
  516.         if(object.getEventiGestione()!=null && object.getEventiGestione().size()>0){
  517.            
  518.             StringBuilder bf = new StringBuilder();
  519.             for (String s : object.getEventiGestione()) {
  520.                 if(bf.length()>0){
  521.                     bf.append(",");
  522.                 }
  523.                 bf.append(s);
  524.             }
  525.            
  526.             String attuale = null;
  527.             try{
  528.                 IPaginatedExpression expression = transazioneService.newPaginatedExpression();
  529.                 expression.equals(Transazione.model().ID_TRANSAZIONE, idTransazione);
  530.                 List<Object> list = transazioneService.select(expression, Transazione.model().EVENTI_GESTIONE);
  531.                 if(list!=null && list.size()>0){
  532.                     Object o = list.get(0);
  533.                     if(o!=null && o instanceof String){
  534.                         attuale = (String) o;
  535.                     }
  536.                 }
  537.             }catch(NotFoundException notFound){}

  538.             if(attuale!=null){
  539.                 attuale = attuale + ",";
  540.                 attuale = attuale + bf.toString();
  541.             }
  542.             else{
  543.                 attuale = bf.toString();
  544.             }
  545.            
  546.             UpdateField updateField = new UpdateField(Transazione.model().EVENTI_GESTIONE, attuale);
  547.             updateFields.add(updateField);
  548.         }
  549.        
  550.         if(updateFields.size()>0)
  551.             transazioneService.updateFields(idTransazione, updateFields.toArray(new UpdateField[1]));
  552.        
  553.     }
  554.    
  555.    
  556.     private void updateInResponseStatefulObject(ITransazioneService transazioneService,InResponseStatefulObject object,String idTransazione) throws Exception{
  557.        
  558.         List<UpdateField> updateFields = new ArrayList<UpdateField>();
  559.        
  560.         if(object.getDataRichiestaInoltrata()!=null){
  561.             UpdateField updateField = new UpdateField(Transazione.model().DATA_USCITA_RICHIESTA_STREAM, object.getDataRichiestaInoltrata());
  562.             updateFields.add(updateField);
  563.         }
  564.        
  565.         if(object.getDataAccettazioneRisposta()!=null){
  566.             UpdateField updateField = new UpdateField(Transazione.model().DATA_ACCETTAZIONE_RISPOSTA, object.getDataAccettazioneRisposta());
  567.             updateFields.add(updateField);
  568.         }
  569.        
  570.         if(object.getDataIngressoRisposta()!=null){
  571.             UpdateField updateField = new UpdateField(Transazione.model().DATA_INGRESSO_RISPOSTA, object.getDataIngressoRisposta());
  572.             updateFields.add(updateField);
  573.         }
  574.        
  575.         if(object.getDataUscitaRichiesta()!=null){
  576.             UpdateField updateField = new UpdateField(Transazione.model().DATA_USCITA_RICHIESTA, object.getDataUscitaRichiesta());
  577.             updateFields.add(updateField);
  578.         }
  579.        
  580.         if(object.getLocation()!=null){
  581.             UpdateField updateField = new UpdateField(Transazione.model().LOCATION_CONNETTORE, object.getLocation());
  582.             updateFields.add(updateField);
  583.         }
  584.        
  585.         if(object.getReturnCode()!=null){
  586.             // TODO leggere le attuali informazioni e aggiornarle
  587.         }
  588.        
  589.         if(object.getFaultIntegrazione()!=null){
  590.             UpdateField updateField = new UpdateField(Transazione.model().FAULT_INTEGRAZIONE, object.getFaultIntegrazione());
  591.             updateFields.add(updateField);
  592.         }
  593.        
  594.         if(object.getFormatoFaultIntegrazione()!=null){
  595.             UpdateField updateField = new UpdateField(Transazione.model().FORMATO_FAULT_INTEGRAZIONE, object.getFormatoFaultIntegrazione());
  596.             updateFields.add(updateField);
  597.         }
  598.        
  599.         if(object.getFaultCooperazione()!=null){
  600.             UpdateField updateField = new UpdateField(Transazione.model().FAULT_COOPERAZIONE, object.getFaultCooperazione());
  601.             updateFields.add(updateField);
  602.         }
  603.        
  604.         if(object.getFormatoFaultCooperazione()!=null){
  605.             UpdateField updateField = new UpdateField(Transazione.model().FORMATO_FAULT_COOPERAZIONE, object.getFormatoFaultCooperazione());
  606.             updateFields.add(updateField);
  607.         }
  608.        
  609.         if(object.getEventiGestione()!=null && object.getEventiGestione().size()>0){
  610.            
  611.             StringBuilder bf = new StringBuilder();
  612.             for (String s : object.getEventiGestione()) {
  613.                 if(bf.length()>0){
  614.                     bf.append(",");
  615.                 }
  616.                 bf.append(s);
  617.             }
  618.            
  619.             String attuale = null;
  620.             try{
  621.                 IPaginatedExpression expression = transazioneService.newPaginatedExpression();
  622.                 expression.equals(Transazione.model().ID_TRANSAZIONE, idTransazione);
  623.                 List<Object> list = transazioneService.select(expression, Transazione.model().EVENTI_GESTIONE);
  624.                 if(list!=null && list.size()>0){
  625.                     Object o = list.get(0);
  626.                     if(o!=null && o instanceof String){
  627.                         attuale = (String) o;
  628.                     }
  629.                 }
  630.             }catch(NotFoundException notFound){}

  631.             if(attuale!=null){
  632.                 attuale = attuale + ",";
  633.                 attuale = attuale + bf.toString();
  634.             }
  635.             else{
  636.                 attuale = bf.toString();
  637.             }
  638.            
  639.             UpdateField updateField = new UpdateField(Transazione.model().EVENTI_GESTIONE, attuale);
  640.             updateFields.add(updateField);
  641.         }
  642.        
  643.         if(updateFields.size()>0)
  644.             transazioneService.updateFields(idTransazione, updateFields.toArray(new UpdateField[1]));
  645.        
  646.     }
  647.    
  648.    
  649. }