TransactionDriverMsgDiagnostici.java

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

  20. package org.openspcoop2.pdd.logger;

  21. import java.sql.Connection;
  22. import java.sql.DriverManager;
  23. import java.util.ArrayList;
  24. import java.util.HashMap;
  25. import java.util.List;
  26. import java.util.Map;
  27. import java.util.Properties;

  28. import javax.naming.InitialContext;
  29. import javax.sql.DataSource;

  30. import org.apache.commons.lang.StringUtils;
  31. import org.openspcoop2.core.commons.dao.DAOFactory;
  32. import org.openspcoop2.core.constants.CostantiDB;
  33. import org.openspcoop2.core.transazioni.CredenzialeMittente;
  34. import org.openspcoop2.core.transazioni.Transazione;
  35. import org.openspcoop2.core.transazioni.dao.IDBCredenzialeMittenteServiceSearch;
  36. import org.openspcoop2.core.transazioni.dao.ITransazioneServiceSearch;
  37. import org.openspcoop2.core.transazioni.dao.jdbc.JDBCServiceManager;
  38. import org.openspcoop2.core.transazioni.utils.CredenzialiMittente;
  39. import org.openspcoop2.core.transazioni.utils.ProjectInfo;
  40. import org.openspcoop2.generic_project.beans.IField;
  41. import org.openspcoop2.generic_project.exception.MultipleResultException;
  42. import org.openspcoop2.generic_project.exception.NotFoundException;
  43. import org.openspcoop2.generic_project.exception.NotImplementedException;
  44. import org.openspcoop2.generic_project.exception.ServiceException;
  45. import org.openspcoop2.generic_project.expression.IPaginatedExpression;
  46. import org.openspcoop2.pdd.logger.diagnostica.ConvertitoreCodiceDiagnostici;
  47. import org.openspcoop2.pdd.logger.diagnostica.InformazioniRecordDiagnostici;
  48. import org.openspcoop2.protocol.basic.BasicComponentFactory;
  49. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  50. import org.openspcoop2.protocol.sdk.constants.EsitoTransazioneName;
  51. import org.openspcoop2.protocol.sdk.constants.RuoloMessaggio;
  52. import org.openspcoop2.protocol.sdk.diagnostica.DriverMsgDiagnosticiException;
  53. import org.openspcoop2.protocol.sdk.diagnostica.DriverMsgDiagnosticiNotFoundException;
  54. import org.openspcoop2.protocol.sdk.diagnostica.FiltroRicercaDiagnostici;
  55. import org.openspcoop2.protocol.sdk.diagnostica.FiltroRicercaDiagnosticiConPaginazione;
  56. import org.openspcoop2.protocol.sdk.diagnostica.IDiagnosticDriver;
  57. import org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico;
  58. import org.openspcoop2.protocol.sdk.tracciamento.DriverTracciamentoException;
  59. import org.openspcoop2.protocol.sdk.tracciamento.DriverTracciamentoNotFoundException;
  60. import org.openspcoop2.protocol.sdk.tracciamento.Traccia;
  61. import org.openspcoop2.protocol.utils.EsitiProperties;
  62. import org.openspcoop2.utils.LoggerWrapperFactory;
  63. import org.openspcoop2.utils.TipiDatabase;
  64. import org.openspcoop2.utils.jdbc.JDBCUtilities;
  65. import org.slf4j.Logger;

  66. /**    
  67.  * TransactionDriverMsgDiagnostici
  68.  *
  69.  * @author Poli Andrea (poli@link.it)
  70.  * @author $Author$
  71.  * @version $Rev$, $Date$
  72.  */
  73. public class TransactionDriverMsgDiagnostici implements IDiagnosticDriver {


  74.     @Override
  75.     public IProtocolFactory<?> getProtocolFactory() {
  76.         return null;
  77.     }

  78.     private static final String TIPO_DB_NON_GESTITO = "Tipo database non gestito";

  79.     /**
  80.      * DataSource
  81.      */
  82.     DataSource datasource = null;

  83.     /**
  84.      * Connection
  85.      */
  86.     Connection connection = null;
  87.     boolean connectionOpenViaJDBCInCostructor = false;

  88.     /**
  89.      * SQLQueryObject
  90.      */
  91.     String tipoDatabase = null;

  92.     /** DriverMsgDiagnostici originale */
  93.     DriverMsgDiagnostici driverMsgDiagnostici = null;

  94.     /** DAO Factory */
  95.     DAOFactory daoFactory = null;

  96.     /** Logger utilizzato per info. */
  97.     private Logger log = null;

  98.     public TransactionDriverMsgDiagnostici(String nomeDataSource, String tipoDatabase, Properties prop) throws DriverMsgDiagnosticiException {
  99.         this(nomeDataSource,tipoDatabase,prop,null);
  100.     }

  101.     public TransactionDriverMsgDiagnostici(String nomeDataSource, String tipoDatabase, Properties prop, Logger log) throws DriverMsgDiagnosticiException {
  102.         // Logger
  103.         try {
  104.             if(log==null)
  105.                 this.log = LoggerWrapperFactory.getLogger(org.openspcoop2.protocol.basic.Costanti.LOGANALIZER_DRIVER_DB_LOGGER);
  106.             else
  107.                 this.log = log;
  108.         } catch (Exception e) {
  109.             throw new DriverMsgDiagnosticiException("(ds jndiName) Errore durante l'inizializzazione del logger: "+e.getMessage(),e);
  110.         }

  111.         // Datasource
  112.         try {
  113.             InitialContext initCtx = new InitialContext(prop);
  114.             this.datasource = (DataSource) initCtx.lookup(nomeDataSource);
  115.             if (this.datasource == null)
  116.                 throw new DriverMsgDiagnosticiException ("datasource is null");

  117.             initCtx.close();
  118.         } catch (Exception e) {
  119.             throw new DriverMsgDiagnosticiException("(ds jndiName) Errore durante la ricerca del datasource: "+e.getMessage(),e);
  120.         }

  121.         // ISQLQueryObject
  122.         try {
  123.             if (TipiDatabase.isAMember(tipoDatabase)) {
  124.                 this.tipoDatabase = tipoDatabase;              
  125.             } else {
  126.                 throw new DriverMsgDiagnosticiException(TIPO_DB_NON_GESTITO);
  127.             }
  128.         } catch (Exception e) {
  129.             throw new DriverMsgDiagnosticiException("(ds jndiName) Errore durante la ricerca del SQLQueryObject: "+e.getMessage(),e);
  130.         }

  131.         // Driver msg diagnostici
  132.         try{
  133.             this.driverMsgDiagnostici = new DriverMsgDiagnostici(nomeDataSource, tipoDatabase, prop, log);
  134.         } catch (Exception e) {
  135.             throw new DriverMsgDiagnosticiException("(ds jndiName) Errore durante l'inizializzazione del driver dei messaggi diagnostici: "+e.getMessage(),e);
  136.         }  

  137.         // DAO Factory
  138.         try{
  139.             this.daoFactory = DAOFactory.getInstance(log);
  140.         }catch (Exception e) {
  141.             throw new DriverMsgDiagnosticiException("(ds jndiName) Errore durante l'inizializzazione del dao factory: "+e.getMessage(),e);
  142.         }

  143.     }

  144.     public TransactionDriverMsgDiagnostici(DataSource dataSourceObject, String tipoDatabase) throws DriverMsgDiagnosticiException {
  145.         this(dataSourceObject,tipoDatabase,null);
  146.     }

  147.     public TransactionDriverMsgDiagnostici(DataSource dataSourceObject, String tipoDatabase, Logger log) throws DriverMsgDiagnosticiException {
  148.         // Logger
  149.         try {
  150.             if(log==null)
  151.                 this.log = LoggerWrapperFactory.getLogger(org.openspcoop2.protocol.basic.Costanti.LOGANALIZER_DRIVER_DB_LOGGER);
  152.             else
  153.                 this.log = log;
  154.         } catch (Exception e) {
  155.             throw new DriverMsgDiagnosticiException("(ds) Errore durante l'inizializzazione del logger: "+e.getMessage(),e);
  156.         }

  157.         // Datasource
  158.         try {
  159.             this.datasource = dataSourceObject;
  160.             if (this.datasource == null)
  161.                 throw new DriverMsgDiagnosticiException ("datasource is null");
  162.         } catch (Exception e) {
  163.             throw new DriverMsgDiagnosticiException("(ds) Errore durante la ricerca del datasource: "+e.getMessage(),e);
  164.         }

  165.         // ISQLQueryObject
  166.         try {
  167.             if (TipiDatabase.isAMember(tipoDatabase)) {
  168.                 this.tipoDatabase = tipoDatabase;              
  169.             } else {
  170.                 throw new DriverMsgDiagnosticiException(TIPO_DB_NON_GESTITO);
  171.             }
  172.         } catch (Exception e) {
  173.             throw new DriverMsgDiagnosticiException("(ds) Errore durante la ricerca del SQLQueryObject: "+e.getMessage(),e);
  174.         }

  175.         // Driver msg diagnostici
  176.         try{
  177.             this.driverMsgDiagnostici = new DriverMsgDiagnostici(this.datasource, tipoDatabase, log);
  178.         } catch (Exception e) {
  179.             throw new DriverMsgDiagnosticiException("(ds) Errore durante l'inizializzazione del driver dei messaggi diagnostici: "+e.getMessage(),e);
  180.         }  

  181.         // DAO Factory
  182.         try{
  183.             this.daoFactory = DAOFactory.getInstance(log);
  184.         }catch (Exception e) {
  185.             throw new DriverMsgDiagnosticiException("(ds) Errore durante l'inizializzazione del dao factory: "+e.getMessage(),e);
  186.         }
  187.     }

  188.     public TransactionDriverMsgDiagnostici(Connection connection, String tipoDatabase) throws DriverMsgDiagnosticiException {
  189.         this(connection,tipoDatabase,null);
  190.     }
  191.     public TransactionDriverMsgDiagnostici(Connection connection, String tipoDatabase, Logger log) throws DriverMsgDiagnosticiException {

  192.         // Logger
  193.         try {
  194.             if(log==null)
  195.                 this.log = LoggerWrapperFactory.getLogger(org.openspcoop2.protocol.basic.Costanti.LOGANALIZER_DRIVER_DB_LOGGER);
  196.             else
  197.                 this.log = log;
  198.         } catch (Exception e) {
  199.             throw new DriverMsgDiagnosticiException("(connection) Errore durante l'inizializzazione del logger: "+e.getMessage(),e);
  200.         }

  201.         // connection
  202.         this.connection = connection;

  203.         // ISQLQueryObject
  204.         try {
  205.             if (TipiDatabase.isAMember(tipoDatabase)) {
  206.                 this.tipoDatabase = tipoDatabase;              
  207.             } else {
  208.                 throw new DriverMsgDiagnosticiException(TIPO_DB_NON_GESTITO);
  209.             }
  210.         } catch (Exception e) {
  211.             throw new DriverMsgDiagnosticiException("(connection) Errore durante la ricerca del SQLQueryObject: "+e.getMessage(),e);
  212.         }

  213.         // Driver msg diagnostici
  214.         try{
  215.             this.driverMsgDiagnostici = new DriverMsgDiagnostici(this.connection, tipoDatabase, log);
  216.         } catch (Exception e) {
  217.             throw new DriverMsgDiagnosticiException("(connection) Errore durante l'inizializzazione del driver dei messaggi diagnostici: "+e.getMessage(),e);
  218.         }  

  219.         // DAO Factory
  220.         try{
  221.             this.daoFactory = DAOFactory.getInstance(log);
  222.         }catch (Exception e) {
  223.             throw new DriverMsgDiagnosticiException("(connection) Errore durante l'inizializzazione del dao factory: "+e.getMessage(),e);
  224.         }
  225.     }


  226.     public TransactionDriverMsgDiagnostici(String urlJDBC,String driverJDBC,
  227.             String username,String password, String tipoDatabase) throws DriverMsgDiagnosticiException {
  228.         this(urlJDBC,driverJDBC,username,password,tipoDatabase,null);
  229.     }
  230.     public TransactionDriverMsgDiagnostici(String urlJDBC,String driverJDBC,
  231.             String username,String password, String tipoDatabase, Logger log) throws DriverMsgDiagnosticiException {

  232.         // Logger
  233.         try {
  234.             if(log==null)
  235.                 this.log = LoggerWrapperFactory.getLogger(org.openspcoop2.protocol.basic.Costanti.LOGANALIZER_DRIVER_DB_LOGGER);
  236.             else
  237.                 this.log = log;
  238.         } catch (Exception e) {
  239.             throw new DriverMsgDiagnosticiException("(connection url) Errore durante l'inizializzazione del logger: "+e.getMessage(),e);
  240.         }

  241.         // connection
  242.         try {
  243.             Class.forName(driverJDBC);

  244.             if(username!=null){
  245.                 this.connection = DriverManager.getConnection(urlJDBC,username,password);
  246.             }else{
  247.                 this.connection = DriverManager.getConnection(urlJDBC);
  248.             }
  249.             this.connectionOpenViaJDBCInCostructor = true;

  250.         } catch (Exception e) {
  251.             throw new DriverMsgDiagnosticiException("(connection url) Errore durante l'inizializzazione della connessione...",e);
  252.         }

  253.         // ISQLQueryObject
  254.         try {
  255.             if (TipiDatabase.isAMember(tipoDatabase)) {
  256.                 this.tipoDatabase = tipoDatabase;              
  257.             } else {
  258.                 throw new DriverMsgDiagnosticiException(TIPO_DB_NON_GESTITO);
  259.             }
  260.         } catch (Exception e) {
  261.             throw new DriverMsgDiagnosticiException("(connection url) Errore durante la ricerca del SQLQueryObject: "+e.getMessage(),e);
  262.         }

  263.         // Driver msg diagnostici
  264.         try{
  265.             this.driverMsgDiagnostici = new DriverMsgDiagnostici(this.connection, tipoDatabase, log);
  266.         } catch (Exception e) {
  267.             throw new DriverMsgDiagnosticiException("(connection url) Errore durante l'inizializzazione del driver dei messaggi diagnostici: "+e.getMessage(),e);
  268.         }  

  269.         // DAO Factory
  270.         try{
  271.             this.daoFactory = DAOFactory.getInstance(log);
  272.         }catch (Exception e) {
  273.             throw new DriverMsgDiagnosticiException("(connection url) Errore durante l'inizializzazione del dao factory: "+e.getMessage(),e);
  274.         }
  275.     }






  276.     /* *********** ACCESSI TRAMITE RICERCHE (DIAGNOSTICI) ******* */

  277.     /**
  278.      * Si occupa di ritornare il numero di diagnostici che rispettano il filtro di ricerca
  279.      *
  280.      * @param filtro Filtro di ricerca
  281.      * @return numero di diagnostici che rispettano il filtro di ricerca
  282.      *
  283.      */
  284.     @Override
  285.     public int countMessaggiDiagnostici(FiltroRicercaDiagnostici filtro) throws DriverMsgDiagnosticiException{
  286.        
  287.         String idTransazione = filtro.getIdTransazione();
  288.         if(idTransazione==null) {
  289.             idTransazione = filtro.getProperty(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE);
  290.         }
  291.         if(idTransazione==null){
  292.             throw new DriverMsgDiagnosticiException("Metodo non implementato in questa versione (Identificativo di transazione non fornito)");
  293.         }
  294.         return this.countListaLog(filtro);
  295.        
  296.     }

  297.     /**
  298.      * Si occupa di ritornare i diagnostici che rispettano il filtro di ricerca
  299.      *
  300.      * @param filtro Filtro di ricerca
  301.      * @return diagnostici che rispettano il filtro di ricerca
  302.      *
  303.      */
  304.     @Override
  305.     public List<MsgDiagnostico> getMessaggiDiagnostici(FiltroRicercaDiagnosticiConPaginazione filtro)  
  306.             throws DriverMsgDiagnosticiException, DriverMsgDiagnosticiNotFoundException{

  307.         String idTransazione = filtro.getIdTransazione();
  308.         if(idTransazione==null) {
  309.             idTransazione = filtro.getProperty(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE);
  310.         }
  311.         if(idTransazione==null){
  312.             throw new DriverMsgDiagnosticiException("Metodo non implementato in questa versione (Identificativo di transazione non fornito)");
  313.         }
  314.         List<MsgDiagnostico> list = null;
  315.         try{
  316.             list = this.getListaLog(filtro);
  317.         }catch(DriverMsgDiagnosticiNotFoundException notFound){
  318.             // ignore
  319.         }
  320.         if(list==null || list.isEmpty()){
  321.             throw new DriverMsgDiagnosticiNotFoundException("Diagnostici non trovati che rispettano il filtro di ricerca (Filtro:"+filtro.toString()+")");
  322.         }
  323.         return list;

  324.     }


  325.     /**
  326.      * Si occupa di eliminare i diagnostici che rispettano il filtro di ricerca
  327.      *
  328.      * @param filter Filtro di ricerca
  329.      * @return numero di diagnostici eliminati
  330.      * @throws DriverTracciamentoException
  331.      */
  332.     @Override
  333.     public int deleteMessaggiDiagnostici(FiltroRicercaDiagnostici filter) throws DriverMsgDiagnosticiException{
  334.         throw new DriverMsgDiagnosticiException("Metodo non implementato in questa versione");
  335.     }
  336.    
  337.     private void setPropertiesEngine(List<MsgDiagnostico> listDiagnostici, String idTransazione){
  338.         int index = 1;
  339.         for (MsgDiagnostico msgDiagnostico : listDiagnostici) {
  340.             // set Properties
  341.             if(msgDiagnostico.getProperty(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE)==null){
  342.                 msgDiagnostico.addProperty(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE, idTransazione);
  343.             }
  344.            
  345.             // viene usato un valore negativo per indicare che si tratta di un diagnostico ricostruito (per funzionare dove viene usato org.openspcoop2.protocol.basic.diagnostico.DriverDiagnostico.IDDIAGNOSTICO)
  346.             int id = index * -1;
  347.             int code = 0;
  348.             try{
  349.                 code = Integer.parseInt(msgDiagnostico.getCodice());
  350.                 code = code * -1;
  351.             }catch(Exception e){
  352.                 // ignore
  353.             }
  354.             if(msgDiagnostico.getProperty(org.openspcoop2.protocol.basic.diagnostica.DiagnosticDriver.IDDIAGNOSTICI)==null){
  355.                 if(code<0){
  356.                     msgDiagnostico.addProperty(org.openspcoop2.protocol.basic.diagnostica.DiagnosticDriver.IDDIAGNOSTICI, code+"");
  357.                 }
  358.                 else{
  359.                     msgDiagnostico.addProperty(org.openspcoop2.protocol.basic.diagnostica.DiagnosticDriver.IDDIAGNOSTICI, id+"");
  360.                 }
  361.             }
  362.             index++;
  363.         }
  364.     }










  365.     /* ******* RISORSE INTERNE ********** */

  366.     @Override
  367.     public void close() throws DriverMsgDiagnosticiException {
  368.         try{
  369.             if(this.driverMsgDiagnostici!=null){
  370.                 this.driverMsgDiagnostici.close();
  371.             }
  372.         }finally{
  373.             try{
  374.                 if(this.connectionOpenViaJDBCInCostructor &&
  375.                     this.connection!=null && !this.connection.isClosed()){
  376.                     JDBCUtilities.closeConnection(BasicComponentFactory.getCheckLogger(), this.connection, BasicComponentFactory.isCheckAutocommit(), BasicComponentFactory.isCheckIsClosed());
  377.                 }
  378.             }catch(Exception e){
  379.                 if(this.log!=null) {
  380.                     this.log.error("Close connection failure: "+e.getMessage(),e);
  381.                 }
  382.             }
  383.         }
  384.     }  





  385.     /* **** INTERNAL **** */

  386.     private Connection close(Connection con) {
  387.         try{
  388.             if(con!=null) {
  389.                 JDBCUtilities.closeConnection(BasicComponentFactory.getCheckLogger(), con, BasicComponentFactory.isCheckAutocommit(), BasicComponentFactory.isCheckIsClosed());
  390.                 con = null;
  391.             }
  392.         }catch(Exception e){
  393.             // close
  394.         }
  395.         return con;
  396.     }
  397.     private JDBCServiceManager close(JDBCServiceManager transazioniServiceManager) {
  398.         try{
  399.             if(transazioniServiceManager!=null) {
  400.                 transazioniServiceManager.close();
  401.                 transazioniServiceManager = null;
  402.             }
  403.         }catch(Exception e){
  404.             // ignore
  405.         }
  406.         return transazioniServiceManager;
  407.     }
  408.     private List<Map<String,Object>> selectEsitoProtocollo(ITransazioneServiceSearch transazioneServiceSearch, IPaginatedExpression expression) throws ServiceException, NotImplementedException {
  409.         List<Map<String,Object>> l = null;
  410.         try {
  411.             l = transazioneServiceSearch.select(expression, Transazione.model().ESITO, Transazione.model().PROTOCOLLO);
  412.         }catch(NotFoundException notFound) {
  413.             // ignore
  414.         }
  415.         return l;
  416.     }
  417.    
  418.     public int countListaLog(FiltroRicercaDiagnostici filtro) throws DriverMsgDiagnosticiException{

  419.         String idTransazione = filtro.getIdTransazione();
  420.         if(idTransazione==null) {
  421.             idTransazione = filtro.getProperty(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE);
  422.         }
  423.         if(idTransazione==null){
  424.             throw new DriverMsgDiagnosticiException("Identificativo di transazione non fornito");
  425.         }

  426.         Connection con = null;
  427.         boolean closeConnection = true;
  428.         JDBCServiceManager transazioniServiceManager = null;
  429.         try{
  430.             if(this.connection!=null){
  431.                 con = this.connection;
  432.                 closeConnection = false;
  433.             }else{
  434.                 con = this.datasource.getConnection();
  435.             }
  436.             if(con==null)
  437.                 throw new DriverMsgDiagnosticiException("Connection non ottenuta");

  438.             transazioniServiceManager =
  439.                     (JDBCServiceManager) this.daoFactory.getServiceManager(new ProjectInfo(), con, true);
  440.             if(transazioniServiceManager==null) {
  441.                 throw new DriverMsgDiagnosticiException("transazioniServiceManager is null");
  442.             }

  443.             ITransazioneServiceSearch transazioneServiceSearch = null;
  444.            
  445.            
  446.            
  447.             if(filtro.getApplicativo()!=null && !"".equals(filtro.getApplicativo()) ){
  448.                
  449.                 transazioneServiceSearch = transazioniServiceManager.getTransazioneServiceSearch();
  450.                
  451.                 IPaginatedExpression expression = transazioneServiceSearch.newPaginatedExpression();
  452.                 expression.equals(Transazione.model().ID_TRANSAZIONE, idTransazione);
  453.                 expression.limit(1);
  454.                 List<Map<String,Object>> l = selectEsitoProtocollo(transazioneServiceSearch, expression);
  455.                 if(l!=null && !l.isEmpty()) {
  456.                     Map<String,Object> map = l.remove(0);
  457.                     if(map!=null && !map.isEmpty()) {
  458.                        
  459.                         Object protocolloObj = map.get(Transazione.model().PROTOCOLLO.getFieldName());
  460.                         if(protocolloObj instanceof String) {
  461.                             String protocollo = (String) protocolloObj;
  462.                             Object esitoObj = map.get(Transazione.model().ESITO.getFieldName());
  463.                             if(esitoObj instanceof Integer) {
  464.                                 int esito = (Integer) esitoObj;    
  465.                                
  466.                                 EsitiProperties esitiProperties = EsitiProperties.getInstanceFromProtocolName(this.log, protocollo);
  467.                                 EsitoTransazioneName esitoName = esitiProperties.getEsitoTransazioneName(esito);
  468.                                
  469.                                 if(EsitoTransazioneName.isConsegnaMultipla(esitoName)) {
  470.                                
  471.                                     // per evitare deadlock di connessioni
  472.                                     transazioniServiceManager = close(transazioniServiceManager);
  473.                                     if(closeConnection){
  474.                                         con = close(con);
  475.                                     }
  476.                                    
  477.                                     // Consegna Multipla: saranno diagnostici salvati sicuramente nella tabella, relativamente a consegne con presa in carico
  478.                                     return this.driverMsgDiagnostici.countMessaggiDiagnostici(filtro);
  479.                                
  480.                                 }
  481.                             }
  482.                         }
  483.                        
  484.                     }
  485.                 }
  486.                            
  487.             }
  488.            

  489.             // Informazioni salvataggio diagnostici
  490.             InformazioniRecordDiagnostici informazioniSalvataggioDiagnostici = getInformazioniSalvataggioDiagnostici(transazioniServiceManager, idTransazione, null);

  491.             // per evitare deadlock di connessioni
  492.             transazioniServiceManager = close(transazioniServiceManager);
  493.             if(closeConnection){
  494.                 con = close(con);
  495.             }
  496.            
  497.             // Non vi sono informazioni eventuali sulla simulazione. Provo a recuperarla direttamente
  498.             if(informazioniSalvataggioDiagnostici==null){
  499.                 return this.driverMsgDiagnostici.countMessaggiDiagnostici(filtro);
  500.             }

  501.             // Non erano stata emessi diagnostici per la transazione
  502.             if(!informazioniSalvataggioDiagnostici.isPresenti()){
  503.                 return 0;
  504.             }

  505.             // La traccia era stata interamente salvata nel database delle tracce, poiche' non possedeva tutti i valori ricostruibili automaticamente
  506.             if(!informazioniSalvataggioDiagnostici.isRicostruibili()){
  507.                 return this.driverMsgDiagnostici.countMessaggiDiagnostici(filtro);
  508.             }

  509.            
  510.             int size = informazioniSalvataggioDiagnostici.getDiagnostici().size();
  511.             if(informazioniSalvataggioDiagnostici.getDiagnosticiExt()!=null){
  512.                 size+=informazioniSalvataggioDiagnostici.getDiagnosticiExt().size();
  513.             }
  514.            
  515.             // Vedo se esistono anche dei diagnostici salvati su database (es. gestione stateful).
  516.             // Se esistono, come ordine temporale saranno cmq successivi a quelli simulati.
  517.             int countSalvatiDatabase = this.driverMsgDiagnostici.countMessaggiDiagnostici(filtro);
  518.             if(countSalvatiDatabase>0) {
  519.                 return size+countSalvatiDatabase;
  520.             }
  521.             else {
  522.                 return size;
  523.             }


  524.         }catch(Exception e){
  525.             throw new DriverMsgDiagnosticiException("Riscontrato errore durante la lettura (count) dei dati (Transazione:"+idTransazione+"): "+e.getMessage(),e);
  526.         }finally{
  527.             close(transazioniServiceManager);
  528.             if(closeConnection){
  529.                 close(con);
  530.             }
  531.         }

  532.     }

  533.     private Traccia getTraccia(RuoloMessaggio ruolo, TransactionDriverTracciamento driverTracciamento, Map<String, String> propertiesRicerca) throws DriverTracciamentoException {
  534.         Traccia tr = null;
  535.         try{
  536.             tr = driverTracciamento.getTraccia(ruolo, propertiesRicerca);
  537.         }catch(DriverTracciamentoNotFoundException dNotFound){
  538.             // ignore
  539.         }
  540.         return tr;
  541.     }
  542.    
  543.     private void fillDiagnostici(FiltroRicercaDiagnosticiConPaginazione filter, List<MsgDiagnostico> list) throws DriverMsgDiagnosticiException {
  544.         int offsetOriginal = -1;
  545.         int limitOriginal = -1;
  546.        
  547.         offsetOriginal = filter.getOffset();
  548.         filter.setOffset(0);
  549.            
  550.         limitOriginal = filter.getLimit();
  551.         filter.setLimit(-1);
  552.         try{
  553.            
  554.             List<MsgDiagnostico> listDB = this.driverMsgDiagnostici.getMessaggiDiagnostici(filter);
  555.             if(listDB!=null && !listDB.isEmpty()){
  556.                 list.addAll(listDB);
  557.             }
  558.         }catch(DriverMsgDiagnosticiNotFoundException e){
  559.             // ignore
  560.         }
  561.         finally{
  562.             if(offsetOriginal>=0)
  563.                 filter.setOffset(offsetOriginal);
  564.             if(limitOriginal>0)
  565.                 filter.setLimit(limitOriginal);
  566.         }
  567.     }
  568.    
  569.     private int parseSafe(String v) {
  570.         int code = -1;
  571.         try{
  572.             code = Integer.parseInt(v);
  573.         }catch(Exception e){
  574.             // ignore
  575.         }  
  576.         return code;
  577.     }
  578.    
  579.     private List<MsgDiagnostico> getListaLog(FiltroRicercaDiagnosticiConPaginazione filter)
  580.             throws DriverMsgDiagnosticiNotFoundException,DriverMsgDiagnosticiException {

  581.         String idTransazione = filter.getIdTransazione();
  582.         if(idTransazione==null) {
  583.             idTransazione = filter.getProperty(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE);
  584.         }
  585.         if(idTransazione==null){
  586.             throw new DriverMsgDiagnosticiException("Identificativo di transazione non fornito");
  587.         }
  588.        
  589.         String idDiagnostico = filter.getProperty(org.openspcoop2.protocol.basic.diagnostica.DiagnosticDriver.IDDIAGNOSTICI);
  590.         int positionDiagnosticoRicostruito = -1;
  591.         boolean positionAsCode = false;
  592.         if(idDiagnostico!=null){
  593.             try{
  594.                 int value = Integer.parseInt(idDiagnostico);
  595.                 if(value<0){
  596.                     // diagnostico ricostruito
  597.                     positionDiagnosticoRicostruito = value * -1;
  598.                     positionAsCode = positionDiagnosticoRicostruito >= 1000; // le prime tre cifre 001 vengono tradotte in 1
  599.                 }
  600.             }catch(Exception e){
  601.                 // ignore
  602.             }
  603.         }

  604.         Connection con = null;
  605.         boolean closeConnection = true;
  606.         JDBCServiceManager transazioniServiceManager = null;
  607.         try{
  608.             if(this.connection!=null){
  609.                 con = this.connection;
  610.                 closeConnection = false;
  611.             }else{
  612.                 con = this.datasource.getConnection();
  613.             }
  614.             if(con==null)
  615.                 throw new DriverMsgDiagnosticiException("Connection non ottenuta");

  616.             transazioniServiceManager =
  617.                     (JDBCServiceManager) this.daoFactory.getServiceManager(new ProjectInfo(), con, true);
  618.             if(transazioniServiceManager==null) {
  619.                 throw new DriverMsgDiagnosticiException("transazioniServiceManager is null");
  620.             }

  621.             ITransazioneServiceSearch transazioneServiceSearch = null;
  622.             Transazione transazione = null;
  623.            
  624.             if(filter.getApplicativo()!=null && !"".equals(filter.getApplicativo()) ){
  625.                
  626.                 transazioneServiceSearch = transazioniServiceManager.getTransazioneServiceSearch();
  627.                 transazione = transazioneServiceSearch.get(idTransazione);
  628.                                
  629.                 int esito = transazione.getEsito();
  630.                 EsitiProperties esitiProperties = EsitiProperties.getInstanceFromProtocolName(this.log, transazione.getProtocollo());
  631.                 EsitoTransazioneName esitoName = esitiProperties.getEsitoTransazioneName(esito);
  632.                
  633.                 if(EsitoTransazioneName.isConsegnaMultipla(esitoName)) {
  634.                    
  635.                     // per evitare deadlock di connessioni
  636.                     transazioniServiceManager = close(transazioniServiceManager);
  637.                     if(closeConnection){
  638.                         con = close(con);
  639.                     }
  640.                    
  641.                     // Consegna Multipla: saranno diagnostici salvati sicuramente nella tabella, relativamente a consegne con presa in carico
  642.                     List<MsgDiagnostico> list = this.driverMsgDiagnostici.getMessaggiDiagnostici(filter);
  643.                     // set Properties
  644.                     setPropertiesEngine(list, idTransazione);
  645.                     return list;
  646.                    
  647.                 }
  648.             }
  649.            
  650.            

  651.             // Informazioni salvataggio diagnostici
  652.             CredenzialiMittente credentialsFiller = new CredenzialiMittente();
  653.             InformazioniRecordDiagnostici informazioniSalvataggioDiagnostici = getInformazioniSalvataggioDiagnostici(transazioniServiceManager, idTransazione, credentialsFiller);

  654.             // Non vi sono informazioni eventuali sulla simulazione. Provo a recuperarla direttamente
  655.             if(informazioniSalvataggioDiagnostici==null){
  656.                
  657.                 // per evitare deadlock di connessioni
  658.                 transazioniServiceManager = close(transazioniServiceManager);
  659.                 if(closeConnection){
  660.                     con = close(con);
  661.                 }
  662.                
  663.                 List<MsgDiagnostico> list = this.driverMsgDiagnostici.getMessaggiDiagnostici(filter);
  664.                 // set Properties
  665.                 setPropertiesEngine(list, idTransazione);
  666.                 return list;
  667.             }

  668.             // Non erano stata emessi diagnostici per la transazione
  669.             if(!informazioniSalvataggioDiagnostici.isPresenti()){
  670.                 throw new DriverMsgDiagnosticiNotFoundException("non presente");
  671.             }

  672.             // I diagnostici sono stati interamente salvati nel database dei diagnostici, poiche' non possedeva tutti i valori ricostruibili automaticamente
  673.             if(!informazioniSalvataggioDiagnostici.isRicostruibili()){
  674.                
  675.                 // per evitare deadlock di connessioni
  676.                 transazioniServiceManager = close(transazioniServiceManager);
  677.                 if(closeConnection){
  678.                     con = close(con);
  679.                 }
  680.                
  681.                 List<MsgDiagnostico> list = this.driverMsgDiagnostici.getMessaggiDiagnostici(filter);
  682.                 // set Properties
  683.                 setPropertiesEngine(list, idTransazione);
  684.                 return list;
  685.             }

  686.             // Recupero transazione
  687.             if(transazioneServiceSearch==null) {
  688.                 transazioneServiceSearch = transazioniServiceManager.getTransazioneServiceSearch();
  689.             }
  690.             if(transazione==null) {
  691.                 transazione = transazioneServiceSearch.get(idTransazione);
  692.             }

  693.             // Recupero tracce
  694.             TransactionDriverTracciamento driverTracciamento = new TransactionDriverTracciamento(con, this.tipoDatabase, this.log);
  695.             Traccia tracciaRichiesta = null;
  696.             Traccia tracciaRisposta = null;
  697.             Map<String, String> propertiesRicerca = new HashMap<>();
  698.             propertiesRicerca.put(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE, idTransazione);
  699.             tracciaRichiesta = getTraccia(RuoloMessaggio.RICHIESTA, driverTracciamento, propertiesRicerca);
  700.             tracciaRisposta = getTraccia(RuoloMessaggio.RISPOSTA, driverTracciamento, propertiesRicerca);

  701.             // Costruzione diagnostici
  702.             ConvertitoreCodiceDiagnostici convertitore = new ConvertitoreCodiceDiagnostici(transazione, tracciaRichiesta, tracciaRisposta, informazioniSalvataggioDiagnostici, credentialsFiller.getTokenClientId());
  703.             List<MsgDiagnostico> listRicostruiti = convertitore.build(this.log);
  704.            
  705.             // Effettuo eventuali filtri
  706.             List<MsgDiagnostico> list = new ArrayList<>();
  707.             for (MsgDiagnostico msgDiagnostico : listRicostruiti) {
  708.                 boolean add = true;
  709.                 if(filter.getIdFunzione()!=null &&
  710.                     !filter.getIdFunzione().equals(msgDiagnostico.getIdFunzione())){
  711.                     add = false;
  712.                 }
  713.                 if(add && filter.getSeverita()!=null &&
  714.                     msgDiagnostico.getSeverita()>filter.getSeverita()){
  715.                     add = false;
  716.                 }
  717.                 if(add && filter.getCodice()!=null &&
  718.                     !filter.getCodice().equals(msgDiagnostico.getCodice())){
  719.                     add = false;
  720.                 }
  721.                 if(add && filter.getMessaggioCercatoInternamenteTestoDiagnostico()!=null &&
  722.                     !msgDiagnostico.getMessaggio().contains(filter.getMessaggioCercatoInternamenteTestoDiagnostico())){
  723.                     add = false;
  724.                 }
  725.                 if(add) {
  726.                     list.add(msgDiagnostico);
  727.                 }
  728.             }          

  729.             // per evitare deadlock di connessioni
  730.             transazioniServiceManager = close(transazioniServiceManager);
  731.             if(closeConnection){
  732.                 con = close(con);
  733.             }
  734.            
  735.             // Vedo se esistono anche dei diagnostici salvati su database (es. gestione stateful).
  736.             // Se esistono, come ordine temporale saranno cmq successivi a quelli simulati.
  737.             fillDiagnostici(filter, list);

  738.             List<MsgDiagnostico> listReturn = new ArrayList<>();
  739.             if(list!=null){
  740.                 for (int i = 0; i < list.size(); i++) {
  741.                     boolean add = true;
  742.                     if(filter.getOffset()>=0 && i<filter.getOffset()){
  743.                         add = false;
  744.                     }
  745.                     if(add) {
  746.                         listReturn.add(list.get(i));
  747.                         if(filter.getLimit()>0 && listReturn.size()>=filter.getLimit()){
  748.                             break;
  749.                         }
  750.                     }
  751.                 }
  752.             }

  753.             if(!listReturn.isEmpty()){
  754.                 // set Properties
  755.                 setPropertiesEngine(listReturn, idTransazione);
  756.                 if(positionDiagnosticoRicostruito>0){
  757.                     for (int i = 0; i < list.size(); i++) {
  758.                         boolean found = false;
  759.                         if(positionAsCode){
  760.                             int code = parseSafe(list.get(i).getCodice());
  761.                             if(positionDiagnosticoRicostruito == code){
  762.                                 found = true;
  763.                             }
  764.                         }
  765.                         else{
  766.                             if((i+1)==positionDiagnosticoRicostruito){
  767.                                 found = true;
  768.                             }
  769.                         }
  770.                         if(found){
  771.                             List<MsgDiagnostico> listDiag = new ArrayList<>();
  772.                             listDiag.add(list.get(i));
  773.                             return listDiag;
  774.                         }
  775.                     }
  776.                     throw new DriverMsgDiagnosticiException("Diagnostico con posizione ["+positionDiagnosticoRicostruito+"] non trovato");
  777.                 }
  778.                 else{
  779.                     return listReturn;
  780.                 }
  781.             }
  782.            
  783.             throw new DriverMsgDiagnosticiNotFoundException("diagnostici non trovati");

  784.         }catch(DriverMsgDiagnosticiNotFoundException e){
  785.             throw e;
  786.         }catch(Exception e){
  787.             throw new DriverMsgDiagnosticiException("Riscontrato errore durante la lettura dei dati (Transazione:"+idTransazione+"): "+e.getMessage(),e);
  788.         }finally{
  789.             close(transazioniServiceManager);
  790.             if(closeConnection){
  791.                 close(con);
  792.             }
  793.         }


  794.     }

  795.     private CredenzialeMittente getCredenzialeMittente(JDBCServiceManager transazioniServiceManager, String dbValueTokenClientId, String idTransazione) throws ServiceException, MultipleResultException, NotImplementedException{
  796.         CredenzialeMittente credenzialeClientId = null;
  797.         long id = -1;
  798.         try {
  799.             IDBCredenzialeMittenteServiceSearch credenzialeMittenteServiceSearch = (IDBCredenzialeMittenteServiceSearch) transazioniServiceManager.getCredenzialeMittenteServiceSearch();
  800.             id = Long.parseLong(dbValueTokenClientId);
  801.             credenzialeClientId = credenzialeMittenteServiceSearch.get(id);
  802.             String msgDebug = "RECUPERATO CLIENT ID ["+credenzialeClientId+"] per id ["+idTransazione+"]";
  803.             this.log.debug(msgDebug);
  804.         }catch(NotFoundException notFound) {
  805.             credenzialeClientId = new CredenzialeMittente();
  806.             credenzialeClientId.setId(id);
  807.             credenzialeClientId.setCredenziale("Informazione non disponibile");
  808.         }
  809.         return credenzialeClientId;
  810.     }
  811.    
  812.     private InformazioniRecordDiagnostici getInformazioniSalvataggioDiagnostici(
  813.             JDBCServiceManager transazioniServiceManager,
  814.             String idTransazione,
  815.             CredenzialiMittente credentialsFiller) throws DriverMsgDiagnosticiException{

  816.         try{

  817.             ITransazioneServiceSearch transazioneServiceSearch = transazioniServiceManager.getTransazioneServiceSearch();

  818.             IPaginatedExpression pagExpr = transazioneServiceSearch.newPaginatedExpression();
  819.             pagExpr.equals(Transazione.model().ID_TRANSAZIONE,idTransazione);

  820.             List<Map<String,Object>> selectField = transazioneServiceSearch.select(pagExpr, Transazione.model().DIAGNOSTICI,
  821.                     Transazione.model().DIAGNOSTICI_LIST_1, Transazione.model().DIAGNOSTICI_LIST_2,
  822.                     Transazione.model().DIAGNOSTICI_LIST_EXT, Transazione.model().DIAGNOSTICI_EXT,
  823.                     Transazione.model().TOKEN_CLIENT_ID);

  824.             if(selectField==null || selectField.isEmpty()){
  825.                 throw new DriverMsgDiagnosticiException("Recupero informazioni per ricostruire i diagnostici non riuscito. Transazione con ID["+
  826.                         idTransazione+"] non presente?");
  827.             }
  828.             if(selectField.size()>1){
  829.                 throw new DriverMsgDiagnosticiException("Recupero informazioni per ricostruire i diagnostici non riuscito] non riuscito. Trovata piu' di una Transazione con ID["+
  830.                         idTransazione+"]?");
  831.             }

  832.             Map<String,Object> dbValue = selectField.get(0);

  833.             String dbValueMetaInf = this.readValue(dbValue, Transazione.model().DIAGNOSTICI, idTransazione);
  834.             if(dbValueMetaInf==null){
  835.                 // non sono presenti informazioni sulla simulazione
  836.                 return null;
  837.             }

  838.             String dbValueList1 = this.readValue(dbValue, Transazione.model().DIAGNOSTICI_LIST_1, idTransazione);
  839.             String dbValueList2 = this.readValue(dbValue, Transazione.model().DIAGNOSTICI_LIST_2, idTransazione);
  840.             String dbValueListExt = this.readValue(dbValue, Transazione.model().DIAGNOSTICI_LIST_EXT, idTransazione);
  841.             String dbValueDatiExt = this.readValue(dbValue, Transazione.model().DIAGNOSTICI_EXT, idTransazione);


  842.             InformazioniRecordDiagnostici info = InformazioniRecordDiagnostici.convertoFromDBColumnValue(dbValueMetaInf,
  843.                     dbValueList1, dbValueList2,
  844.                     dbValueListExt, dbValueDatiExt
  845.                     );
  846.             String msgDebug = "RECUPERO ["+info.toString()+"]";
  847.             this.log.debug(msgDebug);
  848.            
  849.            
  850.             if(credentialsFiller!=null) {
  851.                 String dbValueTokenClientId = this.readValue(dbValue, Transazione.model().TOKEN_CLIENT_ID, idTransazione);
  852.                 if(dbValueTokenClientId!=null && StringUtils.isNotEmpty(dbValueTokenClientId)) {
  853.                     CredenzialeMittente credenzialeClientId = getCredenzialeMittente(transazioniServiceManager, dbValueTokenClientId, idTransazione);
  854.                     credentialsFiller.setTokenClientId(credenzialeClientId);
  855.                 }
  856.             }
  857.            
  858.             return info;

  859.         }catch(Exception e){
  860.             throw new DriverMsgDiagnosticiException("Riscontrato errore durante la lettura dei dati (Transazione:"+idTransazione+"): "+e.getMessage(),e);
  861.         }
  862.     }

  863.     private String readValue(Map<String,Object> dbValue, IField field, String idTransazione) throws DriverMsgDiagnosticiException{
  864.         Object objectDBValue = dbValue.get(field.getFieldName());
  865.         String dbValueAsString = null;
  866.         if((objectDBValue instanceof org.apache.commons.lang.ObjectUtils.Null)){
  867.             objectDBValue = null;
  868.         }
  869.         if(objectDBValue!=null){
  870.             if( ! (objectDBValue instanceof String)){
  871.                 throw new DriverMsgDiagnosticiException("Recupero informazioni per ricostruire i diagnostici non riuscito. Trovato campo '"+field.getFieldName()
  872.                 +"' di tipo ["+objectDBValue.getClass().getName()
  873.                 +"] differente da quello atteso ["+String.class.getName()+"] per la Transazione con ID["+
  874.                 idTransazione+"]?");
  875.             }
  876.             else{
  877.                 dbValueAsString = (String) objectDBValue;
  878.             }
  879.         }
  880.         return dbValueAsString;
  881.     }

  882. }