NotifierDump.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.pdd.core.handlers.notifier.engine;
import java.io.File;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.openspcoop2.core.commons.dao.DAOFactory;
import org.openspcoop2.core.commons.dao.DAOFactoryProperties;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.transazioni.DumpMessaggio;
import org.openspcoop2.core.transazioni.constants.TipoMessaggio;
import org.openspcoop2.core.transazioni.dao.jdbc.JDBCDumpMessaggioService;
import org.openspcoop2.generic_project.expression.impl.sql.ISQLFieldConverter;
import org.openspcoop2.generic_project.utils.ServiceManagerProperties;
import org.openspcoop2.pdd.config.DBTransazioniManager;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
import org.openspcoop2.pdd.config.Resource;
import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
import org.openspcoop2.protocol.sdk.tracciamento.TracciamentoException;
import org.openspcoop2.utils.date.DateManager;
import org.openspcoop2.utils.jdbc.JDBCAdapterFactory;
import org.openspcoop2.utils.sql.ISQLQueryObject;
import org.openspcoop2.utils.sql.SQLObjectFactory;
import org.slf4j.Logger;
/**
* NotifierDump
*
* @author Poli Andrea (poli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class NotifierDump {
// STATIC
private static NotifierDump staticInstance = null;
private static synchronized void initialize() throws TracciamentoException{
if(staticInstance==null){
try{
OpenSPCoop2Properties op2Properties = OpenSPCoop2Properties.getInstance();
String tipoDatabase = op2Properties.getDatabaseType();
if(tipoDatabase==null){
throw new TracciamentoException("Tipo Database non definito");
}
boolean debug = op2Properties.isTransazioniDebug();
Logger daoFactoryLogger = null;
DAOFactory daoFactory = null;
ServiceManagerProperties daoFactoryServiceManagerPropertiesTransazioni = null;
try{
DAOFactoryProperties daoFactoryProperties = null;
daoFactoryLogger = OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioniSql(debug);
daoFactory = DAOFactory.getInstance(daoFactoryLogger);
daoFactoryProperties = DAOFactoryProperties.getInstance(daoFactoryLogger);
daoFactoryServiceManagerPropertiesTransazioni = daoFactoryProperties.getServiceManagerProperties(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance());
daoFactoryServiceManagerPropertiesTransazioni.setShowSql(debug);
daoFactoryServiceManagerPropertiesTransazioni.setDatabaseType(DBTransazioniManager.getInstance().getTipoDatabase());
}catch(Exception e){
throw new TracciamentoException("Errore durante l'inizializzazione del daoFactory: "+e.getMessage(),e);
}
// GestoreDump
staticInstance = new NotifierDump(debug,
//ds,
tipoDatabase, daoFactory, daoFactoryServiceManagerPropertiesTransazioni, daoFactoryLogger);
}catch(Exception e){
throw new TracciamentoException("Errore durante l'inizializzazione del NotifierDump: "+e.getMessage(),e);
}
}
}
public static NotifierDump getInstance() throws TracciamentoException {
if(staticInstance==null){
// spotbugs warning 'SING_SINGLETON_GETTER_NOT_SYNCHRONIZED': l'istanza viene creata allo startup
synchronized (NotifierDump.class) {
initialize();
}
}
return staticInstance;
}
// INSTANCE
private String tipoDatabase;
private DAOFactory daoFactory = null;
private ServiceManagerProperties daoFactoryServiceManagerPropertiesTransazioni = null;
private Logger daoFactoryLogger = null;
boolean debug = false;
private NotifierDump( boolean debug,
String tipoDatabase,
DAOFactory daoFactory, ServiceManagerProperties daoFactoryServiceManagerPropertiesTransazioni, Logger daoFactoryLogger){
this.debug = debug;
this.tipoDatabase = tipoDatabase;
this.daoFactory = daoFactory;
this.daoFactoryServiceManagerPropertiesTransazioni = daoFactoryServiceManagerPropertiesTransazioni;
this.daoFactoryLogger = daoFactoryLogger;
}
private int save(NotifierCallback notifierCallback,
String idTransazione,TipoMessaggio tipoMessaggio,Map<String, List<String>> headerTrasporto,
long idDumpConfigurazione,
String contentType,
InputStream is,File file,byte[]buffer,
IDSoggetto dominio) throws Exception{
PreparedStatement stmt = null;
DBTransazioniManager dbManager = null;
Resource r = null;
String idModulo = "NotifierDump.save"+tipoMessaggio.getValue();
try{
notifierCallback.debug("@save getConnection.....");
dbManager = DBTransazioniManager.getInstance();
r = dbManager.getResource(dominio, idModulo, idTransazione);
if(r==null){
throw new Exception("Risorsa al database non disponibile");
}
Connection con = (Connection) r.getResource();
if(con == null)
throw new Exception("Connessione non disponibile");
boolean autoCommit = true;
org.openspcoop2.core.transazioni.dao.jdbc.JDBCServiceManager jdbcServiceManager =
(org.openspcoop2.core.transazioni.dao.jdbc.JDBCServiceManager) this.daoFactory.
getServiceManager(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance(), con, autoCommit,
this.daoFactoryServiceManagerPropertiesTransazioni, this.daoFactoryLogger);
jdbcServiceManager.getJdbcProperties().setShowSql(this.debug);
JDBCDumpMessaggioService dumpMessaggioService = (JDBCDumpMessaggioService) jdbcServiceManager.getDumpMessaggioService();
ISQLFieldConverter sqlFielConverter = dumpMessaggioService.getFieldConverter();
// Devo usare per forza la prepared stameent per sfruttare la funzionalità di setStream.
ISQLQueryObject insertSql = SQLObjectFactory.createSQLQueryObject(this.tipoDatabase);
insertSql.addInsertTable(sqlFielConverter.toTable(DumpMessaggio.model()));
insertSql.addInsertField(sqlFielConverter.toColumn(DumpMessaggio.model().ID_TRANSAZIONE, false), "?");
insertSql.addInsertField(sqlFielConverter.toColumn(DumpMessaggio.model().TIPO_MESSAGGIO, false), "?");
insertSql.addInsertField(sqlFielConverter.toColumn(DumpMessaggio.model().DUMP_TIMESTAMP, false), "?");
insertSql.addInsertField(sqlFielConverter.toColumn(DumpMessaggio.model().CONTENT_TYPE, false), "?");
insertSql.addInsertField(sqlFielConverter.toColumn(DumpMessaggio.model().POST_PROCESS_HEADER, false), "?");
if(file!=null){
insertSql.addInsertField(sqlFielConverter.toColumn(DumpMessaggio.model().POST_PROCESS_FILENAME, false), "?");
}else{
insertSql.addInsertField(sqlFielConverter.toColumn(DumpMessaggio.model().POST_PROCESS_CONTENT, false), "?");
}
insertSql.addInsertField("post_process_config_id", "?" );
insertSql.addInsertField(sqlFielConverter.toColumn(DumpMessaggio.model().POST_PROCESS_TIMESTAMP, false), "?");
insertSql.addInsertField(sqlFielConverter.toColumn(DumpMessaggio.model().POST_PROCESSED, false), "?");
notifierCallback.debug("@save insertSql ["+insertSql.createSQLInsert()+"].....");
notifierCallback.debug("@save creo PreparedStatement.....");
stmt = con.prepareStatement(insertSql.createSQLInsert());
int index = 1;
stmt.setString(index++, idTransazione);
stmt.setString(index++, tipoMessaggio.toString());
stmt.setTimestamp(index++, DateManager.getTimestamp());
stmt.setString(index++, contentType);
stmt.setString(index++, this.toString(headerTrasporto));
if(file!=null){
notifierCallback.debug("set FileName.....");
stmt.setString(index++, file.getName());
}else{
if(is!=null){
notifierCallback.debug("set BinaryStream.....");
stmt.setBinaryStream(index++, is);
}
else{
notifierCallback.debug("set JDBCAdapter.....");
JDBCAdapterFactory.createJDBCAdapter(this.tipoDatabase).setBinaryData(stmt, index++, buffer);
}
}
stmt.setLong(index++, idDumpConfigurazione);
stmt.setTimestamp(index++, DateManager.getTimestamp());
stmt.setInt(index++, 0); // dovra' essere processato in posto process.
notifierCallback.debug("set executeUpdate.....");
int row = stmt.executeUpdate();
notifierCallback.debug("return row ["+row+"].....");
return row;
}finally{
try{
if(stmt!=null)
stmt.close();
}catch(Exception eClose){}
try{
if(r!=null)
dbManager.releaseResource(dominio, idModulo, r);
}catch(Exception eClose){
// close
}
}
}
private String toString(Map<String, List<String>> headerTrasporto){
StringBuilder bf = new StringBuilder();
if(headerTrasporto!=null && headerTrasporto.size()>0){
Iterator<String> keys = headerTrasporto.keySet().iterator();
while (keys.hasNext()) {
String key = keys.next();
List<String> values = headerTrasporto.get(key);
if(values!=null && !values.isEmpty()) {
for (String value : values) {
if(bf.length()>0){
bf.append("\n");
}
bf.append(key).append("=").append(value);
}
}
}
}
if(bf.length()>0){
return bf.toString();
}
else{
return null;
}
}
public int saveOnDatabase(NotifierCallback notifierCallback,
String idTransazione,TipoMessaggio tipoMessaggio, Map<String, List<String>> headerTrasporto,
long idDumpConfigurazione,
String contentType,InputStream is,
IDSoggetto dominio) throws Exception{
return this.save(notifierCallback,idTransazione, tipoMessaggio, headerTrasporto, idDumpConfigurazione, contentType, is, null, null, dominio);
}
public int saveOnFileSystem(NotifierCallback notifierCallback,
String idTransazione,TipoMessaggio tipoMessaggio, Map<String, List<String>> headerTrasporto,
long idDumpConfigurazione,
String contentType,File file,
IDSoggetto dominio) throws Exception{
return this.save(notifierCallback,idTransazione, tipoMessaggio, headerTrasporto, idDumpConfigurazione, contentType, null, file, null, dominio);
}
public int saveBuffer(NotifierCallback notifierCallback,
String idTransazione,TipoMessaggio tipoMessaggio, Map<String, List<String>> headerTrasporto,
long idDumpConfigurazione,
String contentType,byte[] content,
IDSoggetto dominio) throws Exception{
return this.save(notifierCallback,idTransazione, tipoMessaggio, headerTrasporto, idDumpConfigurazione, contentType, null, null, content, dominio);
}
public int update(NotifierCallback notifierCallback,
String idTransazione,TipoMessaggio tipoMessaggio,Map<String, List<String>> headerTrasporto,
IDSoggetto dominio) throws Exception{
PreparedStatement stmt = null;
DBTransazioniManager dbManager = null;
Resource r = null;
String idModulo = "NotifierDump.update"+tipoMessaggio.getValue();
try{
notifierCallback.debug("@save getConnection.....");
dbManager = DBTransazioniManager.getInstance();
r = dbManager.getResource(dominio, idModulo, idTransazione);
if(r==null){
throw new Exception("Risorsa al database non disponibile");
}
Connection con = (Connection) r.getResource();
if(con == null)
throw new Exception("Connessione non disponibile");
boolean autoCommit = true;
org.openspcoop2.core.transazioni.dao.jdbc.JDBCServiceManager jdbcServiceManager =
(org.openspcoop2.core.transazioni.dao.jdbc.JDBCServiceManager)
this.daoFactory.getServiceManager(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance(), con, autoCommit,
this.daoFactoryServiceManagerPropertiesTransazioni, this.daoFactoryLogger);
jdbcServiceManager.getJdbcProperties().setShowSql(this.debug);
JDBCDumpMessaggioService dumpMessaggioService = (JDBCDumpMessaggioService) jdbcServiceManager.getDumpMessaggioService();
ISQLFieldConverter sqlFielConverter = dumpMessaggioService.getFieldConverter();
// Devo usare per forza la prepared stameent per sfruttare la funzionalità di ritornare le righe modificate
ISQLQueryObject updateSql = SQLObjectFactory.createSQLQueryObject(this.tipoDatabase);
updateSql.addUpdateTable(sqlFielConverter.toTable(DumpMessaggio.model()));
updateSql.addUpdateField(sqlFielConverter.toColumn(DumpMessaggio.model().POST_PROCESS_HEADER, false), "?");
updateSql.setANDLogicOperator(true);
updateSql.addWhereCondition(sqlFielConverter.toColumn(DumpMessaggio.model().ID_TRANSAZIONE, false)+"=?");
updateSql.addWhereCondition(sqlFielConverter.toColumn(DumpMessaggio.model().TIPO_MESSAGGIO, false)+"=?");
notifierCallback.debug("@save updateSql ["+updateSql.createSQLUpdate()+"].....");
notifierCallback.debug("@save creo PreparedStatement.....");
stmt = con.prepareStatement(updateSql.createSQLUpdate());
stmt.setString(1, this.toString(headerTrasporto));
stmt.setString(2, idTransazione);
stmt.setString(3, tipoMessaggio.toString());
notifierCallback.debug("set executeUpdate.....");
int row = stmt.executeUpdate();
notifierCallback.debug("return row ["+row+"].....");
return row;
}finally{
try{
if(stmt!=null)
stmt.close();
}catch(Exception eClose){}
try{
if(r!=null)
dbManager.releaseResource(dominio, idModulo, r);
}catch(Exception eClose){
// close
}
}
}
}