TransactionDriverMsgDiagnostici.java
- /*
- * GovWay - A customizable API Gateway
- * https://govway.org
- *
- * Copyright (c) 2005-2025 Link.it srl (https://link.it).
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3, as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- package org.openspcoop2.pdd.logger;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.Properties;
- import javax.naming.InitialContext;
- import javax.sql.DataSource;
- import org.apache.commons.lang.StringUtils;
- import org.openspcoop2.core.commons.dao.DAOFactory;
- import org.openspcoop2.core.constants.CostantiDB;
- import org.openspcoop2.core.transazioni.CredenzialeMittente;
- import org.openspcoop2.core.transazioni.Transazione;
- import org.openspcoop2.core.transazioni.dao.IDBCredenzialeMittenteServiceSearch;
- import org.openspcoop2.core.transazioni.dao.ITransazioneServiceSearch;
- import org.openspcoop2.core.transazioni.dao.jdbc.JDBCServiceManager;
- import org.openspcoop2.core.transazioni.utils.CredenzialiMittente;
- import org.openspcoop2.core.transazioni.utils.ProjectInfo;
- import org.openspcoop2.generic_project.beans.IField;
- import org.openspcoop2.generic_project.exception.MultipleResultException;
- import org.openspcoop2.generic_project.exception.NotFoundException;
- import org.openspcoop2.generic_project.exception.NotImplementedException;
- import org.openspcoop2.generic_project.exception.ServiceException;
- import org.openspcoop2.generic_project.expression.IPaginatedExpression;
- import org.openspcoop2.pdd.logger.diagnostica.ConvertitoreCodiceDiagnostici;
- import org.openspcoop2.pdd.logger.diagnostica.InformazioniRecordDiagnostici;
- import org.openspcoop2.protocol.basic.BasicComponentFactory;
- import org.openspcoop2.protocol.sdk.IProtocolFactory;
- import org.openspcoop2.protocol.sdk.constants.EsitoTransazioneName;
- import org.openspcoop2.protocol.sdk.constants.RuoloMessaggio;
- import org.openspcoop2.protocol.sdk.diagnostica.DriverMsgDiagnosticiException;
- import org.openspcoop2.protocol.sdk.diagnostica.DriverMsgDiagnosticiNotFoundException;
- import org.openspcoop2.protocol.sdk.diagnostica.FiltroRicercaDiagnostici;
- import org.openspcoop2.protocol.sdk.diagnostica.FiltroRicercaDiagnosticiConPaginazione;
- import org.openspcoop2.protocol.sdk.diagnostica.IDiagnosticDriver;
- import org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico;
- import org.openspcoop2.protocol.sdk.tracciamento.DriverTracciamentoException;
- import org.openspcoop2.protocol.sdk.tracciamento.DriverTracciamentoNotFoundException;
- import org.openspcoop2.protocol.sdk.tracciamento.Traccia;
- import org.openspcoop2.protocol.utils.EsitiProperties;
- import org.openspcoop2.utils.LoggerWrapperFactory;
- import org.openspcoop2.utils.TipiDatabase;
- import org.openspcoop2.utils.jdbc.JDBCUtilities;
- import org.slf4j.Logger;
- /**
- * TransactionDriverMsgDiagnostici
- *
- * @author Poli Andrea (poli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class TransactionDriverMsgDiagnostici implements IDiagnosticDriver {
- @Override
- public IProtocolFactory<?> getProtocolFactory() {
- return null;
- }
- private static final String TIPO_DB_NON_GESTITO = "Tipo database non gestito";
- /**
- * DataSource
- */
- DataSource datasource = null;
- /**
- * Connection
- */
- Connection connection = null;
- boolean connectionOpenViaJDBCInCostructor = false;
- /**
- * SQLQueryObject
- */
- String tipoDatabase = null;
- /** DriverMsgDiagnostici originale */
- DriverMsgDiagnostici driverMsgDiagnostici = null;
- /** DAO Factory */
- DAOFactory daoFactory = null;
- /** Logger utilizzato per info. */
- private Logger log = null;
- public TransactionDriverMsgDiagnostici(String nomeDataSource, String tipoDatabase, Properties prop) throws DriverMsgDiagnosticiException {
- this(nomeDataSource,tipoDatabase,prop,null);
- }
- public TransactionDriverMsgDiagnostici(String nomeDataSource, String tipoDatabase, Properties prop, Logger log) throws DriverMsgDiagnosticiException {
- // Logger
- try {
- if(log==null)
- this.log = LoggerWrapperFactory.getLogger(org.openspcoop2.protocol.basic.Costanti.LOGANALIZER_DRIVER_DB_LOGGER);
- else
- this.log = log;
- } catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(ds jndiName) Errore durante l'inizializzazione del logger: "+e.getMessage(),e);
- }
- // Datasource
- try {
- InitialContext initCtx = new InitialContext(prop);
- this.datasource = (DataSource) initCtx.lookup(nomeDataSource);
- if (this.datasource == null)
- throw new DriverMsgDiagnosticiException ("datasource is null");
- initCtx.close();
- } catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(ds jndiName) Errore durante la ricerca del datasource: "+e.getMessage(),e);
- }
- // ISQLQueryObject
- try {
- if (TipiDatabase.isAMember(tipoDatabase)) {
- this.tipoDatabase = tipoDatabase;
- } else {
- throw new DriverMsgDiagnosticiException(TIPO_DB_NON_GESTITO);
- }
- } catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(ds jndiName) Errore durante la ricerca del SQLQueryObject: "+e.getMessage(),e);
- }
- // Driver msg diagnostici
- try{
- this.driverMsgDiagnostici = new DriverMsgDiagnostici(nomeDataSource, tipoDatabase, prop, log);
- } catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(ds jndiName) Errore durante l'inizializzazione del driver dei messaggi diagnostici: "+e.getMessage(),e);
- }
- // DAO Factory
- try{
- this.daoFactory = DAOFactory.getInstance(log);
- }catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(ds jndiName) Errore durante l'inizializzazione del dao factory: "+e.getMessage(),e);
- }
- }
- public TransactionDriverMsgDiagnostici(DataSource dataSourceObject, String tipoDatabase) throws DriverMsgDiagnosticiException {
- this(dataSourceObject,tipoDatabase,null);
- }
- public TransactionDriverMsgDiagnostici(DataSource dataSourceObject, String tipoDatabase, Logger log) throws DriverMsgDiagnosticiException {
- // Logger
- try {
- if(log==null)
- this.log = LoggerWrapperFactory.getLogger(org.openspcoop2.protocol.basic.Costanti.LOGANALIZER_DRIVER_DB_LOGGER);
- else
- this.log = log;
- } catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(ds) Errore durante l'inizializzazione del logger: "+e.getMessage(),e);
- }
- // Datasource
- try {
- this.datasource = dataSourceObject;
- if (this.datasource == null)
- throw new DriverMsgDiagnosticiException ("datasource is null");
- } catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(ds) Errore durante la ricerca del datasource: "+e.getMessage(),e);
- }
- // ISQLQueryObject
- try {
- if (TipiDatabase.isAMember(tipoDatabase)) {
- this.tipoDatabase = tipoDatabase;
- } else {
- throw new DriverMsgDiagnosticiException(TIPO_DB_NON_GESTITO);
- }
- } catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(ds) Errore durante la ricerca del SQLQueryObject: "+e.getMessage(),e);
- }
- // Driver msg diagnostici
- try{
- this.driverMsgDiagnostici = new DriverMsgDiagnostici(this.datasource, tipoDatabase, log);
- } catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(ds) Errore durante l'inizializzazione del driver dei messaggi diagnostici: "+e.getMessage(),e);
- }
- // DAO Factory
- try{
- this.daoFactory = DAOFactory.getInstance(log);
- }catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(ds) Errore durante l'inizializzazione del dao factory: "+e.getMessage(),e);
- }
- }
- public TransactionDriverMsgDiagnostici(Connection connection, String tipoDatabase) throws DriverMsgDiagnosticiException {
- this(connection,tipoDatabase,null);
- }
- public TransactionDriverMsgDiagnostici(Connection connection, String tipoDatabase, Logger log) throws DriverMsgDiagnosticiException {
- // Logger
- try {
- if(log==null)
- this.log = LoggerWrapperFactory.getLogger(org.openspcoop2.protocol.basic.Costanti.LOGANALIZER_DRIVER_DB_LOGGER);
- else
- this.log = log;
- } catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(connection) Errore durante l'inizializzazione del logger: "+e.getMessage(),e);
- }
- // connection
- this.connection = connection;
- // ISQLQueryObject
- try {
- if (TipiDatabase.isAMember(tipoDatabase)) {
- this.tipoDatabase = tipoDatabase;
- } else {
- throw new DriverMsgDiagnosticiException(TIPO_DB_NON_GESTITO);
- }
- } catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(connection) Errore durante la ricerca del SQLQueryObject: "+e.getMessage(),e);
- }
- // Driver msg diagnostici
- try{
- this.driverMsgDiagnostici = new DriverMsgDiagnostici(this.connection, tipoDatabase, log);
- } catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(connection) Errore durante l'inizializzazione del driver dei messaggi diagnostici: "+e.getMessage(),e);
- }
- // DAO Factory
- try{
- this.daoFactory = DAOFactory.getInstance(log);
- }catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(connection) Errore durante l'inizializzazione del dao factory: "+e.getMessage(),e);
- }
- }
- public TransactionDriverMsgDiagnostici(String urlJDBC,String driverJDBC,
- String username,String password, String tipoDatabase) throws DriverMsgDiagnosticiException {
- this(urlJDBC,driverJDBC,username,password,tipoDatabase,null);
- }
- public TransactionDriverMsgDiagnostici(String urlJDBC,String driverJDBC,
- String username,String password, String tipoDatabase, Logger log) throws DriverMsgDiagnosticiException {
- // Logger
- try {
- if(log==null)
- this.log = LoggerWrapperFactory.getLogger(org.openspcoop2.protocol.basic.Costanti.LOGANALIZER_DRIVER_DB_LOGGER);
- else
- this.log = log;
- } catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(connection url) Errore durante l'inizializzazione del logger: "+e.getMessage(),e);
- }
- // connection
- try {
- Class.forName(driverJDBC);
- if(username!=null){
- this.connection = DriverManager.getConnection(urlJDBC,username,password);
- }else{
- this.connection = DriverManager.getConnection(urlJDBC);
- }
- this.connectionOpenViaJDBCInCostructor = true;
- } catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(connection url) Errore durante l'inizializzazione della connessione...",e);
- }
- // ISQLQueryObject
- try {
- if (TipiDatabase.isAMember(tipoDatabase)) {
- this.tipoDatabase = tipoDatabase;
- } else {
- throw new DriverMsgDiagnosticiException(TIPO_DB_NON_GESTITO);
- }
- } catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(connection url) Errore durante la ricerca del SQLQueryObject: "+e.getMessage(),e);
- }
- // Driver msg diagnostici
- try{
- this.driverMsgDiagnostici = new DriverMsgDiagnostici(this.connection, tipoDatabase, log);
- } catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(connection url) Errore durante l'inizializzazione del driver dei messaggi diagnostici: "+e.getMessage(),e);
- }
- // DAO Factory
- try{
- this.daoFactory = DAOFactory.getInstance(log);
- }catch (Exception e) {
- throw new DriverMsgDiagnosticiException("(connection url) Errore durante l'inizializzazione del dao factory: "+e.getMessage(),e);
- }
- }
- /* *********** ACCESSI TRAMITE RICERCHE (DIAGNOSTICI) ******* */
- /**
- * Si occupa di ritornare il numero di diagnostici che rispettano il filtro di ricerca
- *
- * @param filtro Filtro di ricerca
- * @return numero di diagnostici che rispettano il filtro di ricerca
- *
- */
- @Override
- public int countMessaggiDiagnostici(FiltroRicercaDiagnostici filtro) throws DriverMsgDiagnosticiException{
-
- String idTransazione = filtro.getIdTransazione();
- if(idTransazione==null) {
- idTransazione = filtro.getProperty(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE);
- }
- if(idTransazione==null){
- throw new DriverMsgDiagnosticiException("Metodo non implementato in questa versione (Identificativo di transazione non fornito)");
- }
- return this.countListaLog(filtro);
-
- }
- /**
- * Si occupa di ritornare i diagnostici che rispettano il filtro di ricerca
- *
- * @param filtro Filtro di ricerca
- * @return diagnostici che rispettano il filtro di ricerca
- *
- */
- @Override
- public List<MsgDiagnostico> getMessaggiDiagnostici(FiltroRicercaDiagnosticiConPaginazione filtro)
- throws DriverMsgDiagnosticiException, DriverMsgDiagnosticiNotFoundException{
- String idTransazione = filtro.getIdTransazione();
- if(idTransazione==null) {
- idTransazione = filtro.getProperty(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE);
- }
- if(idTransazione==null){
- throw new DriverMsgDiagnosticiException("Metodo non implementato in questa versione (Identificativo di transazione non fornito)");
- }
- List<MsgDiagnostico> list = null;
- try{
- list = this.getListaLog(filtro);
- }catch(DriverMsgDiagnosticiNotFoundException notFound){
- // ignore
- }
- if(list==null || list.isEmpty()){
- throw new DriverMsgDiagnosticiNotFoundException("Diagnostici non trovati che rispettano il filtro di ricerca (Filtro:"+filtro.toString()+")");
- }
- return list;
- }
- /**
- * Si occupa di eliminare i diagnostici che rispettano il filtro di ricerca
- *
- * @param filter Filtro di ricerca
- * @return numero di diagnostici eliminati
- * @throws DriverTracciamentoException
- */
- @Override
- public int deleteMessaggiDiagnostici(FiltroRicercaDiagnostici filter) throws DriverMsgDiagnosticiException{
- throw new DriverMsgDiagnosticiException("Metodo non implementato in questa versione");
- }
-
- private void setPropertiesEngine(List<MsgDiagnostico> listDiagnostici, String idTransazione){
- int index = 1;
- for (MsgDiagnostico msgDiagnostico : listDiagnostici) {
- // set Properties
- if(msgDiagnostico.getProperty(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE)==null){
- msgDiagnostico.addProperty(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE, idTransazione);
- }
-
- // 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)
- int id = index * -1;
- int code = 0;
- try{
- code = Integer.parseInt(msgDiagnostico.getCodice());
- code = code * -1;
- }catch(Exception e){
- // ignore
- }
- if(msgDiagnostico.getProperty(org.openspcoop2.protocol.basic.diagnostica.DiagnosticDriver.IDDIAGNOSTICI)==null){
- if(code<0){
- msgDiagnostico.addProperty(org.openspcoop2.protocol.basic.diagnostica.DiagnosticDriver.IDDIAGNOSTICI, code+"");
- }
- else{
- msgDiagnostico.addProperty(org.openspcoop2.protocol.basic.diagnostica.DiagnosticDriver.IDDIAGNOSTICI, id+"");
- }
- }
- index++;
- }
- }
- /* ******* RISORSE INTERNE ********** */
- @Override
- public void close() throws DriverMsgDiagnosticiException {
- try{
- if(this.driverMsgDiagnostici!=null){
- this.driverMsgDiagnostici.close();
- }
- }finally{
- try{
- if(this.connectionOpenViaJDBCInCostructor &&
- this.connection!=null && !this.connection.isClosed()){
- JDBCUtilities.closeConnection(BasicComponentFactory.getCheckLogger(), this.connection, BasicComponentFactory.isCheckAutocommit(), BasicComponentFactory.isCheckIsClosed());
- }
- }catch(Exception e){
- if(this.log!=null) {
- this.log.error("Close connection failure: "+e.getMessage(),e);
- }
- }
- }
- }
- /* **** INTERNAL **** */
- private Connection close(Connection con) {
- try{
- if(con!=null) {
- JDBCUtilities.closeConnection(BasicComponentFactory.getCheckLogger(), con, BasicComponentFactory.isCheckAutocommit(), BasicComponentFactory.isCheckIsClosed());
- con = null;
- }
- }catch(Exception e){
- // close
- }
- return con;
- }
- private JDBCServiceManager close(JDBCServiceManager transazioniServiceManager) {
- try{
- if(transazioniServiceManager!=null) {
- transazioniServiceManager.close();
- transazioniServiceManager = null;
- }
- }catch(Exception e){
- // ignore
- }
- return transazioniServiceManager;
- }
- private List<Map<String,Object>> selectEsitoProtocollo(ITransazioneServiceSearch transazioneServiceSearch, IPaginatedExpression expression) throws ServiceException, NotImplementedException {
- List<Map<String,Object>> l = null;
- try {
- l = transazioneServiceSearch.select(expression, Transazione.model().ESITO, Transazione.model().PROTOCOLLO);
- }catch(NotFoundException notFound) {
- // ignore
- }
- return l;
- }
-
- public int countListaLog(FiltroRicercaDiagnostici filtro) throws DriverMsgDiagnosticiException{
- String idTransazione = filtro.getIdTransazione();
- if(idTransazione==null) {
- idTransazione = filtro.getProperty(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE);
- }
- if(idTransazione==null){
- throw new DriverMsgDiagnosticiException("Identificativo di transazione non fornito");
- }
- Connection con = null;
- boolean closeConnection = true;
- JDBCServiceManager transazioniServiceManager = null;
- try{
- if(this.connection!=null){
- con = this.connection;
- closeConnection = false;
- }else{
- con = this.datasource.getConnection();
- }
- if(con==null)
- throw new DriverMsgDiagnosticiException("Connection non ottenuta");
- transazioniServiceManager =
- (JDBCServiceManager) this.daoFactory.getServiceManager(new ProjectInfo(), con, true);
- if(transazioniServiceManager==null) {
- throw new DriverMsgDiagnosticiException("transazioniServiceManager is null");
- }
- ITransazioneServiceSearch transazioneServiceSearch = null;
-
-
-
- if(filtro.getApplicativo()!=null && !"".equals(filtro.getApplicativo()) ){
-
- transazioneServiceSearch = transazioniServiceManager.getTransazioneServiceSearch();
-
- IPaginatedExpression expression = transazioneServiceSearch.newPaginatedExpression();
- expression.equals(Transazione.model().ID_TRANSAZIONE, idTransazione);
- expression.limit(1);
- List<Map<String,Object>> l = selectEsitoProtocollo(transazioneServiceSearch, expression);
- if(l!=null && !l.isEmpty()) {
- Map<String,Object> map = l.remove(0);
- if(map!=null && !map.isEmpty()) {
-
- Object protocolloObj = map.get(Transazione.model().PROTOCOLLO.getFieldName());
- if(protocolloObj instanceof String) {
- String protocollo = (String) protocolloObj;
- Object esitoObj = map.get(Transazione.model().ESITO.getFieldName());
- if(esitoObj instanceof Integer) {
- int esito = (Integer) esitoObj;
-
- EsitiProperties esitiProperties = EsitiProperties.getInstanceFromProtocolName(this.log, protocollo);
- EsitoTransazioneName esitoName = esitiProperties.getEsitoTransazioneName(esito);
-
- if(EsitoTransazioneName.isConsegnaMultipla(esitoName)) {
-
- // per evitare deadlock di connessioni
- transazioniServiceManager = close(transazioniServiceManager);
- if(closeConnection){
- con = close(con);
- }
-
- // Consegna Multipla: saranno diagnostici salvati sicuramente nella tabella, relativamente a consegne con presa in carico
- return this.driverMsgDiagnostici.countMessaggiDiagnostici(filtro);
-
- }
- }
- }
-
- }
- }
-
- }
-
- // Informazioni salvataggio diagnostici
- InformazioniRecordDiagnostici informazioniSalvataggioDiagnostici = getInformazioniSalvataggioDiagnostici(transazioniServiceManager, idTransazione, null);
- // per evitare deadlock di connessioni
- transazioniServiceManager = close(transazioniServiceManager);
- if(closeConnection){
- con = close(con);
- }
-
- // Non vi sono informazioni eventuali sulla simulazione. Provo a recuperarla direttamente
- if(informazioniSalvataggioDiagnostici==null){
- return this.driverMsgDiagnostici.countMessaggiDiagnostici(filtro);
- }
- // Non erano stata emessi diagnostici per la transazione
- if(!informazioniSalvataggioDiagnostici.isPresenti()){
- return 0;
- }
- // La traccia era stata interamente salvata nel database delle tracce, poiche' non possedeva tutti i valori ricostruibili automaticamente
- if(!informazioniSalvataggioDiagnostici.isRicostruibili()){
- return this.driverMsgDiagnostici.countMessaggiDiagnostici(filtro);
- }
-
- int size = informazioniSalvataggioDiagnostici.getDiagnostici().size();
- if(informazioniSalvataggioDiagnostici.getDiagnosticiExt()!=null){
- size+=informazioniSalvataggioDiagnostici.getDiagnosticiExt().size();
- }
-
- // Vedo se esistono anche dei diagnostici salvati su database (es. gestione stateful).
- // Se esistono, come ordine temporale saranno cmq successivi a quelli simulati.
- int countSalvatiDatabase = this.driverMsgDiagnostici.countMessaggiDiagnostici(filtro);
- if(countSalvatiDatabase>0) {
- return size+countSalvatiDatabase;
- }
- else {
- return size;
- }
- }catch(Exception e){
- throw new DriverMsgDiagnosticiException("Riscontrato errore durante la lettura (count) dei dati (Transazione:"+idTransazione+"): "+e.getMessage(),e);
- }finally{
- close(transazioniServiceManager);
- if(closeConnection){
- close(con);
- }
- }
- }
- private Traccia getTraccia(RuoloMessaggio ruolo, TransactionDriverTracciamento driverTracciamento, Map<String, String> propertiesRicerca) throws DriverTracciamentoException {
- Traccia tr = null;
- try{
- tr = driverTracciamento.getTraccia(ruolo, propertiesRicerca);
- }catch(DriverTracciamentoNotFoundException dNotFound){
- // ignore
- }
- return tr;
- }
-
- private void fillDiagnostici(FiltroRicercaDiagnosticiConPaginazione filter, List<MsgDiagnostico> list) throws DriverMsgDiagnosticiException {
- int offsetOriginal = -1;
- int limitOriginal = -1;
-
- offsetOriginal = filter.getOffset();
- filter.setOffset(0);
-
- limitOriginal = filter.getLimit();
- filter.setLimit(-1);
- try{
-
- List<MsgDiagnostico> listDB = this.driverMsgDiagnostici.getMessaggiDiagnostici(filter);
- if(listDB!=null && !listDB.isEmpty()){
- list.addAll(listDB);
- }
- }catch(DriverMsgDiagnosticiNotFoundException e){
- // ignore
- }
- finally{
- if(offsetOriginal>=0)
- filter.setOffset(offsetOriginal);
- if(limitOriginal>0)
- filter.setLimit(limitOriginal);
- }
- }
-
- private int parseSafe(String v) {
- int code = -1;
- try{
- code = Integer.parseInt(v);
- }catch(Exception e){
- // ignore
- }
- return code;
- }
-
- private List<MsgDiagnostico> getListaLog(FiltroRicercaDiagnosticiConPaginazione filter)
- throws DriverMsgDiagnosticiNotFoundException,DriverMsgDiagnosticiException {
- String idTransazione = filter.getIdTransazione();
- if(idTransazione==null) {
- idTransazione = filter.getProperty(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE);
- }
- if(idTransazione==null){
- throw new DriverMsgDiagnosticiException("Identificativo di transazione non fornito");
- }
-
- String idDiagnostico = filter.getProperty(org.openspcoop2.protocol.basic.diagnostica.DiagnosticDriver.IDDIAGNOSTICI);
- int positionDiagnosticoRicostruito = -1;
- boolean positionAsCode = false;
- if(idDiagnostico!=null){
- try{
- int value = Integer.parseInt(idDiagnostico);
- if(value<0){
- // diagnostico ricostruito
- positionDiagnosticoRicostruito = value * -1;
- positionAsCode = positionDiagnosticoRicostruito >= 1000; // le prime tre cifre 001 vengono tradotte in 1
- }
- }catch(Exception e){
- // ignore
- }
- }
- Connection con = null;
- boolean closeConnection = true;
- JDBCServiceManager transazioniServiceManager = null;
- try{
- if(this.connection!=null){
- con = this.connection;
- closeConnection = false;
- }else{
- con = this.datasource.getConnection();
- }
- if(con==null)
- throw new DriverMsgDiagnosticiException("Connection non ottenuta");
- transazioniServiceManager =
- (JDBCServiceManager) this.daoFactory.getServiceManager(new ProjectInfo(), con, true);
- if(transazioniServiceManager==null) {
- throw new DriverMsgDiagnosticiException("transazioniServiceManager is null");
- }
- ITransazioneServiceSearch transazioneServiceSearch = null;
- Transazione transazione = null;
-
- if(filter.getApplicativo()!=null && !"".equals(filter.getApplicativo()) ){
-
- transazioneServiceSearch = transazioniServiceManager.getTransazioneServiceSearch();
- transazione = transazioneServiceSearch.get(idTransazione);
-
- int esito = transazione.getEsito();
- EsitiProperties esitiProperties = EsitiProperties.getInstanceFromProtocolName(this.log, transazione.getProtocollo());
- EsitoTransazioneName esitoName = esitiProperties.getEsitoTransazioneName(esito);
-
- if(EsitoTransazioneName.isConsegnaMultipla(esitoName)) {
-
- // per evitare deadlock di connessioni
- transazioniServiceManager = close(transazioniServiceManager);
- if(closeConnection){
- con = close(con);
- }
-
- // Consegna Multipla: saranno diagnostici salvati sicuramente nella tabella, relativamente a consegne con presa in carico
- List<MsgDiagnostico> list = this.driverMsgDiagnostici.getMessaggiDiagnostici(filter);
- // set Properties
- setPropertiesEngine(list, idTransazione);
- return list;
-
- }
- }
-
-
- // Informazioni salvataggio diagnostici
- CredenzialiMittente credentialsFiller = new CredenzialiMittente();
- InformazioniRecordDiagnostici informazioniSalvataggioDiagnostici = getInformazioniSalvataggioDiagnostici(transazioniServiceManager, idTransazione, credentialsFiller);
- // Non vi sono informazioni eventuali sulla simulazione. Provo a recuperarla direttamente
- if(informazioniSalvataggioDiagnostici==null){
-
- // per evitare deadlock di connessioni
- transazioniServiceManager = close(transazioniServiceManager);
- if(closeConnection){
- con = close(con);
- }
-
- List<MsgDiagnostico> list = this.driverMsgDiagnostici.getMessaggiDiagnostici(filter);
- // set Properties
- setPropertiesEngine(list, idTransazione);
- return list;
- }
- // Non erano stata emessi diagnostici per la transazione
- if(!informazioniSalvataggioDiagnostici.isPresenti()){
- throw new DriverMsgDiagnosticiNotFoundException("non presente");
- }
- // I diagnostici sono stati interamente salvati nel database dei diagnostici, poiche' non possedeva tutti i valori ricostruibili automaticamente
- if(!informazioniSalvataggioDiagnostici.isRicostruibili()){
-
- // per evitare deadlock di connessioni
- transazioniServiceManager = close(transazioniServiceManager);
- if(closeConnection){
- con = close(con);
- }
-
- List<MsgDiagnostico> list = this.driverMsgDiagnostici.getMessaggiDiagnostici(filter);
- // set Properties
- setPropertiesEngine(list, idTransazione);
- return list;
- }
- // Recupero transazione
- if(transazioneServiceSearch==null) {
- transazioneServiceSearch = transazioniServiceManager.getTransazioneServiceSearch();
- }
- if(transazione==null) {
- transazione = transazioneServiceSearch.get(idTransazione);
- }
- // Recupero tracce
- TransactionDriverTracciamento driverTracciamento = new TransactionDriverTracciamento(con, this.tipoDatabase, this.log);
- Traccia tracciaRichiesta = null;
- Traccia tracciaRisposta = null;
- Map<String, String> propertiesRicerca = new HashMap<>();
- propertiesRicerca.put(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE, idTransazione);
- tracciaRichiesta = getTraccia(RuoloMessaggio.RICHIESTA, driverTracciamento, propertiesRicerca);
- tracciaRisposta = getTraccia(RuoloMessaggio.RISPOSTA, driverTracciamento, propertiesRicerca);
- // Costruzione diagnostici
- ConvertitoreCodiceDiagnostici convertitore = new ConvertitoreCodiceDiagnostici(transazione, tracciaRichiesta, tracciaRisposta, informazioniSalvataggioDiagnostici, credentialsFiller.getTokenClientId());
- List<MsgDiagnostico> listRicostruiti = convertitore.build(this.log);
-
- // Effettuo eventuali filtri
- List<MsgDiagnostico> list = new ArrayList<>();
- for (MsgDiagnostico msgDiagnostico : listRicostruiti) {
- boolean add = true;
- if(filter.getIdFunzione()!=null &&
- !filter.getIdFunzione().equals(msgDiagnostico.getIdFunzione())){
- add = false;
- }
- if(add && filter.getSeverita()!=null &&
- msgDiagnostico.getSeverita()>filter.getSeverita()){
- add = false;
- }
- if(add && filter.getCodice()!=null &&
- !filter.getCodice().equals(msgDiagnostico.getCodice())){
- add = false;
- }
- if(add && filter.getMessaggioCercatoInternamenteTestoDiagnostico()!=null &&
- !msgDiagnostico.getMessaggio().contains(filter.getMessaggioCercatoInternamenteTestoDiagnostico())){
- add = false;
- }
- if(add) {
- list.add(msgDiagnostico);
- }
- }
- // per evitare deadlock di connessioni
- transazioniServiceManager = close(transazioniServiceManager);
- if(closeConnection){
- con = close(con);
- }
-
- // Vedo se esistono anche dei diagnostici salvati su database (es. gestione stateful).
- // Se esistono, come ordine temporale saranno cmq successivi a quelli simulati.
- fillDiagnostici(filter, list);
- List<MsgDiagnostico> listReturn = new ArrayList<>();
- if(list!=null){
- for (int i = 0; i < list.size(); i++) {
- boolean add = true;
- if(filter.getOffset()>=0 && i<filter.getOffset()){
- add = false;
- }
- if(add) {
- listReturn.add(list.get(i));
- if(filter.getLimit()>0 && listReturn.size()>=filter.getLimit()){
- break;
- }
- }
- }
- }
- if(!listReturn.isEmpty()){
- // set Properties
- setPropertiesEngine(listReturn, idTransazione);
- if(positionDiagnosticoRicostruito>0){
- for (int i = 0; i < list.size(); i++) {
- boolean found = false;
- if(positionAsCode){
- int code = parseSafe(list.get(i).getCodice());
- if(positionDiagnosticoRicostruito == code){
- found = true;
- }
- }
- else{
- if((i+1)==positionDiagnosticoRicostruito){
- found = true;
- }
- }
- if(found){
- List<MsgDiagnostico> listDiag = new ArrayList<>();
- listDiag.add(list.get(i));
- return listDiag;
- }
- }
- throw new DriverMsgDiagnosticiException("Diagnostico con posizione ["+positionDiagnosticoRicostruito+"] non trovato");
- }
- else{
- return listReturn;
- }
- }
-
- throw new DriverMsgDiagnosticiNotFoundException("diagnostici non trovati");
- }catch(DriverMsgDiagnosticiNotFoundException e){
- throw e;
- }catch(Exception e){
- throw new DriverMsgDiagnosticiException("Riscontrato errore durante la lettura dei dati (Transazione:"+idTransazione+"): "+e.getMessage(),e);
- }finally{
- close(transazioniServiceManager);
- if(closeConnection){
- close(con);
- }
- }
- }
- private CredenzialeMittente getCredenzialeMittente(JDBCServiceManager transazioniServiceManager, String dbValueTokenClientId, String idTransazione) throws ServiceException, MultipleResultException, NotImplementedException{
- CredenzialeMittente credenzialeClientId = null;
- long id = -1;
- try {
- IDBCredenzialeMittenteServiceSearch credenzialeMittenteServiceSearch = (IDBCredenzialeMittenteServiceSearch) transazioniServiceManager.getCredenzialeMittenteServiceSearch();
- id = Long.parseLong(dbValueTokenClientId);
- credenzialeClientId = credenzialeMittenteServiceSearch.get(id);
- String msgDebug = "RECUPERATO CLIENT ID ["+credenzialeClientId+"] per id ["+idTransazione+"]";
- this.log.debug(msgDebug);
- }catch(NotFoundException notFound) {
- credenzialeClientId = new CredenzialeMittente();
- credenzialeClientId.setId(id);
- credenzialeClientId.setCredenziale("Informazione non disponibile");
- }
- return credenzialeClientId;
- }
-
- private InformazioniRecordDiagnostici getInformazioniSalvataggioDiagnostici(
- JDBCServiceManager transazioniServiceManager,
- String idTransazione,
- CredenzialiMittente credentialsFiller) throws DriverMsgDiagnosticiException{
- try{
- ITransazioneServiceSearch transazioneServiceSearch = transazioniServiceManager.getTransazioneServiceSearch();
- IPaginatedExpression pagExpr = transazioneServiceSearch.newPaginatedExpression();
- pagExpr.equals(Transazione.model().ID_TRANSAZIONE,idTransazione);
- List<Map<String,Object>> selectField = transazioneServiceSearch.select(pagExpr, Transazione.model().DIAGNOSTICI,
- Transazione.model().DIAGNOSTICI_LIST_1, Transazione.model().DIAGNOSTICI_LIST_2,
- Transazione.model().DIAGNOSTICI_LIST_EXT, Transazione.model().DIAGNOSTICI_EXT,
- Transazione.model().TOKEN_CLIENT_ID);
- if(selectField==null || selectField.isEmpty()){
- throw new DriverMsgDiagnosticiException("Recupero informazioni per ricostruire i diagnostici non riuscito. Transazione con ID["+
- idTransazione+"] non presente?");
- }
- if(selectField.size()>1){
- throw new DriverMsgDiagnosticiException("Recupero informazioni per ricostruire i diagnostici non riuscito] non riuscito. Trovata piu' di una Transazione con ID["+
- idTransazione+"]?");
- }
- Map<String,Object> dbValue = selectField.get(0);
- String dbValueMetaInf = this.readValue(dbValue, Transazione.model().DIAGNOSTICI, idTransazione);
- if(dbValueMetaInf==null){
- // non sono presenti informazioni sulla simulazione
- return null;
- }
- String dbValueList1 = this.readValue(dbValue, Transazione.model().DIAGNOSTICI_LIST_1, idTransazione);
- String dbValueList2 = this.readValue(dbValue, Transazione.model().DIAGNOSTICI_LIST_2, idTransazione);
- String dbValueListExt = this.readValue(dbValue, Transazione.model().DIAGNOSTICI_LIST_EXT, idTransazione);
- String dbValueDatiExt = this.readValue(dbValue, Transazione.model().DIAGNOSTICI_EXT, idTransazione);
- InformazioniRecordDiagnostici info = InformazioniRecordDiagnostici.convertoFromDBColumnValue(dbValueMetaInf,
- dbValueList1, dbValueList2,
- dbValueListExt, dbValueDatiExt
- );
- String msgDebug = "RECUPERO ["+info.toString()+"]";
- this.log.debug(msgDebug);
-
-
- if(credentialsFiller!=null) {
- String dbValueTokenClientId = this.readValue(dbValue, Transazione.model().TOKEN_CLIENT_ID, idTransazione);
- if(dbValueTokenClientId!=null && StringUtils.isNotEmpty(dbValueTokenClientId)) {
- CredenzialeMittente credenzialeClientId = getCredenzialeMittente(transazioniServiceManager, dbValueTokenClientId, idTransazione);
- credentialsFiller.setTokenClientId(credenzialeClientId);
- }
- }
-
- return info;
- }catch(Exception e){
- throw new DriverMsgDiagnosticiException("Riscontrato errore durante la lettura dei dati (Transazione:"+idTransazione+"): "+e.getMessage(),e);
- }
- }
- private String readValue(Map<String,Object> dbValue, IField field, String idTransazione) throws DriverMsgDiagnosticiException{
- Object objectDBValue = dbValue.get(field.getFieldName());
- String dbValueAsString = null;
- if((objectDBValue instanceof org.apache.commons.lang.ObjectUtils.Null)){
- objectDBValue = null;
- }
- if(objectDBValue!=null){
- if( ! (objectDBValue instanceof String)){
- throw new DriverMsgDiagnosticiException("Recupero informazioni per ricostruire i diagnostici non riuscito. Trovato campo '"+field.getFieldName()
- +"' di tipo ["+objectDBValue.getClass().getName()
- +"] differente da quello atteso ["+String.class.getName()+"] per la Transazione con ID["+
- idTransazione+"]?");
- }
- else{
- dbValueAsString = (String) objectDBValue;
- }
- }
- return dbValueAsString;
- }
- }