RollbackRepositoryBuste.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.engine.driver;
import java.sql.Connection;
import java.sql.PreparedStatement;
import org.slf4j.Logger;
import org.openspcoop2.protocol.engine.Configurazione;
import org.openspcoop2.protocol.engine.constants.Costanti;
import org.openspcoop2.protocol.engine.driver.repository.IGestoreRepository;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.state.IState;
import org.openspcoop2.protocol.sdk.state.StateMessage;
import org.openspcoop2.utils.LoggerWrapperFactory;
/**
* Classe utilizzata per effettuare rollback applicativo
* di informazioni salvate precedentemente nei DB.
*
*
* @author Poli Andrea (apoli@link.it)
* @author Tronci Fabio (tronci@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class RollbackRepositoryBuste implements java.io.Serializable {
/**
* serialVersionUID
*/
private static final long serialVersionUID = 1L;
/** Logger utilizzato per debug. */
private Logger log = null;
/** Se IState e' un'istanza di StatefulMessage possiede una Connessione SQL in autoCommit mode su cui effettuare query
* Altrimenti, e' un'istanza di StatelessMessage e nn necessita di connessioni */
private IState state;
/** Identificativo */
private String idBusta;
/** GestoreRepository */
private IGestoreRepository gestoreRepositoryBuste;
/** Indicazione se stiamo gestendo il onewat in modalita 11 */
//private boolean oneWay11 = false;
/* ******** C O S T R U T T O R E ******** */
/**
* Costruttore.
*
* @param id ID su cui effettuare il rollback delle precedenti informazioni salvate.
* @param state Oggetto che rappresenta lo stato di una busta
*
*/
public RollbackRepositoryBuste(String id, IState state,boolean oneWay11){
this(id,state,Configurazione.getLibraryLog(),oneWay11);
}
/**
* Costruttore.
*
* @param id ID su cui effettuare il rollback delle precedenti informazioni salvate.
* @param state Oggetto che rappresenta lo stato di una busta
*
*/
public RollbackRepositoryBuste(String id,IState state,Logger aLog,boolean oneWay11){
this.idBusta = id;
this.state = state;
this.gestoreRepositoryBuste = Configurazione.getGestoreRepositoryBuste();
if(aLog!=null)
this.log = aLog;
else
this.log = LoggerWrapperFactory.getLogger(RollbackRepositoryBuste.class.getName());
//this.oneWay11 = oneWay11;
}
/**
* Metodo che si occupa di eliminare tutti i dati creati durante una gestione di una richiesta
* in una fase di Porta di Dominio Delegata (Invocazione di una porta di dominio delegata).
*
*
*/
public void rollbackBustaIntoOutBox() throws ProtocolException{
this.rollback(Costanti.OUTBOX,true);
}
/**
* Metodo che si occupa di eliminare tutti i dati creati durante una gestione di una richiesta
* in una fase di Porta di Dominio Delegata (Invocazione di una porta di dominio delegata).
*
* @param rollbackAccessoHistory rollback dell'accesso effettuato dall'History
*
*/
public void rollbackBustaIntoOutBox(boolean rollbackAccessoHistory) throws ProtocolException{
this.rollback(Costanti.OUTBOX,rollbackAccessoHistory);
}
/**
* Metodo che si occupa di eliminare tutti i dati creati durante una gestione di una richiesta
* in una fase di Porta di Dominio Applicativa (Invocazione di una porta di dominio applicativa).
*
*
*/
public void rollbackBustaIntoInBox() throws ProtocolException{
this.rollback(Costanti.INBOX,true);
}
/**
* Metodo che si occupa di eliminare tutti i dati creati durante una gestione di una richiesta
* in una fase di Porta di Dominio Applicativa (Invocazione di una porta di dominio applicativa).
*
* @param rollbackAccessoHistory rollback dell'accesso effettuato dall'History
*
*/
public void rollbackBustaIntoInBox(boolean rollbackAccessoHistory) throws ProtocolException{
this.rollback(Costanti.INBOX,rollbackAccessoHistory);
}
/* ******** UTILITY DI ROLLBACK APPLICATIVO ******** */
/**
* Metodo che si occupa di eliminare i dati di una busta presente nel RepositoryBuste.
*
* @param tipoBusta tipo di busta INBOX/OUTBOX
* @param rollbackAccessoHistory rollback dell'accesso effettuato dall'History
*
*/
public void rollback(String tipoBusta,boolean rollbackAccessoHistory) throws ProtocolException{
StateMessage stateMSG = (StateMessage)this.state;
Connection connectionDB = stateMSG.getConnectionDB();
if(connectionDB!=null){
PreparedStatement pstmtUpdateHistory = null;
PreparedStatement pstmtUpdateProfilo = null;
PreparedStatement pstmtUpdatePdd = null;
try{
// Le prepared Stamenent devono essere suddivise, per Oracle, ad es, non accetta SET di stessi field.
// rollback AccessoHistory
if(rollbackAccessoHistory){
StringBuilder queryUpdateHistory = new StringBuilder();
queryUpdateHistory.append("UPDATE ");
queryUpdateHistory.append(Costanti.REPOSITORY);
queryUpdateHistory.append(" SET ");
queryUpdateHistory.append(this.gestoreRepositoryBuste.createSQLSet_History(false));
queryUpdateHistory.append(" WHERE ID_MESSAGGIO = ? AND TIPO=?");
pstmtUpdateHistory = connectionDB.prepareStatement(queryUpdateHistory.toString());
pstmtUpdateHistory.setString(1,this.idBusta);
pstmtUpdateHistory.setString(2,tipoBusta);
// Add PreparedStatement
stateMSG.getPreparedStatement().put("RollbackGeneraleHISTORY_"+tipoBusta+"_"+this.idBusta,pstmtUpdateHistory);
}
// rollback profilo
StringBuilder queryUpdateProfilo= new StringBuilder();
queryUpdateProfilo.append("UPDATE ");
queryUpdateProfilo.append(Costanti.REPOSITORY);
queryUpdateProfilo.append(" SET ");
queryUpdateProfilo.append(this.gestoreRepositoryBuste.createSQLSet_ProfiloCollaborazione(false));
queryUpdateProfilo.append(" WHERE ID_MESSAGGIO = ? AND TIPO=?");
pstmtUpdateProfilo = connectionDB.prepareStatement(queryUpdateProfilo.toString());
pstmtUpdateProfilo.setString(1,this.idBusta);
pstmtUpdateProfilo.setString(2,tipoBusta);
// Add PreparedStatement
stateMSG.getPreparedStatement().put("RollbackGeneralePROFILO_"+tipoBusta+"_"+this.idBusta,pstmtUpdateProfilo);
// rollback pdd
StringBuilder queryUpdatePdd = new StringBuilder();
queryUpdatePdd.append("UPDATE ");
queryUpdatePdd.append(Costanti.REPOSITORY);
queryUpdatePdd.append(" SET ");
queryUpdatePdd.append(this.gestoreRepositoryBuste.createSQLSet_PdD(false));
queryUpdatePdd.append(" WHERE ID_MESSAGGIO = ? AND TIPO=?");
pstmtUpdatePdd = connectionDB.prepareStatement(queryUpdatePdd.toString());
pstmtUpdatePdd.setString(1,this.idBusta);
pstmtUpdatePdd.setString(2,tipoBusta);
// Add PreparedStatement
stateMSG.getPreparedStatement().put("RollbackGeneralePDD_"+tipoBusta+"_"+this.idBusta,pstmtUpdatePdd);
} catch(Exception e) {
String errorMsg = "ROLLBACK_BUSTE, Errore "+tipoBusta+"/"+this.idBusta+": "+e.getMessage();
this.log.info(errorMsg,e);
try{
if( pstmtUpdateHistory != null )
pstmtUpdateHistory.close();
} catch(Exception er) {
// close
}
try{
if( pstmtUpdateProfilo != null )
pstmtUpdateProfilo.close();
} catch(Exception er) {
// close
}
try{
if( pstmtUpdatePdd != null )
pstmtUpdatePdd.close();
} catch(Exception er) {
// close
}
throw new ProtocolException(errorMsg,e);
}
}else{
this.log.debug("Rollback("+tipoBusta+"/"+this.idBusta+") non effettuato, connessione is null");
}
}
/* ******** UTILITY DI SET ACCESSI ******** */
/**
* Metodo che si occupa di eliminare i dati di una busta presente nel RepositoryBuste.
*
* @param history accesso effettuato dall'History
* @param profilo accesso effettuato dall'History
* @param pdd accesso effettuato dall'History
*
*/
public void clearAccessiIntoInBox(boolean history,boolean profilo,boolean pdd) throws ProtocolException{
clearAccessi(Costanti.INBOX,history,profilo,pdd);
}
/**
* Metodo che si occupa di eliminare i dati di una busta presente nel RepositoryBuste.
*
* @param history accesso effettuato dall'History
* @param profilo accesso effettuato dall'History
* @param pdd accesso effettuato dall'History
*
*/
public void clearAccessiIntoOutBox(boolean history,boolean profilo,boolean pdd) throws ProtocolException{
clearAccessi(Costanti.OUTBOX,history,profilo,pdd);
}
/**
* Metodo che si occupa di eliminare i dati di una busta presente nel RepositoryBuste.
*
* @param tipoBusta tipo di busta INBOX/OUTBOX
* @param history accesso effettuato dall'History
* @param profilo accesso effettuato dall'History
* @param pdd accesso effettuato dall'History
*
*/
private void clearAccessi(String tipoBusta,boolean history,boolean profilo,boolean pdd) throws ProtocolException{
StateMessage stateMSG = (StateMessage)this.state;
Connection connectionDB = stateMSG.getConnectionDB();
if(connectionDB!=null){
PreparedStatement pstmtUpdateHistory = null;
PreparedStatement pstmtUpdateProfilo = null;
PreparedStatement pstmtUpdatePdd = null;
try{
if(history==false && profilo==false && pdd==false)
return;
// rollback AccessoHistory
if(history){
StringBuilder queryUpdateHistory = new StringBuilder();
queryUpdateHistory.append("UPDATE ");
queryUpdateHistory.append(Costanti.REPOSITORY);
queryUpdateHistory.append(" SET ");
queryUpdateHistory.append(this.gestoreRepositoryBuste.createSQLSet_History(false));
queryUpdateHistory.append(" WHERE ID_MESSAGGIO = ? AND TIPO=?");
pstmtUpdateHistory = connectionDB.prepareStatement(queryUpdateHistory.toString());
pstmtUpdateHistory.setString(1,this.idBusta);
pstmtUpdateHistory.setString(2,tipoBusta);
// Add PreparedStatement
stateMSG.getPreparedStatement().put("ClearAccessiHISTORY_"+tipoBusta+"_"+this.idBusta,pstmtUpdateHistory);
}
// rollback profilo
if(profilo){
StringBuilder queryUpdateProfilo= new StringBuilder();
queryUpdateProfilo.append("UPDATE ");
queryUpdateProfilo.append(Costanti.REPOSITORY);
queryUpdateProfilo.append(" SET ");
queryUpdateProfilo.append(this.gestoreRepositoryBuste.createSQLSet_ProfiloCollaborazione(false));
queryUpdateProfilo.append(" WHERE ID_MESSAGGIO = ? AND TIPO=?");
pstmtUpdateProfilo = connectionDB.prepareStatement(queryUpdateProfilo.toString());
pstmtUpdateProfilo.setString(1,this.idBusta);
pstmtUpdateProfilo.setString(2,tipoBusta);
// Add PreparedStatement
stateMSG.getPreparedStatement().put("ClearAccessiPROFILO_"+tipoBusta+"_"+this.idBusta,pstmtUpdateProfilo);
}
// rollback pdd
if(pdd){
StringBuilder queryUpdatePdd = new StringBuilder();
queryUpdatePdd.append("UPDATE ");
queryUpdatePdd.append(Costanti.REPOSITORY);
queryUpdatePdd.append(" SET ");
queryUpdatePdd.append(this.gestoreRepositoryBuste.createSQLSet_PdD(false));
queryUpdatePdd.append(" WHERE ID_MESSAGGIO = ? AND TIPO=?");
pstmtUpdatePdd = connectionDB.prepareStatement(queryUpdatePdd.toString());
pstmtUpdatePdd.setString(1,this.idBusta);
pstmtUpdatePdd.setString(2,tipoBusta);
// Add PreparedStatement
stateMSG.getPreparedStatement().put("ClearAccessiPDD_"+tipoBusta+"_"+this.idBusta,pstmtUpdatePdd);
}
} catch(Exception e) {
String errorMsg = "ROLLBACK_BUSTE, setAccessi Errore "+tipoBusta+"/"+this.idBusta+": "+e.getMessage();
this.log.info(errorMsg,e);
try{
if( pstmtUpdateHistory != null )
pstmtUpdateHistory.close();
} catch(Exception er) {
// close
}
try{
if( pstmtUpdateProfilo != null )
pstmtUpdateProfilo.close();
} catch(Exception er) {
// close
}
try{
if( pstmtUpdatePdd != null )
pstmtUpdatePdd.close();
} catch(Exception er) {
// close
}
throw new ProtocolException(errorMsg,e);
}
}else{
this.log.debug("clearAccessi("+tipoBusta+"/"+this.idBusta+") non effettuato, connessione is null");
}
}
}