InfoEsitoTransazioneFormatUtils.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.logger.info;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.transazioni.constants.PddRuolo;
import org.openspcoop2.message.constants.MessageType;
import org.openspcoop2.pdd.logger.LogLevels;
import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.constants.EsitoTransazioneName;
import org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico;
import org.openspcoop2.protocol.utils.EsitiProperties;
import org.openspcoop2.utils.UtilsException;
import org.openspcoop2.utils.json.JSONUtils;
import org.slf4j.Logger;
/**
* InfoEsitoTransazioneFormatUtils
*
* @author Andrea Poli (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*
*/
public class InfoEsitoTransazioneFormatUtils {
public static boolean isEsitoOk(Logger log, Integer esito, String protocollo){
EsitiProperties esitiProperties = null;
try{
esitiProperties = EsitiProperties.getInstanceFromProtocolName(log,protocollo);
}catch(Exception e){
log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
return false;
}
return isEsitoOk(log, esito, esitiProperties);
}
public static boolean isEsitoOk(Logger log, Integer esito, IProtocolFactory<?> protocolFactory){
EsitiProperties esitiProperties = null;
try{
esitiProperties = EsitiProperties.getInstance(log,protocolFactory);
}catch(Exception e){
log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
return false;
}
return isEsitoOk(log, esito, esitiProperties);
}
public static boolean isEsitoOk(Logger log, Integer esito, EsitiProperties esitiProperties){
try{
List<Integer> list = esitiProperties.getEsitiCodeOk_senzaFaultApplicativo();
boolean res = false;
if(list!=null && !list.isEmpty()) {
for (Integer esitoCheck : list) {
if(esitoCheck.intValue() == esito.intValue()) {
res = true;
break;
}
}
}
//System.out.println("isEsitoOk:"+res+" (esitoChecked:"+esito+")");
return res;
}catch(Exception e){
log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
return false;
}
}
public static boolean isEsitoFaultApplicativo(Logger log, Integer esito, String protocollo){
EsitiProperties esitiProperties = null;
try{
esitiProperties = EsitiProperties.getInstanceFromProtocolName(log,protocollo);
}catch(Exception e){
log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
return false;
}
return isEsitoFaultApplicativo(log, esito, esitiProperties);
}
public static boolean isEsitoFaultApplicativo(Logger log, Integer esito, IProtocolFactory<?> protocolFactory){
EsitiProperties esitiProperties = null;
try{
esitiProperties = EsitiProperties.getInstance(log,protocolFactory);
}catch(Exception e){
log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
return false;
}
return isEsitoFaultApplicativo(log, esito, esitiProperties);
}
public static boolean isEsitoFaultApplicativo(Logger log, Integer esito, EsitiProperties esitiProperties){
try{
List<Integer> list = esitiProperties.getEsitiCodeFaultApplicativo();
boolean res = false;
if(list!=null && !list.isEmpty()) {
for (Integer esitoCheck : list) {
if(esitoCheck.intValue() == esito.intValue()) {
res = true;
break;
}
}
}
//System.out.println("isEsitoOk:"+res+" (esitoChecked:"+esito+")");
return res;
}catch(Exception e){
log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
return false;
}
}
public static boolean isEsitoKo(Logger log, Integer esito, String protocollo){
EsitiProperties esitiProperties = null;
try{
esitiProperties = EsitiProperties.getInstanceFromProtocolName(log,protocollo);
}catch(Exception e){
log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
return false;
}
return isEsitoKo(log, esito, esitiProperties);
}
public static boolean isEsitoKo(Logger log, Integer esito, IProtocolFactory<?> protocolFactory){
EsitiProperties esitiProperties = null;
try{
esitiProperties = EsitiProperties.getInstance(log,protocolFactory);
}catch(Exception e){
log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
return false;
}
return isEsitoKo(log, esito, esitiProperties);
}
public static boolean isEsitoKo(Logger log, Integer esito, EsitiProperties esitiProperties){
try{
List<Integer> list = esitiProperties.getEsitiCodeKo_senzaFaultApplicativo();
boolean res = false;
if(list!=null && !list.isEmpty()) {
for (Integer esitoCheck : list) {
if(esitoCheck.intValue() == esito.intValue()) {
res = true;
break;
}
}
}
//System.out.println("isEsitoOk:"+res+" (esitoChecked:"+esito+")");
return res;
}catch(Exception e){
log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
return false;
}
}
public static boolean isVisualizzaFault(Logger log, String fault){
boolean visualizzaMessaggio = true;
if(fault == null)
return false;
StringBuilder contenutoDocumentoStringBuilder = new StringBuilder();
String errore = FormatUtils.getTestoVisualizzabile(log, fault.getBytes(),contenutoDocumentoStringBuilder, false);
if(errore!= null)
return false;
return visualizzaMessaggio;
}
public static String getFaultPretty(Logger log, String fault, String formatoFault){
String toRet = null;
if(fault !=null) {
StringBuilder contenutoDocumentoStringBuilder = new StringBuilder();
String errore = FormatUtils.getTestoVisualizzabile(log, fault.getBytes(),contenutoDocumentoStringBuilder, true);
if(errore!= null)
return "";
MessageType messageType= MessageType.XML;
if(StringUtils.isNotEmpty(formatoFault)) {
messageType = MessageType.valueOf(formatoFault);
}
switch (messageType) {
case BINARY:
case MIME_MULTIPART:
// questi due casi dovrebbero essere gestiti sopra
break;
case JSON:
JSONUtils jsonUtils = JSONUtils.getInstance(true);
try {
toRet = jsonUtils.toString(jsonUtils.getAsNode(fault));
} catch (UtilsException e) {
}
break;
case SOAP_11:
case SOAP_12:
case XML:
default:
toRet = FormatUtils.prettifyXml(log, fault);
break;
}
}
if(toRet == null)
toRet = fault != null ? fault : "";
return toRet;
}
// NOTA: questo ritorna anche il fault nel caso di esito inerente
public static String getDettaglioErrore(Logger log, DatiEsitoTransazione datiEsitoTransazione, List<MsgDiagnostico> msgsParams) {
IProtocolFactory<?> protocolFactory = null;
try {
protocolFactory = datiEsitoTransazione.getProtocolFactory();
}catch(Exception e){
log.error("Errore durante il recupero del ProtocolFactory: "+e.getMessage(),e);
return ""; // non dovrebbe mai succedere
}
if(isEsitoFaultApplicativo(log, datiEsitoTransazione.getEsito(), protocolFactory)) {
if(PddRuolo.APPLICATIVA.equals(datiEsitoTransazione.getPddRuolo())) {
if(isVisualizzaFault(log, datiEsitoTransazione.getFaultIntegrazione())) {
return getFaultPretty(log,datiEsitoTransazione.getFaultIntegrazione(), datiEsitoTransazione.getFormatoFaultIntegrazione());
}
else if(isVisualizzaFault(log, datiEsitoTransazione.getFaultCooperazione())) {
return getFaultPretty(log,datiEsitoTransazione.getFaultCooperazione(), datiEsitoTransazione.getFormatoFaultCooperazione());
}
}
else if(PddRuolo.DELEGATA.equals(datiEsitoTransazione.getPddRuolo())) {
if(isVisualizzaFault(log, datiEsitoTransazione.getFaultCooperazione())) {
return getFaultPretty(log,datiEsitoTransazione.getFaultCooperazione(), datiEsitoTransazione.getFormatoFaultCooperazione());
}
else if(isVisualizzaFault(log, datiEsitoTransazione.getFaultIntegrazione())) {
return getFaultPretty(log,datiEsitoTransazione.getFaultIntegrazione(), datiEsitoTransazione.getFormatoFaultIntegrazione());
}
}
}
// diagnostico rilevante
String erroreRilevante = getMessaggioDiagnosticoErroreRilevante(log, datiEsitoTransazione.getEsito(), protocolFactory, msgsParams, false);
if(erroreRilevante!=null) {
return erroreRilevante;
}
if(!isEsitoFaultApplicativo(log, datiEsitoTransazione.getEsito(), protocolFactory)) {
if(PddRuolo.APPLICATIVA.equals(datiEsitoTransazione.getPddRuolo())) {
if(isVisualizzaFault(log, datiEsitoTransazione.getFaultIntegrazione())) {
return getFaultPretty(log,datiEsitoTransazione.getFaultIntegrazione(), datiEsitoTransazione.getFormatoFaultIntegrazione());
}
else if(isVisualizzaFault(log, datiEsitoTransazione.getFaultCooperazione())) {
return getFaultPretty(log,datiEsitoTransazione.getFaultCooperazione(), datiEsitoTransazione.getFormatoFaultCooperazione());
}
}
else if(PddRuolo.DELEGATA.equals(datiEsitoTransazione.getPddRuolo())) {
if(isVisualizzaFault(log, datiEsitoTransazione.getFaultCooperazione())) {
return getFaultPretty(log,datiEsitoTransazione.getFaultCooperazione(), datiEsitoTransazione.getFormatoFaultCooperazione());
}
else if(isVisualizzaFault(log, datiEsitoTransazione.getFaultIntegrazione())) {
return getFaultPretty(log,datiEsitoTransazione.getFaultIntegrazione(), datiEsitoTransazione.getFormatoFaultIntegrazione());
}
}
}
return null;
}
public static String getMessaggioDiagnosticoErroreRilevante(Logger log, Integer esito, IProtocolFactory<?> protocolFactory, List<MsgDiagnostico> msgsParams, boolean forceIgnoreWarning) {
// Esito
EsitiProperties esitiProperties = null;
EsitoTransazioneName esitoTransactionName = null;
try {
esitiProperties = EsitiProperties.getInstance(log, protocolFactory);
esitoTransactionName = esitiProperties.getEsitoTransazioneName(esito);
}catch(Exception e){
log.error("Errore durante il recupero dell'esito della transazione: "+e.getMessage(),e);
return ""; // non dovrebbe mai succedere
}
List<MsgDiagnostico> msgs = null;
if(msgsParams!=null) {
msgs = new ArrayList<MsgDiagnostico>();
if(!msgsParams.isEmpty()) {
for (MsgDiagnostico msgDiagnostico : msgsParams) {
if(msgDiagnostico.getSeverita()<=LogLevels.SEVERITA_ERROR_INTEGRATION) {
msgs.add(msgDiagnostico);
}
}
}
}
try {
StringBuilder sb = new StringBuilder();
StringBuilder erroreConnessone = new StringBuilder();
StringBuilder erroreSegnalaGenerazioneRispostaErrore = new StringBuilder();
if(msgs!=null && !msgs.isEmpty()) {
for (MsgDiagnostico msgDiagnostico : msgs) {
String codice = msgDiagnostico.getCodice();
if(isEsitoKo(log, esito, protocolFactory) || forceIgnoreWarning) {
// salto gli errori 'warning'
if(MsgDiagnosticiProperties.MSG_DIAGNOSTICI_WARNING.contains(codice)) {
continue;
}
}
if(EsitoTransazioneName.isErroreRisposta(esitoTransactionName) && MsgDiagnosticiProperties.MSG_DIAGNOSTICI_ERRORE_CONNETTORE.contains(codice)) {
if(erroreConnessone.length()>0) {
erroreConnessone.append("\n");
}
erroreConnessone.append(msgDiagnostico.getMessaggio());
}
else if(MsgDiagnosticiProperties.MSG_DIAGNOSTICI_SEGNALA_GENERATA_RISPOSTA_ERRORE.contains(codice)) {
if(erroreSegnalaGenerazioneRispostaErrore.length()>0) {
erroreSegnalaGenerazioneRispostaErrore.append("\n");
}
erroreSegnalaGenerazioneRispostaErrore.append(msgDiagnostico.getMessaggio());
}
else {
if(sb.length()>0) {
sb.append("\n");
}
sb.append(msgDiagnostico.getMessaggio());
break; // serializzo solo il primo diagnostico
}
}
}
if(sb.length()>0) {
return sb.toString();
}
if(erroreConnessone.length()>0) {
return erroreConnessone.toString();
}
if(erroreSegnalaGenerazioneRispostaErrore.length()>0) {
return erroreSegnalaGenerazioneRispostaErrore.toString();
}
}catch(Exception e){
log.error("Errore durante il recupero dell'errore: "+e.getMessage(),e);
}
return null;
}
public static String getMessaggioDiagnosticoWarning(Logger log, Integer esito, IProtocolFactory<?> protocolFactory, List<MsgDiagnostico> msgsParams) {
List<MsgDiagnostico> msgs = null;
if(msgsParams!=null) {
msgs = new ArrayList<MsgDiagnostico>();
if(!msgsParams.isEmpty()) {
for (MsgDiagnostico msgDiagnostico : msgsParams) {
if(msgDiagnostico.getSeverita()<=LogLevels.SEVERITA_ERROR_INTEGRATION) {
msgs.add(msgDiagnostico);
}
}
}
}
try {
StringBuilder sb = new StringBuilder();
if(msgs!=null && !msgs.isEmpty()) {
for (MsgDiagnostico msgDiagnostico : msgs) {
String codice = msgDiagnostico.getCodice();
if(MsgDiagnosticiProperties.MSG_DIAGNOSTICI_WARNING.contains(codice)) {
if(sb.length()>0) {
sb.append("\n");
}
sb.append(msgDiagnostico.getMessaggio());
}
}
}
if(sb.length()>0) {
return sb.toString();
}
}catch(Exception e){
log.error("Errore durante il recupero dell'errore: "+e.getMessage(),e);
}
return null;
}
}