DiagnosticProducer.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.protocol.basic.diagnostica;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.openspcoop2.core.config.OpenspcoopAppender;
import org.openspcoop2.core.constants.CostantiDB;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.protocol.basic.BasicConnectionResult;
import org.openspcoop2.protocol.basic.BasicProducer;
import org.openspcoop2.protocol.basic.BasicProducerType;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.diagnostica.IDiagnosticProducer;
import org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico;
import org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnosticoException;
import org.openspcoop2.utils.TipiDatabase;
import org.openspcoop2.utils.jdbc.CustomKeyGeneratorObject;
import org.openspcoop2.utils.jdbc.InsertAndGeneratedKey;
import org.openspcoop2.utils.jdbc.InsertAndGeneratedKeyJDBCType;
import org.openspcoop2.utils.jdbc.InsertAndGeneratedKeyObject;
import org.openspcoop2.utils.jdbc.JDBCUtilities;
/**
* Contiene l'implementazione di un appender personalizzato,
* per la registrazione dei msg diagnostici su database.
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class DiagnosticProducer extends BasicProducer implements IDiagnosticProducer{
public DiagnosticProducer(IProtocolFactory<?> factory) throws ProtocolException{
super(factory, BasicProducerType.DIAGNOSTIC);
}
/**
* Inizializza l'engine di un appender per la registrazione
* di un msg Diagnostico emesso da una porta di dominio.
*
* @param appenderProperties Proprieta' dell'appender
* @throws MsgDiagnosticoException
*/
@Override
public void initializeAppender(OpenspcoopAppender appenderProperties) throws MsgDiagnosticoException{
try{
this.initializeAppender(appenderProperties, false);
}catch(Exception e){
throw new MsgDiagnosticoException("Errore durante l'inizializzazione dell'appender: "+e.getMessage(),e);
}
}
/**
* Registra un msg Diagnostico emesso da una porta di dominio,
* utilizzando le informazioni definite dalla specifica SPC.
*
* @param msgDiagnostico Messaggio diagnostico
* @throws MsgDiagnosticoException
*/
@Override
public void log(Connection conOpenSPCoopPdD,MsgDiagnostico msgDiagnostico) throws MsgDiagnosticoException{
if(TipiDatabase.POSTGRESQL.equals(this.tipoDatabase) && org.openspcoop2.utils.jdbc.PostgreSQLUtilities.containsNullByteSequence(msgDiagnostico.getMessaggio())){
msgDiagnostico.setMessaggio(org.openspcoop2.utils.jdbc.PostgreSQLUtilities.normalizeString(msgDiagnostico.getMessaggio()));
}
PreparedStatement stmt = null;
Connection con = null;
String messaggio = msgDiagnostico.getMessaggio();
BasicConnectionResult cr = null;
try{
Date gdo = msgDiagnostico.getGdo();
IDSoggetto idPorta = msgDiagnostico.getIdSoggetto();
String idFunzione = msgDiagnostico.getIdFunzione();
int severita = msgDiagnostico.getSeverita();
String idBusta = msgDiagnostico.getIdBusta();
String idBustaRisposta = msgDiagnostico.getIdBustaRisposta();
String codiceDiagnostico = msgDiagnostico.getCodice();
String applicativo = msgDiagnostico.getApplicativo();
String idTransazione = msgDiagnostico.getIdTransazione();
if(this.debug){
this.log.debug("@@ log idTransazione["+idTransazione+"] idBusta["+idBusta+"] ....");
}
TipiDatabase tipo = null;
if(this.tipoDatabase!=null){
if(!TipiDatabase.isAMember(this.tipoDatabase)){
throw new MsgDiagnosticoException("Tipo database ["+this.tipoDatabase+"] non supportato");
}
tipo = TipiDatabase.toEnumConstant(this.tipoDatabase);
}
// Connessione al DB
cr = this.getConnection(conOpenSPCoopPdD,"log");
con = cr.getConnection();
if(this.debug){
this.log.debug("@@ log idTransazione["+idTransazione+"] idBusta["+idBusta+"] (getConnection finished) ....");
}
if(tipo==null){
// Inserimento della traccia nel DB in modalità retro compatibile
// in questa versione non viene recuperato l'id long
if(this.debug){
this.log.debug("@@ log idTransazione["+idTransazione+"] idBusta["+idBusta+"] (inserimentoDiagnostico BackwardCompatible) ....");
}
String updateString = "INSERT INTO "+CostantiDB.MSG_DIAGNOSTICI+" ("+
CostantiDB.MSG_DIAGNOSTICI_COLUMN_GDO+", "+
CostantiDB.MSG_DIAGNOSTICI_COLUMN_PDD_CODICE+", "+
CostantiDB.MSG_DIAGNOSTICI_COLUMN_PDD_TIPO_SOGGETTO+", "+
CostantiDB.MSG_DIAGNOSTICI_COLUMN_PDD_NOME_SOGGETTO+", "+
CostantiDB.MSG_DIAGNOSTICI_COLUMN_IDFUNZIONE+", "+
CostantiDB.MSG_DIAGNOSTICI_COLUMN_SEVERITA+", "+
CostantiDB.MSG_DIAGNOSTICI_COLUMN_MESSAGGIO+", "+
CostantiDB.MSG_DIAGNOSTICI_COLUMN_IDMESSAGGIO+", "+
CostantiDB.MSG_DIAGNOSTICI_COLUMN_IDMESSAGGIO_RISPOSTA+", "+
CostantiDB.MSG_DIAGNOSTICI_COLUMN_PROTOCOLLO+", "+
CostantiDB.MSG_DIAGNOSTICI_COLUMN_CODICE+", "+
CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE+", "+
CostantiDB.MSG_DIAGNOSTICI_COLUMN_APPLICATIVO+""+
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? , ?, ?)";
int index = 1;
stmt = con.prepareStatement(updateString);
if(gdo!=null)
stmt.setTimestamp(index++, new java.sql.Timestamp(gdo.getTime()));
else
stmt.setTimestamp(index++,null);
JDBCUtilities.setSQLStringValue(stmt,index++, idPorta.getCodicePorta());
JDBCUtilities.setSQLStringValue(stmt,index++, idPorta.getTipo());
JDBCUtilities.setSQLStringValue(stmt,index++, idPorta.getNome());
JDBCUtilities.setSQLStringValue(stmt,index++, idFunzione);
stmt.setInt(index++, severita);
JDBCUtilities.setSQLStringValue(stmt,index++, messaggio);
JDBCUtilities.setSQLStringValue(stmt,index++, idBusta);
JDBCUtilities.setSQLStringValue(stmt,index++, idBustaRisposta);
JDBCUtilities.setSQLStringValue(stmt,index++,msgDiagnostico.getProtocollo());
JDBCUtilities.setSQLStringValue(stmt,index++, codiceDiagnostico);
JDBCUtilities.setSQLStringValue(stmt,index++, idTransazione);
JDBCUtilities.setSQLStringValue(stmt,index++, applicativo);
stmt.executeUpdate();
stmt.close();
if(this.debug){
this.log.debug("@@ log idTransazione["+idTransazione+"] idBusta["+idBusta+"] (inserimentoDiagnostico BackwardCompatible terminato) ....");
}
}
else{
// Modalità di inserimento dove viene recuperato l'id long
if(this.debug){
this.log.debug("@@ log idTransazione["+idTransazione+"] idBusta["+idBusta+"] (inserimentoDiagnostico) ....");
}
List<InsertAndGeneratedKeyObject> listInsertAndGeneratedKeyObject = new ArrayList<>();
java.sql.Timestamp gdoT = null;
if(gdo!=null)
gdoT = new java.sql.Timestamp(gdo.getTime());
listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_GDO, gdoT , InsertAndGeneratedKeyJDBCType.TIMESTAMP) );
listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_PDD_CODICE, getSQLStringValue(idPorta.getCodicePorta()), InsertAndGeneratedKeyJDBCType.STRING) );
listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_PDD_TIPO_SOGGETTO, getSQLStringValue(idPorta.getTipo()), InsertAndGeneratedKeyJDBCType.STRING) );
listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_PDD_NOME_SOGGETTO, getSQLStringValue(idPorta.getNome()), InsertAndGeneratedKeyJDBCType.STRING) );
listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_IDFUNZIONE, getSQLStringValue(idFunzione), InsertAndGeneratedKeyJDBCType.STRING) );
listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_SEVERITA, severita, InsertAndGeneratedKeyJDBCType.INT) );
listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_MESSAGGIO, getSQLStringValue(messaggio), InsertAndGeneratedKeyJDBCType.STRING) );
listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_IDMESSAGGIO, getSQLStringValue(idBusta), InsertAndGeneratedKeyJDBCType.STRING) );
listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_IDMESSAGGIO_RISPOSTA, getSQLStringValue(idBustaRisposta), InsertAndGeneratedKeyJDBCType.STRING) );
listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_PROTOCOLLO, getSQLStringValue(msgDiagnostico.getProtocollo()), InsertAndGeneratedKeyJDBCType.STRING) );
listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_CODICE, getSQLStringValue(codiceDiagnostico), InsertAndGeneratedKeyJDBCType.STRING) );
listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE, getSQLStringValue(idTransazione), InsertAndGeneratedKeyJDBCType.STRING) );
listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.MSG_DIAGNOSTICI_COLUMN_APPLICATIVO, getSQLStringValue(applicativo), InsertAndGeneratedKeyJDBCType.STRING) );
// ** Insert and return generated key
long iddiagnostico = InsertAndGeneratedKey.insertAndReturnGeneratedKey(con, tipo,
new CustomKeyGeneratorObject(CostantiDB.MSG_DIAGNOSTICI, CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID, CostantiDB.MSG_DIAGNOSTICI_SEQUENCE, CostantiDB.MSG_DIAGNOSTICI_TABLE_FOR_ID),
listInsertAndGeneratedKeyObject.toArray(new InsertAndGeneratedKeyObject[1]));
if(iddiagnostico<=0){
throw new Exception("ID autoincrementale non ottenuto");
}
msgDiagnostico.setId(iddiagnostico);
if(this.debug){
this.log.debug("@@ log idTransazione["+idTransazione+"] idBusta["+idBusta+"] (inserimentoDiagnostico terminato) ....");
}
}
if(this.debug){
this.log.debug("@@ log idTransazione["+idTransazione+"] idBusta["+idBusta+"] completato");
}
}catch(Exception e){
throw new MsgDiagnosticoException("Errore durante la registrazione del msg diagnostico: "+e.getMessage()+"\nIl messaggio era: "+messaggio,e);
}finally{
try{
if(stmt!=null)
stmt.close();
}catch(Exception e){
// close
}
try{
this.releaseConnection(cr, "log");
}catch(Exception e){
// close
}
}
}
}