DiagnosticProducer.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.protocol.basic.diagnostica;

  21. import java.sql.Connection;
  22. import java.sql.PreparedStatement;
  23. import java.util.ArrayList;
  24. import java.util.Date;
  25. import java.util.List;

  26. import org.openspcoop2.core.config.OpenspcoopAppender;
  27. import org.openspcoop2.core.constants.CostantiDB;
  28. import org.openspcoop2.core.id.IDSoggetto;
  29. import org.openspcoop2.protocol.basic.BasicConnectionResult;
  30. import org.openspcoop2.protocol.basic.BasicProducer;
  31. import org.openspcoop2.protocol.basic.BasicProducerType;
  32. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  33. import org.openspcoop2.protocol.sdk.ProtocolException;
  34. import org.openspcoop2.protocol.sdk.diagnostica.IDiagnosticProducer;
  35. import org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico;
  36. import org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnosticoException;
  37. import org.openspcoop2.utils.TipiDatabase;
  38. import org.openspcoop2.utils.jdbc.CustomKeyGeneratorObject;
  39. import org.openspcoop2.utils.jdbc.InsertAndGeneratedKey;
  40. import org.openspcoop2.utils.jdbc.InsertAndGeneratedKeyJDBCType;
  41. import org.openspcoop2.utils.jdbc.InsertAndGeneratedKeyObject;
  42. import org.openspcoop2.utils.jdbc.JDBCUtilities;


  43. /**
  44.  * Contiene l'implementazione di un appender personalizzato,
  45.  * per la registrazione dei msg diagnostici su database.
  46.  *
  47.  * @author Poli Andrea (apoli@link.it)
  48.  * @author $Author$
  49.  * @version $Rev$, $Date$
  50.  */
  51. public class DiagnosticProducer extends BasicProducer implements IDiagnosticProducer{

  52.     public DiagnosticProducer(IProtocolFactory<?> factory) throws ProtocolException{
  53.         super(factory, BasicProducerType.DIAGNOSTIC);
  54.     }
  55.    
  56.    
  57.    
  58.     /**
  59.      * Inizializza l'engine di un appender per la registrazione
  60.      * di un msg Diagnostico emesso da una porta di dominio.
  61.      *
  62.      * @param appenderProperties Proprieta' dell'appender
  63.      * @throws MsgDiagnosticoException
  64.      */
  65.     @Override
  66.     public void initializeAppender(OpenspcoopAppender appenderProperties) throws MsgDiagnosticoException{
  67.        
  68.         try{
  69.             this.initializeAppender(appenderProperties, false);
  70.         }catch(Exception e){
  71.             throw new MsgDiagnosticoException("Errore durante l'inizializzazione dell'appender: "+e.getMessage(),e);
  72.         }
  73.     }

  74.    
  75.     /**
  76.      * Registra un msg Diagnostico emesso da una porta di dominio,
  77.      * utilizzando le informazioni definite dalla specifica SPC.
  78.      *
  79.      * @param msgDiagnostico Messaggio diagnostico
  80.      * @throws MsgDiagnosticoException
  81.      */
  82.     @Override
  83.     public void log(Connection conOpenSPCoopPdD,MsgDiagnostico msgDiagnostico) throws MsgDiagnosticoException{
  84.        
  85.         if(TipiDatabase.POSTGRESQL.equals(this.tipoDatabase) && org.openspcoop2.utils.jdbc.PostgreSQLUtilities.containsNullByteSequence(msgDiagnostico.getMessaggio())){
  86.             msgDiagnostico.setMessaggio(org.openspcoop2.utils.jdbc.PostgreSQLUtilities.normalizeString(msgDiagnostico.getMessaggio()));
  87.         }
  88.        
  89.         PreparedStatement stmt = null;
  90.         Connection con = null;
  91.         String messaggio = msgDiagnostico.getMessaggio();
  92.         BasicConnectionResult cr = null;
  93.         try{
  94.            
  95.             Date gdo = msgDiagnostico.getGdo();
  96.             IDSoggetto idPorta = msgDiagnostico.getIdSoggetto();
  97.             String idFunzione = msgDiagnostico.getIdFunzione();
  98.             int severita = msgDiagnostico.getSeverita();
  99.             String idBusta = msgDiagnostico.getIdBusta();
  100.             String idBustaRisposta = msgDiagnostico.getIdBustaRisposta();
  101.             String codiceDiagnostico = msgDiagnostico.getCodice();
  102.             String applicativo = msgDiagnostico.getApplicativo();
  103.            
  104.             String idTransazione = msgDiagnostico.getIdTransazione();
  105.            
  106.             if(this.debug){
  107.                 this.log.debug("@@ log idTransazione["+idTransazione+"] idBusta["+idBusta+"] ....");
  108.             }
  109.            
  110.             TipiDatabase tipo = null;
  111.             if(this.tipoDatabase!=null){
  112.                 if(!TipiDatabase.isAMember(this.tipoDatabase)){
  113.                     throw new MsgDiagnosticoException("Tipo database ["+this.tipoDatabase+"] non supportato");
  114.                 }
  115.                 tipo = TipiDatabase.toEnumConstant(this.tipoDatabase);
  116.             }
  117.            
  118.             //  Connessione al DB
  119.             cr = this.getConnection(conOpenSPCoopPdD,"log");
  120.             con = cr.getConnection();

  121.             if(this.debug){
  122.                 this.log.debug("@@ log idTransazione["+idTransazione+"] idBusta["+idBusta+"] (getConnection finished) ....");
  123.             }
  124.            
  125.             if(tipo==null){
  126.            
  127.                 // Inserimento della traccia nel DB in modalità retro compatibile
  128.                 // in questa versione non viene recuperato l'id long
  129.                
  130.                 if(this.debug){
  131.                     this.log.debug("@@ log idTransazione["+idTransazione+"] idBusta["+idBusta+"] (inserimentoDiagnostico BackwardCompatible) ....");
  132.                 }
  133.                
  134.                 String updateString = "INSERT INTO "+CostantiDB.MSG_DIAGNOSTICI+" ("+
  135.                         CostantiDB.MSG_DIAGNOSTICI_COLUMN_GDO+", "+
  136.                         CostantiDB.MSG_DIAGNOSTICI_COLUMN_PDD_CODICE+", "+
  137.                         CostantiDB.MSG_DIAGNOSTICI_COLUMN_PDD_TIPO_SOGGETTO+", "+
  138.                         CostantiDB.MSG_DIAGNOSTICI_COLUMN_PDD_NOME_SOGGETTO+", "+
  139.                         CostantiDB.MSG_DIAGNOSTICI_COLUMN_IDFUNZIONE+", "+
  140.                         CostantiDB.MSG_DIAGNOSTICI_COLUMN_SEVERITA+", "+
  141.                         CostantiDB.MSG_DIAGNOSTICI_COLUMN_MESSAGGIO+", "+
  142.                         CostantiDB.MSG_DIAGNOSTICI_COLUMN_IDMESSAGGIO+", "+
  143.                         CostantiDB.MSG_DIAGNOSTICI_COLUMN_IDMESSAGGIO_RISPOSTA+", "+
  144.                         CostantiDB.MSG_DIAGNOSTICI_COLUMN_PROTOCOLLO+", "+
  145.                         CostantiDB.MSG_DIAGNOSTICI_COLUMN_CODICE+", "+
  146.                         CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE+", "+
  147.                         CostantiDB.MSG_DIAGNOSTICI_COLUMN_APPLICATIVO+""+
  148.                 ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? , ?, ?)";
  149.                 int index = 1;
  150.                 stmt = con.prepareStatement(updateString);
  151.                 if(gdo!=null)
  152.                     stmt.setTimestamp(index++, new java.sql.Timestamp(gdo.getTime()));
  153.                 else
  154.                     stmt.setTimestamp(index++,null);
  155.                 JDBCUtilities.setSQLStringValue(stmt,index++, idPorta.getCodicePorta());
  156.                 JDBCUtilities.setSQLStringValue(stmt,index++, idPorta.getTipo());
  157.                 JDBCUtilities.setSQLStringValue(stmt,index++, idPorta.getNome());
  158.                 JDBCUtilities.setSQLStringValue(stmt,index++, idFunzione);
  159.                 stmt.setInt(index++, severita);
  160.                 JDBCUtilities.setSQLStringValue(stmt,index++, messaggio);
  161.                 JDBCUtilities.setSQLStringValue(stmt,index++, idBusta);
  162.                 JDBCUtilities.setSQLStringValue(stmt,index++, idBustaRisposta);
  163.                 JDBCUtilities.setSQLStringValue(stmt,index++,msgDiagnostico.getProtocollo());
  164.                 JDBCUtilities.setSQLStringValue(stmt,index++, codiceDiagnostico);
  165.                 JDBCUtilities.setSQLStringValue(stmt,index++, idTransazione);
  166.                 JDBCUtilities.setSQLStringValue(stmt,index++, applicativo);
  167.                 stmt.executeUpdate();
  168.                 stmt.close();
  169.                
  170.                 if(this.debug){
  171.                     this.log.debug("@@ log idTransazione["+idTransazione+"] idBusta["+idBusta+"] (inserimentoDiagnostico BackwardCompatible terminato) ....");
  172.                 }
  173.                
  174.             }
  175.             else{
  176.                
  177.                 // Modalità di inserimento dove viene recuperato l'id long
  178.                
  179.                 if(this.debug){
  180.                     this.log.debug("@@ log idTransazione["+idTransazione+"] idBusta["+idBusta+"] (inserimentoDiagnostico) ....");
  181.                 }
  182.                
  183.                 List<InsertAndGeneratedKeyObject> listInsertAndGeneratedKeyObject = new ArrayList<>();
  184.                 java.sql.Timestamp gdoT = null;
  185.                 if(gdo!=null)
  186.                     gdoT =  new java.sql.Timestamp(gdo.getTime());
  187.                 listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_GDO, gdoT , InsertAndGeneratedKeyJDBCType.TIMESTAMP) );
  188.                 listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_PDD_CODICE, getSQLStringValue(idPorta.getCodicePorta()), InsertAndGeneratedKeyJDBCType.STRING) );
  189.                 listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_PDD_TIPO_SOGGETTO, getSQLStringValue(idPorta.getTipo()), InsertAndGeneratedKeyJDBCType.STRING) );
  190.                 listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_PDD_NOME_SOGGETTO, getSQLStringValue(idPorta.getNome()), InsertAndGeneratedKeyJDBCType.STRING) );
  191.                 listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_IDFUNZIONE, getSQLStringValue(idFunzione), InsertAndGeneratedKeyJDBCType.STRING) );
  192.                 listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_SEVERITA, severita, InsertAndGeneratedKeyJDBCType.INT) );
  193.                 listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_MESSAGGIO, getSQLStringValue(messaggio), InsertAndGeneratedKeyJDBCType.STRING) );
  194.                 listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_IDMESSAGGIO, getSQLStringValue(idBusta), InsertAndGeneratedKeyJDBCType.STRING) );
  195.                 listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_IDMESSAGGIO_RISPOSTA, getSQLStringValue(idBustaRisposta), InsertAndGeneratedKeyJDBCType.STRING) );
  196.                 listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_PROTOCOLLO, getSQLStringValue(msgDiagnostico.getProtocollo()), InsertAndGeneratedKeyJDBCType.STRING) );
  197.                 listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_CODICE, getSQLStringValue(codiceDiagnostico), InsertAndGeneratedKeyJDBCType.STRING) );
  198.                 listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE, getSQLStringValue(idTransazione), InsertAndGeneratedKeyJDBCType.STRING) );
  199.                 listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_APPLICATIVO, getSQLStringValue(applicativo), InsertAndGeneratedKeyJDBCType.STRING) );
  200.                                
  201.                 // ** Insert and return generated key
  202.                 long iddiagnostico = InsertAndGeneratedKey.insertAndReturnGeneratedKey(con, tipo,
  203.                         new CustomKeyGeneratorObject(CostantiDB.MSG_DIAGNOSTICI, CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID, CostantiDB.MSG_DIAGNOSTICI_SEQUENCE, CostantiDB.MSG_DIAGNOSTICI_TABLE_FOR_ID),
  204.                         listInsertAndGeneratedKeyObject.toArray(new InsertAndGeneratedKeyObject[1]));
  205.                 if(iddiagnostico<=0){
  206.                     throw new Exception("ID autoincrementale non ottenuto");
  207.                 }
  208.                 msgDiagnostico.setId(iddiagnostico);
  209.                
  210.                 if(this.debug){
  211.                     this.log.debug("@@ log idTransazione["+idTransazione+"] idBusta["+idBusta+"] (inserimentoDiagnostico terminato) ....");
  212.                 }
  213.             }
  214.            
  215.             if(this.debug){
  216.                 this.log.debug("@@ log idTransazione["+idTransazione+"] idBusta["+idBusta+"] completato");
  217.             }
  218.            
  219.         }catch(Exception e){
  220.             throw new MsgDiagnosticoException("Errore durante la registrazione del msg diagnostico: "+e.getMessage()+"\nIl messaggio era: "+messaggio,e);
  221.         }finally{
  222.             try{
  223.                 if(stmt!=null)
  224.                     stmt.close();
  225.             }catch(Exception e){
  226.                 // close
  227.             }
  228.             try{
  229.                 this.releaseConnection(cr, "log");
  230.             }catch(Exception e){
  231.                 // close
  232.             }
  233.         }
  234.     }
  235.        

  236. }