FiltroDuplicati.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.transazioni;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import org.slf4j.Logger;
import org.openspcoop2.core.constants.CostantiDB;
import org.openspcoop2.core.constants.TipoPdD;
import org.openspcoop2.core.transazioni.Transazione;
import org.openspcoop2.core.transazioni.dao.jdbc.converter.TransazioneFieldConverter;
import org.openspcoop2.pdd.config.DBTransazioniManager;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
import org.openspcoop2.pdd.config.Resource;
import org.openspcoop2.pdd.core.PdDContext;
import org.openspcoop2.pdd.core.state.OpenSPCoopState;
import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
import org.openspcoop2.protocol.engine.driver.IFiltroDuplicati;
import org.openspcoop2.protocol.sdk.Busta;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.builder.IBustaBuilder;
import org.openspcoop2.protocol.sdk.state.RequestInfo;
import org.openspcoop2.utils.date.DateManager;
import org.openspcoop2.utils.date.DateUtils;
import org.openspcoop2.utils.sql.ISQLQueryObject;
import org.openspcoop2.utils.sql.SQLObjectFactory;
/**
* FiltroDuplicati
*
* @author Poli Andrea (poli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class FiltroDuplicati implements IFiltroDuplicati {
private OpenSPCoop2Properties openspcoop2Properties;
private String idTransazione = null;
private RequestInfo requestInfo = null;
private org.openspcoop2.protocol.engine.driver.FiltroDuplicati filtroDuplicatiProtocol;
private OpenSPCoopState openspcoop2State = null;
private Boolean initDsResource = null;
private Connection connection = null;
private boolean isDirectConnection = false;
@SuppressWarnings("unused")
private String modeGetConnection = null;
private boolean releaseRuntimeResourceBeforeCheck = false;
private String tipoDatabaseRuntime = null;
private Logger log = null;
private Logger logSql = null;
private boolean debug = false;
private TransazioneFieldConverter transazioneFieldConverter = null;
private String nomeTabellaTransazioni = null;
private String colonna_pdd_ruolo = null;
private String colonna_duplicati_richiesta = null;
private String colonna_data_id_msg_richiesta = null;
private String colonna_id_messaggio_richiesta = null;
private String colonna_duplicati_risposta = null;
private String colonna_data_id_msg_risposta = null;
private String colonna_id_messaggio_risposta = null;
private boolean useTransactionIdForTest = false; // solo per test
public boolean isUseTransactionIdForTest() {
return this.useTransactionIdForTest;
}
public void setUseTransactionIdForTest(boolean useTransactionIdForTest) {
this.useTransactionIdForTest = useTransactionIdForTest;
}
private static final String ID_MODULO = "FiltroDuplicati";
@Override
public void init(Object context) throws ProtocolException{
this.openspcoop2Properties = OpenSPCoop2Properties.getInstance();
if(this.openspcoop2Properties.isTransazioniFiltroDuplicatiTramiteTransazioniEnabled() == false) {
this.filtroDuplicatiProtocol = new org.openspcoop2.protocol.engine.driver.FiltroDuplicati();
this.filtroDuplicatiProtocol.init(context);
}
else {
PdDContext pddContext = (PdDContext)context;
if(pddContext==null) {
throw new ProtocolException("PdDContext non fornito");
}
this.idTransazione = (String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
if(this.idTransazione==null){
throw new ProtocolException("Id di transazione non fornito");
}
if(pddContext!=null && pddContext.containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
this.requestInfo = (RequestInfo) pddContext.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
}
if(this.initDsResource==null && this.connection==null){
this.init((PdDContext)context);
}
}
}
@Override
public boolean releaseRuntimeResourceBeforeCheck() {
return this.releaseRuntimeResourceBeforeCheck;
}
@Override
public boolean isDuplicata(IProtocolFactory<?> protocolFactory, String idBustaParam) throws ProtocolException {
String idBusta = this.useTransactionIdForTest ? this.idTransazione : idBustaParam;
long timeStart = -1;
TransazioniFiltroDuplicatiProcessTimes times = null;
try {
if(this.openspcoop2Properties.isTransazioniRegistrazioneSlowLog()) {
timeStart = DateManager.getTimeMillis();
times = new TransazioniFiltroDuplicatiProcessTimes();
}
if(this.filtroDuplicatiProtocol!=null) {
return this.filtroDuplicatiProtocol.isDuplicata(protocolFactory, idBusta);
}
//System.out.println("@@IS_DUPLICATA ["+idBusta+"] idTransaction("+this.idTransazione+") (useTransactionIdForTest:"+this.useTransactionIdForTest+") ...");
// E' duplicata se esiste nel contesto una transazione con tale idBusta
if(TransactionContext.containsIdentificativoProtocollo(idBusta)){
//System.out.println("@@IS_DUPLICATA ["+idBusta+"] TRUE (CONTEXT)");
try{
TransactionContext.getTransaction(this.idTransazione).addIdProtocolloDuplicato(idBusta);
}catch(Exception e){
throw new ProtocolException(e);
}
return true;
}
// oppure se esiste una transazione registrata con tale idBusta sul database (Richiesta o Risposta).
//System.out.println("@@IS_DUPLICATA ["+idBusta+"] READ FROM DB");
if(esisteTransazione(protocolFactory,idBusta,idBusta,times)){
//System.out.println("@@IS_DUPLICATA ["+idBusta+"] TRUE (DATABASE)");
try{
TransactionContext.getTransaction(this.idTransazione).addIdProtocolloDuplicato(idBusta);
}catch(Exception e){
throw new ProtocolException(e);
}
return true;
}
// Se non esiste registro nel contesto questa transazione.
// Comunque OpenSPCoop se torno false, procedera a chiamare registraBusta, il quale metodo non fara' nulla (vedi implementazione sotto stante)
// Il metodo di registrazione dell'identificativo busta viene acceduto tramite un semaforo e controlla che non sia possibile registrare due identificativi busta.
// Tale implementazione garantisce che nel contesto puo' esistere solo un idBusta, e tale id viene eliminato SOLO dopo
// aver salvato la transazione nel database (vedi implementazione PostOutResponseHandler, metodo removeIdentificativoProtocollo)
// Se dopo aver eliminato dal contesto l'id, arriva una nuova busta con stesso id, questo metodo la trova nella tabelle delle transazioni
// e quindi ritornera' immediatamente l'informazione di busta duplicata.
try{
//System.out.println("@@IS_DUPLICATA ["+idBusta+"] FALSE ....");
TransactionContext.registraIdentificativoProtocollo(idBusta, this.idTransazione);
//System.out.println("@@IS_DUPLICATA ["+idBusta+"] FALSE REGISTRATA");
}catch(Exception e){
if(e.getMessage()!=null && "DUPLICATA".equals(e.getMessage())){
//System.out.println("@@IS_DUPLICATA ["+idBusta+"] TRUE (ERRORE ECCEZIONE)");
try{
TransactionContext.getTransaction(this.idTransazione).addIdProtocolloDuplicato(idBusta);
}catch(Exception eSetDuplicata){
throw new ProtocolException(eSetDuplicata);
}
return true;
}else{
throw new ProtocolException(e);
}
}
//System.out.println("@@IS_DUPLICATA ["+idBusta+"] FALSE FINE");
return false;
}finally {
if(this.openspcoop2Properties.isTransazioniRegistrazioneSlowLog()) {
long timeEnd = DateManager.getTimeMillis();
long timeProcess = timeEnd-timeStart;
if(timeProcess>=this.openspcoop2Properties.getTransazioniRegistrazioneSlowLogThresholdMs()) {
StringBuilder sb = new StringBuilder();
sb.append(timeProcess);
if(this.idTransazione!=null) {
sb.append(" <").append(this.idTransazione).append(">");
}
sb.append(" [isDuplicata]");
sb.append(" ").append(idBusta);
if(times!=null) {
sb.append(" ").append(times.toString());
}
OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioniSlowLog().info(sb.toString());
}
}
}
}
@Override
public void incrementaNumeroDuplicati(IProtocolFactory<?> protocolFactory, String idBusta) throws ProtocolException {
long timeStart = -1;
TransazioniFiltroDuplicatiProcessTimes times = null;
try {
if(this.openspcoop2Properties.isTransazioniRegistrazioneSlowLog()) {
timeStart = DateManager.getTimeMillis();
times = new TransazioniFiltroDuplicatiProcessTimes();
}
if(this.filtroDuplicatiProtocol!=null) {
this.filtroDuplicatiProtocol.incrementaNumeroDuplicati(protocolFactory, idBusta);
return;
}
//System.out.println("@@incrementaNumeroDuplicati ["+idBusta+"] ...");
incrementDuplicatiTransazione(protocolFactory, idBusta, times);
//System.out.println("@@incrementaNumeroDuplicati richiesta["+esisteRichiesta+"] risposta["+esisteRisposta+"] FINE");
}finally {
if(this.openspcoop2Properties.isTransazioniRegistrazioneSlowLog()) {
long timeEnd = DateManager.getTimeMillis();
long timeProcess = timeEnd-timeStart;
if(timeProcess>=this.openspcoop2Properties.getTransazioniRegistrazioneSlowLogThresholdMs()) {
StringBuilder sb = new StringBuilder();
sb.append(timeProcess);
if(this.idTransazione!=null) {
sb.append(" <").append(this.idTransazione).append(">");
}
sb.append(" [incrementaNumeroDuplicati]");
sb.append(" ").append(idBusta);
if(times!=null) {
sb.append(" ").append(times.toString());
}
OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioniSlowLog().info(sb.toString());
}
}
}
}
@Override
public void registraBusta(IProtocolFactory<?> protocolFactory, Busta busta) throws ProtocolException {
long timeStart = -1;
try {
if(this.openspcoop2Properties.isTransazioniRegistrazioneSlowLog()) {
timeStart = DateManager.getTimeMillis();
}
if(this.filtroDuplicatiProtocol!=null) {
this.filtroDuplicatiProtocol.registraBusta(protocolFactory, busta);
return;
}
// Implementazione inserita in isDuplicata
//System.out.println("@@registraBusta ["+busta.getID()+"] NON IMPLEMENTATO");
}finally {
if(this.openspcoop2Properties.isTransazioniRegistrazioneSlowLog()) {
long timeEnd = DateManager.getTimeMillis();
long timeProcess = timeEnd-timeStart;
if(timeProcess>=this.openspcoop2Properties.getTransazioniRegistrazioneSlowLogThresholdMs()) {
StringBuilder sb = new StringBuilder();
sb.append(timeProcess);
if(this.idTransazione!=null) {
sb.append(" <").append(this.idTransazione).append(">");
}
sb.append(" [registraBusta]");
if(busta!=null) {
sb.append(" ").append(busta.getID());
}
OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioniSlowLog().info(sb.toString());
}
}
}
}
/* **** METODI INTERNI **** */
private synchronized void init(PdDContext pddContext) throws ProtocolException {
//if(this.dsRuntime==null && this.connection==null){
if(this.initDsResource==null && this.connection==null){
try{
// Debug
this.debug = this.openspcoop2Properties.isTransazioniDebug();
this.log = OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioni(this.debug);
this.logSql = OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioniSql(this.debug);
}catch(Exception e){
throw new ProtocolException("Errore durante l'inizializzazione del logger: "+e.getMessage(),e);
}
try{
// TipoDatabase
this.tipoDatabaseRuntime = this.openspcoop2Properties.getDatabaseType();
if(this.tipoDatabaseRuntime==null){
throw new Exception("Tipo Database non definito");
}
// DB Resource
Object openspcoopstate = pddContext.getObject(org.openspcoop2.core.constants.Costanti.OPENSPCOOP_STATE);
if(openspcoopstate!=null) {
this.openspcoop2State = (OpenSPCoopState) openspcoopstate;
}
if(this.openspcoop2State!=null && this.openspcoop2Properties.isTransazioniFiltroDuplicatiTramiteTransazioniUsePdDConnection()
&& DBTransazioniManager.getInstance().useRuntimePdD() && !this.openspcoop2State.resourceReleased()){
//System.out.println("[FILTRO] INIZIALIZZO CONNESSIONE");
this.connection = this.openspcoop2State.getConnectionDB();
//this.datasourceRuntime = "DirectConnection";
this.modeGetConnection = "DirectConnection";
this.isDirectConnection = true;
}
else{
//System.out.println("[FILTRO] INIZIALIZZO DS");
// this.datasourceRuntime = PddInterceptorConfig.getDataSource();
// if(this.datasourceRuntime==null){
// throw new Exception("Datasource non definito");
// }
this.initDsResource = true;
this.modeGetConnection = "DatasourceRuntime";
this.releaseRuntimeResourceBeforeCheck = true; // per evitare deadlock
// Inizializzazione datasource
// GestoreJNDI jndi = new GestoreJNDI();
// this.dsRuntime = (DataSource) jndi.lookup(this.datasourceRuntime);
}
//System.out.println("DS["+this.datasource+"] TIPODB["+this.tipoDatabase+"]");
this.transazioneFieldConverter = new TransazioneFieldConverter(this.tipoDatabaseRuntime);
this.nomeTabellaTransazioni = this.transazioneFieldConverter.toTable(Transazione.model());
this.colonna_pdd_ruolo = this.transazioneFieldConverter.toColumn(Transazione.model().PDD_RUOLO, false);
this.colonna_duplicati_richiesta = this.transazioneFieldConverter.toColumn(Transazione.model().DUPLICATI_RICHIESTA, false);
this.colonna_data_id_msg_richiesta = this.transazioneFieldConverter.toColumn(Transazione.model().DATA_ID_MSG_RICHIESTA, false);
this.colonna_id_messaggio_richiesta = this.transazioneFieldConverter.toColumn(Transazione.model().ID_MESSAGGIO_RICHIESTA, false);
this.colonna_duplicati_risposta = this.transazioneFieldConverter.toColumn(Transazione.model().DUPLICATI_RISPOSTA, false);
this.colonna_data_id_msg_risposta = this.transazioneFieldConverter.toColumn(Transazione.model().DATA_ID_MSG_RISPOSTA, false);
this.colonna_id_messaggio_risposta = this.transazioneFieldConverter.toColumn(Transazione.model().ID_MESSAGGIO_RISPOSTA, false);
}catch(Exception e){
throw new ProtocolException("Errore durante l'inizializzazione dell'appender: "+e.getMessage(),e);
}
}
}
private boolean esisteTransazione(IProtocolFactory<?> protocolFactory, String idBustaRichiesta,String idBustaRisposta,
TransazioniFiltroDuplicatiProcessTimes times) throws ProtocolException {
Connection con = null;
DBTransazioniManager dbManager = null;
Resource r = null;
String idModulo = ID_MODULO+".esisteTransazione"; //_"+idBustaRichiesta+"/"+idBustaRisposta;
try{
IBustaBuilder<?> protocolBustaBuilder = null;
if(this.openspcoop2State!=null) {
if(idBustaRichiesta!=null) {
protocolBustaBuilder = protocolFactory.createBustaBuilder(this.openspcoop2State.getStatoRichiesta());
}
else {
protocolBustaBuilder = protocolFactory.createBustaBuilder(this.openspcoop2State.getStatoRisposta());
}
}
else {
protocolBustaBuilder = protocolFactory.createBustaBuilder(null);
}
if(idBustaRichiesta==null && idBustaRisposta==null){
throw new ProtocolException("ID busta non forniti");
}
long timeStart = -1;
try{
if(times!=null) {
timeStart = DateManager.getTimeMillis();
}
if(this.connection!=null){
//System.out.println("[FILTRO] esisteTransazione idBustaRichiesta["+idBustaRichiesta+"] idBustaRisposta["+idBustaRisposta+"] BY CONNECTION");
con = this.connection;
}else{
//System.out.println("[FILTRO] esisteTransazione idBustaRichiesta["+idBustaRichiesta+"] idBustaRisposta["+idBustaRisposta+"] BY DATASOURCE");
dbManager = DBTransazioniManager.getInstance();
r = dbManager.getResource(this.openspcoop2Properties.getIdentitaPortaDefault(protocolFactory.getProtocol(), this.requestInfo), idModulo, this.idTransazione);
if(r==null){
throw new Exception("Risorsa al database non disponibile");
}
con = (Connection) r.getResource();
}
if(con==null){
throw new Exception("Connection is null");
}
}finally {
if(times!=null) {
long timeEnd = DateManager.getTimeMillis();
long timeProcess = timeEnd-timeStart;
times.getConnection = timeProcess;
}
}
return esisteTransazione_query(protocolFactory, idBustaRichiesta, idBustaRisposta,
con, protocolBustaBuilder, times);
}catch(Exception e){
throw new ProtocolException(e);
}
finally{
if(this.isDirectConnection==false){
try{
if(r!=null)
dbManager.releaseResource(this.openspcoop2Properties.getIdentitaPortaDefault(protocolFactory.getProtocol(), this.requestInfo), idModulo, r);
}catch(Exception eClose){}
}
}
}
private void incrementDuplicatiTransazione(IProtocolFactory<?> protocolFactory, String idBusta,
TransazioniFiltroDuplicatiProcessTimes times) throws ProtocolException {
Connection con = null;
DBTransazioniManager dbManager = null;
Resource r = null;
String idModulo = ID_MODULO+".incrementDuplicatiTransazione"; //_"+idBustaRichiesta+"/"+idBustaRisposta;
try{
IBustaBuilder<?> protocolBustaBuilder = null;
if(this.openspcoop2State!=null) {
if(this.openspcoop2State.getStatoRichiesta()!=null) {
protocolBustaBuilder = protocolFactory.createBustaBuilder(this.openspcoop2State.getStatoRichiesta());
}
else {
protocolBustaBuilder = protocolFactory.createBustaBuilder(this.openspcoop2State.getStatoRisposta());
}
}
else {
protocolBustaBuilder = protocolFactory.createBustaBuilder(null);
}
if(idBusta==null){
throw new ProtocolException("ID busta non fornito");
}
long timeStart = -1;
try{
if(times!=null) {
timeStart = DateManager.getTimeMillis();
}
if(this.connection!=null){
//System.out.println("[FILTRO] esisteTransazione idBustaRichiesta["+idBustaRichiesta+"] idBustaRisposta["+idBustaRisposta+"] BY CONNECTION");
con = this.connection;
}else{
//System.out.println("[FILTRO] esisteTransazione idBustaRichiesta["+idBustaRichiesta+"] idBustaRisposta["+idBustaRisposta+"] BY DATASOURCE");
dbManager = DBTransazioniManager.getInstance();
r = dbManager.getResource(this.openspcoop2Properties.getIdentitaPortaDefault(protocolFactory.getProtocol(), this.requestInfo), idModulo, this.idTransazione);
if(r==null){
throw new Exception("Risorsa al database non disponibile");
}
con = (Connection) r.getResource();
}
if(con==null){
throw new Exception("Connection is null");
}
}finally {
if(times!=null) {
long timeEnd = DateManager.getTimeMillis();
long timeProcess = timeEnd-timeStart;
times.getConnection = timeProcess;
}
}
// Aggiorno numero duplicati per transazione che possiede tale idBusta (Richiesta o Risposta)
// Se non esiste una transazione sul database, devo attendere che questa compaia,
// significa che una precedente transazione con stesso idBusta e' ancora in gestione
long timeRequest = -1;
long timeResponse = -1;
long timeSleep = -1;
boolean esisteRichiesta = false;
boolean esisteRisposta = false;
try{
TransazioniFiltroDuplicatiProcessTimes checkRequest = null;
TransazioniFiltroDuplicatiProcessTimes checkResponse = null;
if(times!=null) {
checkRequest = new TransazioniFiltroDuplicatiProcessTimes();
}
esisteRichiesta = esisteTransazione_query(protocolFactory,idBusta,null,con,protocolBustaBuilder,checkRequest);
if(times!=null) {
timeRequest=checkRequest.read;
}
if(!esisteRichiesta){
if(times!=null) {
checkResponse = new TransazioniFiltroDuplicatiProcessTimes();
}
esisteRisposta = esisteTransazione_query(protocolFactory,null,idBusta,con,protocolBustaBuilder,checkResponse);
if(times!=null) {
timeResponse=checkResponse.read;
}
}
//System.out.println("@@incrementaNumeroDuplicati richiesta["+esisteRichiesta+"] risposta["+esisteRisposta+"] ...");
int i=0;
while(!esisteRichiesta && !esisteRisposta && i<60){
//System.out.println("@@incrementaNumeroDuplicati WHILE richiesta["+esisteRichiesta+"] risposta["+esisteRisposta+"] SLEEP ...");
// ATTENDI
org.openspcoop2.utils.Utilities.sleep(1000);
if(timeSleep==-1) {
timeSleep=1000;
}else {
timeSleep = timeSleep + 1000;
}
i++;
if(times!=null) {
checkRequest = new TransazioniFiltroDuplicatiProcessTimes();
}
esisteRichiesta = esisteTransazione_query(protocolFactory,idBusta,null,con,protocolBustaBuilder,checkRequest);
if(times!=null) {
timeRequest = timeRequest + checkRequest.read;
}
if(!esisteRichiesta){
if(times!=null) {
checkResponse = new TransazioniFiltroDuplicatiProcessTimes();
}
esisteRisposta = esisteTransazione_query(protocolFactory,null,idBusta,con,protocolBustaBuilder,checkResponse);
if(times!=null) {
timeResponse = timeResponse + checkResponse.read;
}
}
//System.out.println("@@incrementaNumeroDuplicati WHILE richiesta["+esisteRichiesta+"] risposta["+esisteRisposta+"] SLEEP FINE ...");
}
}finally {
if(times!=null) {
times.checkExistsRequest = timeRequest;
times.checkExistsResponse = timeResponse;
times.checkSleep = timeSleep;
}
}
if(esisteRichiesta){
incrementDuplicatiTransazione(protocolFactory,true, idBusta,
con, protocolBustaBuilder, times);
}
else if(esisteRisposta){
incrementDuplicatiTransazione(protocolFactory,false, idBusta,
con, protocolBustaBuilder, times);
}
else{
throw new ProtocolException("Precedente transazione con solito idBusta risulta in gestione da oltre 60 secondi");
}
}catch(Exception e){
throw new ProtocolException(e);
}
finally{
if(this.isDirectConnection==false){
try{
if(r!=null)
dbManager.releaseResource(this.openspcoop2Properties.getIdentitaPortaDefault(protocolFactory.getProtocol(), this.requestInfo), idModulo, r);
}catch(Exception eClose){}
}
}
}
private boolean esisteTransazione_query(IProtocolFactory<?> protocolFactory, String idBustaRichiesta,String idBustaRisposta,
Connection con, IBustaBuilder<?> protocolBustaBuilder, TransazioniFiltroDuplicatiProcessTimes times) throws ProtocolException {
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
long timeStart = -1;
try{
if(times!=null) {
timeStart = DateManager.getTimeMillis();
}
ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.tipoDatabaseRuntime);
if(this.openspcoop2Properties.isTransazioniFiltroDuplicatiTramiteTransazioniForceIndex()){
if(this.openspcoop2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory)){
//System.out.println("ADD FORCE INDEX esisteTransazione INDEX2");
sqlQueryObject.addSelectForceIndex(this.nomeTabellaTransazioni, CostantiDB.TABLE_TRANSAZIONI_INDEX_FILTRO_REQ_2);
sqlQueryObject.addSelectForceIndex(this.nomeTabellaTransazioni, CostantiDB.TABLE_TRANSAZIONI_INDEX_FILTRO_RES_2);
}else{
//System.out.println("ADD FORCE INDEX esisteTransazione INDEX1");
sqlQueryObject.addSelectForceIndex(this.nomeTabellaTransazioni, CostantiDB.TABLE_TRANSAZIONI_INDEX_FILTRO_REQ_1);
sqlQueryObject.addSelectForceIndex(this.nomeTabellaTransazioni, CostantiDB.TABLE_TRANSAZIONI_INDEX_FILTRO_RES_1);
}
}/*else{
System.out.println("NON USO FORCE INDEX esisteTransazione");
}*/
sqlQueryObject.addFromTable(this.nomeTabellaTransazioni);
if(idBustaRichiesta!=null){
// Solo una porta applicativa puo' ricevere una busta di richiesta (serve per evitare i problemi in caso di loopback)
if(this.openspcoop2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory)){
sqlQueryObject.addWhereCondition(true,this.colonna_data_id_msg_richiesta+"=?",this.colonna_id_messaggio_richiesta+"=?",this.colonna_pdd_ruolo+"=?");
}
else{
sqlQueryObject.addWhereCondition(true,this.colonna_id_messaggio_richiesta+"=?",this.colonna_pdd_ruolo+"=?");
}
}
if(idBustaRisposta!=null){
// Solo una porta delegata puo' ricevere una busta di risposta (serve per evitare i problemi in caso di loopback)
if(this.openspcoop2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory)){
sqlQueryObject.addWhereCondition(true,this.colonna_data_id_msg_risposta+"=?",this.colonna_id_messaggio_risposta+"=?",this.colonna_pdd_ruolo+"=?");
}
else{
sqlQueryObject.addWhereCondition(true,this.colonna_id_messaggio_risposta+"=?",this.colonna_pdd_ruolo+"=?");
}
}
sqlQueryObject.setANDLogicOperator(false); // OR
String sql = sqlQueryObject.createSQLQuery();
pstmt = con.prepareStatement(sql);
int index = 1;
Timestamp t = null;
if(idBustaRichiesta!=null){
if(this.openspcoop2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory)){
t = DateUtility.getTimestampIntoIdProtocollo(this.log,protocolBustaBuilder,idBustaRichiesta);
if(t==null && (!this.useTransactionIdForTest)){
throw new Exception("Estrazione data dall'id busta ["+idBustaRichiesta+"] non riuscita");
}
pstmt.setTimestamp(index++, t);
}
pstmt.setString(index++, idBustaRichiesta);
pstmt.setString(index++, TipoPdD.APPLICATIVA.getTipo());
}
if(idBustaRisposta!=null){
if(this.openspcoop2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory)){
t = DateUtility.getTimestampIntoIdProtocollo(this.log,protocolBustaBuilder,idBustaRisposta);
if(t==null && (!this.useTransactionIdForTest)){
throw new Exception("Estrazione data dall'id busta ["+idBustaRisposta+"] non riuscita");
}
pstmt.setTimestamp(index++, t);
}
pstmt.setString(index++, idBustaRisposta);
pstmt.setString(index++, TipoPdD.DELEGATA.getTipo());
}
if(this.debug){
SimpleDateFormat dateformat = null;
if(this.openspcoop2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory) && t!=null){
dateformat = DateUtils.getDefaultDateTimeFormatter("yyyy-MM-dd HH:mm");
}
if(idBustaRichiesta!=null){
if(this.openspcoop2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory) && dateformat!=null){
sql = sql.replaceFirst("\\?", "'"+dateformat.format(t)+"'");
}
sql = sql.replaceFirst("\\?", "'"+idBustaRichiesta+"'");
sql = sql.replaceFirst("\\?", "'"+TipoPdD.APPLICATIVA.getTipo()+"'");
}
if(idBustaRisposta!=null){
if(this.openspcoop2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory) && dateformat!=null){
sql = sql.replaceFirst("\\?", "'"+dateformat.format(t)+"'");
}
sql = sql.replaceFirst("\\?", "'"+idBustaRisposta+"'");
sql = sql.replaceFirst("\\?", "'"+TipoPdD.DELEGATA.getTipo()+"'");
}
this.logSql.debug("Eseguo query: "+sql);
}
//System.out.println("esisteTransazione SQL: "+sql);
rs = pstmt.executeQuery();
if(rs.next()){
if(this.debug){
this.logSql.debug("Risultato query: "+true);
}
return true;
}else{
if(this.debug){
this.logSql.debug("Risultato query: "+false);
}
return false;
}
}finally {
if(times!=null) {
long timeEnd = DateManager.getTimeMillis();
long timeProcess = timeEnd-timeStart;
times.read = timeProcess;
}
}
}catch(Exception e){
throw new ProtocolException(e);
}
finally{
try{
if(rs!=null)
rs.close();
}catch(Exception eClose){}
try{
if(pstmt!=null)
pstmt.close();
}catch(Exception eClose){
// close
}
}
}
private void incrementDuplicatiTransazione(IProtocolFactory<?> protocolFactory, boolean richiesta,String idBusta,
Connection con, IBustaBuilder<?> protocolBustaBuilder, TransazioniFiltroDuplicatiProcessTimes times) throws ProtocolException {
PreparedStatement pstmt = null;
try{
if(idBusta==null){
throw new ProtocolException("ID busta non fornito");
}
long timeStart = -1;
try{
if(times!=null) {
timeStart = DateManager.getTimeMillis();
}
ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.tipoDatabaseRuntime);
if(this.openspcoop2Properties.isTransazioniFiltroDuplicatiTramiteTransazioniForceIndex()){
if(this.openspcoop2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory)){
// System.out.println("ADD FORCE INDEX esisteTransazione INDEX1");
sqlQueryObject.addSelectForceIndex(this.nomeTabellaTransazioni, CostantiDB.TABLE_TRANSAZIONI_INDEX_FILTRO_REQ_2);
sqlQueryObject.addSelectForceIndex(this.nomeTabellaTransazioni, CostantiDB.TABLE_TRANSAZIONI_INDEX_FILTRO_RES_2);
}else{
// System.out.println("ADD FORCE INDEX esisteTransazione INDEX2");
sqlQueryObject.addSelectForceIndex(this.nomeTabellaTransazioni, CostantiDB.TABLE_TRANSAZIONI_INDEX_FILTRO_REQ_1);
sqlQueryObject.addSelectForceIndex(this.nomeTabellaTransazioni, CostantiDB.TABLE_TRANSAZIONI_INDEX_FILTRO_RES_1);
}
}
sqlQueryObject.addUpdateTable(this.nomeTabellaTransazioni);
if(richiesta){
sqlQueryObject.addUpdateField(this.colonna_duplicati_richiesta, this.colonna_duplicati_richiesta+"+1");
if(this.openspcoop2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory)){
sqlQueryObject.addWhereCondition(this.colonna_data_id_msg_richiesta+"=?");
}
sqlQueryObject.addWhereCondition(this.colonna_id_messaggio_richiesta+"=?");
sqlQueryObject.addWhereCondition(this.colonna_duplicati_richiesta+">=?");
// Solo una porta applicativa puo' ricevere una busta di richiesta (serve per evitare i problemi in caso di loopback)
sqlQueryObject.addWhereCondition(this.colonna_pdd_ruolo+"=?");
}
else{
sqlQueryObject.addUpdateField(this.colonna_duplicati_risposta, this.colonna_duplicati_risposta+"+1");
if(this.openspcoop2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory)){
sqlQueryObject.addWhereCondition(this.colonna_data_id_msg_risposta+"=?");
}
sqlQueryObject.addWhereCondition(this.colonna_id_messaggio_risposta+"=?");
sqlQueryObject.addWhereCondition(this.colonna_duplicati_risposta+">=?");
// Solo una porta delegata puo' ricevere una busta di risposta (serve per evitare i problemi in caso di loopback)
sqlQueryObject.addWhereCondition(this.colonna_pdd_ruolo+"=?");
}
sqlQueryObject.setANDLogicOperator(true);
Timestamp timestampId = DateUtility.getTimestampIntoIdProtocollo(this.log,protocolBustaBuilder,idBusta);
if(timestampId==null && this.openspcoop2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory) && (!this.useTransactionIdForTest)){
throw new Exception("Estrazione data dall'id busta ["+idBusta+"] non riuscita");
}
String sql = sqlQueryObject.createSQLUpdate();
//System.out.println("incrementDuplicatiTransazione SQL: "+sql);
pstmt = con.prepareStatement(sql);
int index = 1;
if(this.openspcoop2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory)){
pstmt.setTimestamp(index++, timestampId);
}
pstmt.setString(index++, idBusta);
pstmt.setInt(index++, 0);
if(richiesta){
pstmt.setString(index++, TipoPdD.APPLICATIVA.getTipo());
}
else {
pstmt.setString(index++, TipoPdD.DELEGATA.getTipo());
}
if(this.debug){
if(this.openspcoop2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory)){
SimpleDateFormat dateformat = DateUtils.getDefaultDateTimeFormatter("yyyy-MM-dd HH:mm");
sql = sql.replaceFirst("\\?", "'"+dateformat.format(timestampId)+"'");
}
if(idBusta!=null){
sql = sql.replaceFirst("\\?", "'"+idBusta+"'");
}
sql = sql.replaceFirst("\\?", "0");
if(richiesta){
sql = sql.replaceFirst("\\?", "'"+TipoPdD.APPLICATIVA.getTipo()+"'");
}
else {
sql = sql.replaceFirst("\\?", "'"+TipoPdD.DELEGATA.getTipo()+"'");
}
this.logSql.debug("Eseguo query: "+sql);
}
int righeModificate = pstmt.executeUpdate();
if(this.debug){
this.logSql.debug("ID["+idBusta+"] richiesta["+richiesta+"] modificate righe: "+righeModificate);
}
}finally {
if(times!=null) {
long timeEnd = DateManager.getTimeMillis();
long timeProcess = timeEnd-timeStart;
times.update = timeProcess;
}
}
}catch(Exception e){
throw new ProtocolException(e);
}
finally{
try{
if(pstmt!=null)
pstmt.close();
}catch(Exception eClose){
// close
}
}
}
}
class TransazioniFiltroDuplicatiProcessTimes{
long getConnection = -1;
long read = -1;
long update = -1;
long checkExistsRequest = -1;
long checkExistsResponse = -1;
long checkSleep = -1;
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
if(this.getConnection>=0) {
if(sb.length()>0) {
sb.append(" ");
}
sb.append("getConnection:").append(this.getConnection);
}
if(this.read>=0) {
if(sb.length()>0) {
sb.append(" ");
}
sb.append("read:").append(this.read);
}
if(this.update>=0) {
if(sb.length()>0) {
sb.append(" ");
}
sb.append("update:").append(this.update);
}
if(this.checkExistsRequest>=0) {
if(sb.length()>0) {
sb.append(" ");
}
sb.append("checkExistsRequest:").append(this.checkExistsRequest);
}
if(this.checkExistsResponse>=0) {
if(sb.length()>0) {
sb.append(" ");
}
sb.append("checkExistsResponse:").append(this.checkExistsResponse);
}
if(this.checkSleep>=0) {
if(sb.length()>0) {
sb.append(" ");
}
sb.append("checkSleep:").append(this.checkSleep);
}
return sb.toString();
}
}