DettaglioEccezioneOpenSPCoop2Builder.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.builder;
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
import java.util.Date;
import org.openspcoop2.core.constants.TipoPdD;
import org.openspcoop2.core.eccezione.details.Dettagli;
import org.openspcoop2.core.eccezione.details.Dettaglio;
import org.openspcoop2.core.eccezione.details.DettaglioEccezione;
import org.openspcoop2.core.eccezione.details.Eccezione;
import org.openspcoop2.core.eccezione.details.Eccezioni;
import org.openspcoop2.core.eccezione.details.constants.TipoEccezione;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.message.config.IntegrationErrorReturnConfiguration;
import org.openspcoop2.protocol.sdk.Busta;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.builder.ProprietaErroreApplicativo;
import org.openspcoop2.protocol.sdk.config.IProtocolManager;
import org.openspcoop2.protocol.sdk.config.ITraduttore;
import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
import org.openspcoop2.protocol.sdk.constants.ContestoCodificaEccezione;
import org.openspcoop2.protocol.sdk.constants.CostantiProtocollo;
import org.openspcoop2.protocol.sdk.constants.ErroreIntegrazione;
import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
import org.openspcoop2.protocol.sdk.constants.MessaggiFaultErroreCooperazione;
import org.openspcoop2.protocol.utils.ErroriProperties;
import org.openspcoop2.utils.LoggerWrapperFactory;
import org.openspcoop2.utils.date.DateManager;
import org.slf4j.Logger;
/**
* DettaglioEccezioneOpenSPCoop2Builder
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class DettaglioEccezioneOpenSPCoop2Builder {
/** Logger utilizzato per debug. */
@SuppressWarnings("unused")
private Logger log = null;
private org.openspcoop2.protocol.sdk.IProtocolFactory<?> protocolFactory;
private ITraduttore traduttore;
private IProtocolManager protocolManager;
private ErroriProperties erroriProperties;
public DettaglioEccezioneOpenSPCoop2Builder(Logger aLog, org.openspcoop2.protocol.sdk.IProtocolFactory<?> protocolFactory) throws ProtocolException{
if(aLog!=null)
this.log = aLog;
else
this.log = LoggerWrapperFactory.getLogger(DettaglioEccezioneOpenSPCoop2Builder.class);
this.protocolFactory = protocolFactory;
this.traduttore = this.protocolFactory.createTraduttore();
this.protocolManager = this.protocolFactory.createProtocolManager();
this.erroriProperties = ErroriProperties.getInstance(this.log);
}
public org.openspcoop2.protocol.sdk.IProtocolFactory<?> getProtocolFactory(){
return this.protocolFactory;
}
// public DettaglioEccezione buildDettaglioEccezione(IDSoggetto identitaPdD, TipoPdD tipoPdD,String modulo,org.openspcoop2.protocol.sdk.constants.CodiceErroreIntegrazione codErrore,String msgErrore,
// IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError)throws ProtocolException{
// return buildDettaglioEccezione_engineBuildEccezione(identitaPdD, tipoPdD, modulo,
// this.traduttore.toString(codErrore, null, this.protocolManager.isGenerazioneDetailsFaultProtocolloConInformazioniGeneriche()),
// false,msgErrore, null, false, false,
// returnConfig, functionError);
// }
// public DettaglioEccezione buildDettaglioEccezioneProcessamentoBusta(IDSoggetto identitaPdD, TipoPdD tipoPdD,String modulo,org.openspcoop2.protocol.sdk.constants.CodiceErroreIntegrazione codErrore,String msgErrore,
// Exception eProcessamento,
// IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError)throws ProtocolException{
// return buildDettaglioEccezione_engineBuildEccezione(identitaPdD, tipoPdD, modulo,
// this.traduttore.toString(codErrore, null, this.protocolManager.isGenerazioneDetailsFaultProtocolloConInformazioniGeneriche()),
// false,msgErrore, eProcessamento, false, false,
// returnConfig, functionError);
// }
// public DettaglioEccezione buildDettaglioEccezioneIntegrazione(IDSoggetto identitaPdD, TipoPdD tipoPdD,String modulo,org.openspcoop2.protocol.sdk.constants.CodiceErroreIntegrazione codErrore,String msgErrore,
// Exception eProcessamento,boolean generaInformazioniGeneriche,
// IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError)throws ProtocolException{
// return buildDettaglioEccezione_engineBuildEccezione(identitaPdD, tipoPdD, modulo,
// this.traduttore.toString(codErrore, null, this.protocolManager.isGenerazioneDetailsFaultProtocolloConInformazioniGeneriche()),
// false,msgErrore, eProcessamento, true, generaInformazioniGeneriche,
// returnConfig, functionError);
// }
public DettaglioEccezione buildDettaglioEccezione(IDSoggetto identitaPdD, TipoPdD tipoPdD,String modulo,ErroreIntegrazione errore,String msgErrore,
IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError) throws ProtocolException{
return buildDettaglioEccezione_engineBuildEccezione(identitaPdD, tipoPdD, modulo,
this.traduttore.toCodiceErroreIntegrazioneAsString(errore, null, this.protocolManager.isGenerazioneDetailsFaultProtocolloConInformazioniGeneriche()),
false,msgErrore, null, false, false,
returnConfig, functionError);
}
public DettaglioEccezione buildDettaglioEccezioneProcessamentoBusta(IDSoggetto identitaPdD, TipoPdD tipoPdD,String modulo,ErroreIntegrazione errore,String msgErrore,
Exception eProcessamento,
IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError) throws ProtocolException{
return buildDettaglioEccezione_engineBuildEccezione(identitaPdD, tipoPdD, modulo,
this.traduttore.toCodiceErroreIntegrazioneAsString(errore, null, this.protocolManager.isGenerazioneDetailsFaultProtocolloConInformazioniGeneriche()),
false,msgErrore, eProcessamento, false, false,
returnConfig, functionError);
}
public DettaglioEccezione buildDettaglioEccezioneIntegrazione(IDSoggetto identitaPdD, TipoPdD tipoPdD,String modulo,ErroreIntegrazione errore,String msgErrore,
Exception eProcessamento,boolean generaInformazioniGeneriche,
IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError) throws ProtocolException{
return buildDettaglioEccezione_engineBuildEccezione(identitaPdD, tipoPdD, modulo,
this.traduttore.toCodiceErroreIntegrazioneAsString(errore, null, this.protocolManager.isGenerazioneDetailsFaultProtocolloConInformazioniGeneriche()),
false,msgErrore, eProcessamento, true, generaInformazioniGeneriche,
returnConfig, functionError);
}
public DettaglioEccezione buildDettaglioEccezione(IDSoggetto identitaPdD, TipoPdD tipoPdD,String modulo,CodiceErroreCooperazione codErrore,String msgErrore,
IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError) throws ProtocolException{
return buildDettaglioEccezione_engineBuildEccezione(identitaPdD, tipoPdD, modulo, this.protocolFactory.createTraduttore().toString(codErrore), true, msgErrore, null, false, false,
returnConfig, functionError);
}
public DettaglioEccezione buildDettaglioEccezioneProcessamentoBusta(IDSoggetto identitaPdD, TipoPdD tipoPdD,String modulo,CodiceErroreCooperazione codErrore,String msgErrore,
Exception eProcessamento,
IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError) throws ProtocolException{
return buildDettaglioEccezione_engineBuildEccezione(identitaPdD, tipoPdD, modulo, this.protocolFactory.createTraduttore().toString(codErrore), true, msgErrore,
eProcessamento, false, false,
returnConfig, functionError);
}
public DettaglioEccezione buildDettaglioEccezioneIntegrazione(IDSoggetto identitaPdD, TipoPdD tipoPdD,String modulo,CodiceErroreCooperazione codErrore,String msgErrore,
Exception eProcessamento,boolean generaInformazioniGeneriche,
IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError) throws ProtocolException{
return buildDettaglioEccezione_engineBuildEccezione(identitaPdD, tipoPdD, modulo, this.protocolFactory.createTraduttore().toString(codErrore), true, msgErrore,
eProcessamento, true, generaInformazioniGeneriche,
returnConfig, functionError);
}
public DettaglioEccezione buildDettaglioEccezione(IDSoggetto identitaPdD, TipoPdD tipoPdD,String modulo,String codErrore,String msgErrore,boolean isErroreProtocollo,
IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError) throws ProtocolException{
return buildDettaglioEccezione_engineBuildEccezione(identitaPdD, tipoPdD, modulo, codErrore, isErroreProtocollo, msgErrore, null, false, false,
returnConfig, functionError);
}
public DettaglioEccezione buildDettaglioEccezioneProcessamentoBusta(IDSoggetto identitaPdD, TipoPdD tipoPdD,String modulo,String codErrore,String msgErrore,boolean isErroreProtocollo,
Exception eProcessamento,
IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError) throws ProtocolException{
return buildDettaglioEccezione_engineBuildEccezione(identitaPdD, tipoPdD, modulo, codErrore, isErroreProtocollo,msgErrore, eProcessamento, false, false,
returnConfig, functionError);
}
public DettaglioEccezione buildDettaglioEccezioneIntegrazione(IDSoggetto identitaPdD, TipoPdD tipoPdD,String modulo,String codErrore,String msgErrore,boolean isErroreProtocollo,
Exception eProcessamento,boolean generaInformazioniGeneriche,
IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError) throws ProtocolException{
return buildDettaglioEccezione_engineBuildEccezione(identitaPdD, tipoPdD, modulo, codErrore, isErroreProtocollo,msgErrore, eProcessamento, true, generaInformazioniGeneriche,
returnConfig, functionError);
}
private DettaglioEccezione buildDettaglioEccezione_engineBuildEccezione(IDSoggetto identitaPdD, TipoPdD tipoPdD,String modulo,String codErrore,boolean isErroreProtocollo,String msgErrore,
Exception eProcessamento,boolean isIntegrazione,boolean generaInformazioniGeneriche,
IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError) throws ProtocolException{
org.openspcoop2.core.eccezione.details.Eccezione eccezione = new org.openspcoop2.core.eccezione.details.Eccezione();
if(isErroreProtocollo){
eccezione.setType(TipoEccezione.PROTOCOL);
}else{
eccezione.setType(TipoEccezione.INTEGRATION);
}
eccezione.setCode(codErrore);
eccezione.setDescription(msgErrore);
return buildDettaglioEccezione_engine(DateManager.getDate(), identitaPdD, tipoPdD , modulo, eccezione, null,
eProcessamento, isIntegrazione, generaInformazioniGeneriche,
returnConfig, functionError);
}
public DettaglioEccezione buildDettaglioEccezione(Date oraRegistrazione, IDSoggetto identitaPdD, TipoPdD tipoPdD, String modulo, Eccezione eccezione, Dettaglio dettaglio,
IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError) throws ProtocolException{
return buildDettaglioEccezione_engine(oraRegistrazione, identitaPdD, tipoPdD, modulo, eccezione, dettaglio, null, false, false,
returnConfig, functionError);
}
public DettaglioEccezione buildDettaglioEccezioneProcessamentoBusta(Date oraRegistrazione, IDSoggetto identitaPdD,TipoPdD tipoPdD, String modulo, Eccezione eccezione, Dettaglio dettaglio,
Exception eProcessamento,
IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError) throws ProtocolException{
return buildDettaglioEccezione_engine(oraRegistrazione, identitaPdD, tipoPdD, modulo, eccezione, dettaglio, eProcessamento, false, false,
returnConfig, functionError);
}
public DettaglioEccezione buildDettaglioEccezioneIntegrazione(Date oraRegistrazione, IDSoggetto identitaPdD,TipoPdD tipoPdD, String modulo, Eccezione eccezione, Dettaglio dettaglio,
Exception eProcessamento,boolean generaInformazioniGeneriche,
IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError) throws ProtocolException{
return buildDettaglioEccezione_engine(oraRegistrazione, identitaPdD, tipoPdD, modulo, eccezione, dettaglio, eProcessamento, true, generaInformazioniGeneriche,
returnConfig, functionError);
}
private DettaglioEccezione buildDettaglioEccezione_engine(Date oraRegistrazione, IDSoggetto identitaPdD,TipoPdD tipoPdD, String modulo, Eccezione eccezione, Dettaglio dettaglio,
Exception eProcessamento,boolean isIntegrazione,boolean generaInformazioniGeneriche,
IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError) throws ProtocolException{
DettaglioEccezione dettaglioEccezione = DaoBuilder.buildDettaglioEccezione(oraRegistrazione, identitaPdD, tipoPdD, modulo, eccezione, dettaglio,
returnConfig, functionError, this.erroriProperties);
if(eProcessamento!=null){
if(isIntegrazione){
gestioneDettaglioEccezioneIntegrazione(eProcessamento, dettaglioEccezione, generaInformazioniGeneriche);
}else{
gestioneDettaglioEccezioneProcessamento(eProcessamento, dettaglioEccezione);
}
}
return dettaglioEccezione;
}
// METODO CHIAMATO SOLO DALLA PDD EROGATORE PER GENERARE IL DETTAGLIO DI UNA BUSTA ERRORE
public DettaglioEccezione buildDettaglioEccezioneFromBusta(IDSoggetto identitaPdD,TipoPdD tipoPdD,
String modulo,
String servizioApplicativoErogatore,
Busta busta,
Throwable eProcessamento) throws ProtocolException{
DettaglioEccezione dettaglioEccezione = new DettaglioEccezione();
// info generali
dettaglioEccezione.setTimestamp(DateManager.getDate());
dettaglioEccezione.setDomain(DaoBuilder.buildDominio(identitaPdD, tipoPdD, modulo));
// eccezioni buste
for (int i = 0; i < busta.sizeListaEccezioni(); i++) {
org.openspcoop2.protocol.sdk.Eccezione e = busta.getEccezione(i);
org.openspcoop2.core.eccezione.details.Eccezione eccezione = new org.openspcoop2.core.eccezione.details.Eccezione();
eccezione.setType(TipoEccezione.PROTOCOL);
eccezione.setCode(e.getCodiceEccezioneValue(this.protocolFactory));
eccezione.setSeverity(e.getRilevanzaValue(this.protocolFactory));
if(this.protocolManager.isGenerazioneDetailsFaultProtocolloConInformazioniGeneriche()){
eccezione.setDescription(this.transformFaultMsg(e.getCodiceEccezione(), e.getDescrizione(this.protocolFactory)));
eccezione.setContext(this.protocolFactory.createTraduttore().toString(ContestoCodificaEccezione.PROCESSAMENTO));
}
else{
eccezione.setDescription(e.getDescrizione(this.protocolFactory));
eccezione.setContext(this.protocolFactory.createTraduttore().toString(e.getContestoCodifica()));
}
if(dettaglioEccezione.getExceptions()==null){
dettaglioEccezione.setExceptions(new Eccezioni());
}
dettaglioEccezione.getExceptions().addException(eccezione);
}
// dettagli
if(this.protocolManager.isGenerazioneDetailsFaultProtocolloConInformazioniGeneriche()==false){
if(servizioApplicativoErogatore!=null){
Dettaglio detail = new Dettaglio();
detail.setType("servizioApplicativo");
detail.setBase(servizioApplicativoErogatore);
if(dettaglioEccezione.getDetails()==null){
dettaglioEccezione.setDetails(new Dettagli());
}
dettaglioEccezione.getDetails().addDetail(detail);
}
}
gestioneDettaglioEccezioneProcessamento(eProcessamento, dettaglioEccezione);
return dettaglioEccezione;
}
public void gestioneDettaglioEccezioneIntegrazione(Throwable eProcessamento,DettaglioEccezione dettaglioEccezione,boolean generaInformazioniGeneriche){
gestioneDettaglioEccezioneProcessamento_engine(eProcessamento, dettaglioEccezione,
this.protocolManager.isGenerazioneDetailsFaultIntegrationeConStackTrace(),
generaInformazioniGeneriche);
}
public void gestioneDettaglioEccezioneProcessamento(Throwable eProcessamento,DettaglioEccezione dettaglioEccezione){
gestioneDettaglioEccezioneProcessamento_engine(eProcessamento, dettaglioEccezione,
this.protocolManager.isGenerazioneDetailsFaultProtocolloConStackTrace(),
this.protocolManager.isGenerazioneDetailsFaultProtocolloConInformazioniGeneriche());
}
private void gestioneDettaglioEccezioneProcessamento_engine(Throwable eProcessamento,DettaglioEccezione dettaglioEccezione,
boolean generaStackTrace,boolean generaInformazioniGeneriche){
if(eProcessamento!=null){
if(generaInformazioniGeneriche){
Dettaglio detail = new Dettaglio();
detail.setType("causa");
String msg = null;
if(eProcessamento.getMessage()!=null){
msg = eProcessamento.getMessage();
}else{
msg = eProcessamento.toString();
}
//System.out.println("MESSAGE ["+msg+"]");
// faccio viaggiare solo le informazioni che ritengo pubbliche
if("Connection refused".equals(msg)){
msg = "Connection refused";
detail.setBase(msg);
if(dettaglioEccezione.getDetails()==null){
dettaglioEccezione.setDetails(new Dettagli());
}
dettaglioEccezione.getDetails().addDetail(detail);
}else if("Read timed out".equals(msg)){
msg = "Read timed out";
detail.setBase(msg);
if(dettaglioEccezione.getDetails()==null){
dettaglioEccezione.setDetails(new Dettagli());
}
dettaglioEccezione.getDetails().addDetail(detail);
}else if("connect timed out".equals(msg)){
msg = "Connect timed out";
detail.setBase(msg);
if(dettaglioEccezione.getDetails()==null){
dettaglioEccezione.setDetails(new Dettagli());
}
dettaglioEccezione.getDetails().addDetail(detail);
}
}else{
Dettaglio detail = new Dettaglio();
detail.setType("causa");
if(eProcessamento.getMessage()!=null)
detail.setBase(eProcessamento.getMessage());
else
detail.setBase(eProcessamento.toString());
if(dettaglioEccezione.getDetails()==null){
dettaglioEccezione.setDetails(new Dettagli());
}
dettaglioEccezione.getDetails().addDetail(detail);
if(eProcessamento.getCause()!=null){
gestioneDettaglioEccezioneProcessamento_engine_InnerException(eProcessamento.getCause(), dettaglioEccezione);
}
if(generaStackTrace){
Dettaglio detailStackTrace = new Dettaglio();
detailStackTrace.setType("stackTrace");
ByteArrayOutputStream bout = new ByteArrayOutputStream();
PrintWriter pWriter = new PrintWriter(bout);
eProcessamento.printStackTrace(pWriter);
try{
bout.flush();
pWriter.flush();
pWriter.close();
bout.close();
}catch(Exception eClose){
System.err.println("ERRORE buildEccezioneProcessamentoFromBusta: "+eClose.getMessage());
}
detailStackTrace.setBase(bout.toString());
if(dettaglioEccezione.getDetails()==null){
dettaglioEccezione.setDetails(new Dettagli());
}
dettaglioEccezione.getDetails().addDetail(detailStackTrace);
}
}
}
}
private void gestioneDettaglioEccezioneProcessamento_engine_InnerException(Throwable e,DettaglioEccezione dettaglioEccezione){
if(e!=null){
Dettaglio detail = new Dettaglio();
detail.setType("causato da");
if(e.getMessage()!=null)
detail.setBase(e.getMessage());
else
detail.setBase(e.toString());
if(dettaglioEccezione.getDetails()==null){
dettaglioEccezione.setDetails(new Dettagli());
}
dettaglioEccezione.getDetails().addDetail(detail);
if(e.getCause()!=null){
gestioneDettaglioEccezioneProcessamento_engine_InnerException(e.getCause(), dettaglioEccezione);
}
}
}
public Eccezione buildEccezione(String codice, String descrizione, String rilevanza, String contesto, boolean isErroreProtocollo){
return DaoBuilder.buildEccezione(codice, descrizione, rilevanza, contesto, isErroreProtocollo);
}
public Dettaglio buildDettagio(String tipo, String base){
Dettaglio dettaglio = new Dettaglio();
dettaglio.setType(tipo);
dettaglio.setBase(base);
return dettaglio;
}
public String transformFaultMsg(CodiceErroreCooperazione code,String msg) throws ProtocolException{
if(this.protocolManager.isGenerazioneDetailsFaultProtocolloConInformazioniGeneriche()){
if(code.equals(CodiceErroreCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO)){
//errore di processamento.
// Lascio intatto solo il msg di ServizioApplicativo non disponibile
if(!CostantiProtocollo.SERVIZIO_APPLICATIVO_NON_DISPONIBILE.equals(msg)){
return MessaggiFaultErroreCooperazione.FAULT_STRING_PROCESSAMENTO_SENZA_CODICE.toString(this.protocolFactory);
}
}
}
return msg;
}
public String transformFaultMsg(ErroreIntegrazione errore) throws ProtocolException{
if(this.protocolManager.isGenerazioneDetailsFaultProtocolloConInformazioniGeneriche()){
// Mi appoggio a questa utility
ProprietaErroreApplicativo pErroreApplicativo = new ProprietaErroreApplicativo();
pErroreApplicativo.setFaultAsGenericCode(true);
return pErroreApplicativo.transformFaultMsg(errore,this.protocolFactory);
}
return errore.getDescrizione(this.protocolFactory);
}
}