InfoEsitoTransazioneFormatUtils.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */

  20. package org.openspcoop2.pdd.logger.info;

  21. import java.util.ArrayList;
  22. import java.util.List;

  23. import org.apache.commons.lang.StringUtils;
  24. import org.openspcoop2.core.transazioni.constants.PddRuolo;
  25. import org.openspcoop2.message.constants.MessageType;
  26. import org.openspcoop2.pdd.logger.LogLevels;
  27. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  28. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  29. import org.openspcoop2.protocol.sdk.constants.EsitoTransazioneName;
  30. import org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico;
  31. import org.openspcoop2.protocol.utils.EsitiProperties;
  32. import org.openspcoop2.utils.UtilsException;
  33. import org.openspcoop2.utils.json.JSONUtils;
  34. import org.slf4j.Logger;

  35. /**
  36.  * InfoEsitoTransazioneFormatUtils
  37.  *
  38.  * @author Andrea Poli (apoli@link.it)
  39.  * @author $Author$
  40.  * @version $Rev$, $Date$
  41.  *
  42.  */
  43. public class InfoEsitoTransazioneFormatUtils {

  44.     public static boolean isEsitoOk(Logger log, Integer esito, String protocollo){
  45.         EsitiProperties esitiProperties = null;
  46.         try{
  47.             esitiProperties = EsitiProperties.getInstanceFromProtocolName(log,protocollo);
  48.         }catch(Exception e){
  49.             log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
  50.             return false;
  51.         }
  52.         return isEsitoOk(log, esito, esitiProperties);
  53.     }
  54.     public static boolean isEsitoOk(Logger log, Integer esito, IProtocolFactory<?> protocolFactory){
  55.         EsitiProperties esitiProperties = null;
  56.         try{
  57.             esitiProperties = EsitiProperties.getInstance(log,protocolFactory);
  58.         }catch(Exception e){
  59.             log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
  60.             return false;
  61.         }
  62.         return isEsitoOk(log, esito, esitiProperties);
  63.     }
  64.     public static boolean isEsitoOk(Logger log, Integer esito, EsitiProperties esitiProperties){    
  65.         try{
  66.             List<Integer> list = esitiProperties.getEsitiCodeOk_senzaFaultApplicativo();
  67.             boolean res = false;
  68.             if(list!=null && !list.isEmpty()) {
  69.                 for (Integer esitoCheck : list) {
  70.                     if(esitoCheck.intValue() == esito.intValue()) {
  71.                         res = true;
  72.                         break;
  73.                     }
  74.                 }
  75.             }
  76.             //System.out.println("isEsitoOk:"+res+" (esitoChecked:"+esito+")");
  77.             return res;
  78.         }catch(Exception e){
  79.             log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
  80.             return false;
  81.         }
  82.     }
  83.    
  84.     public static boolean isEsitoFaultApplicativo(Logger log, Integer esito, String protocollo){
  85.         EsitiProperties esitiProperties = null;
  86.         try{
  87.             esitiProperties = EsitiProperties.getInstanceFromProtocolName(log,protocollo);
  88.         }catch(Exception e){
  89.             log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
  90.             return false;
  91.         }
  92.         return isEsitoFaultApplicativo(log, esito, esitiProperties);
  93.     }
  94.     public static boolean isEsitoFaultApplicativo(Logger log, Integer esito, IProtocolFactory<?> protocolFactory){
  95.         EsitiProperties esitiProperties = null;
  96.         try{
  97.             esitiProperties = EsitiProperties.getInstance(log,protocolFactory);
  98.         }catch(Exception e){
  99.             log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
  100.             return false;
  101.         }
  102.         return isEsitoFaultApplicativo(log, esito, esitiProperties);
  103.     }
  104.     public static boolean isEsitoFaultApplicativo(Logger log, Integer esito, EsitiProperties esitiProperties){  
  105.         try{
  106.             List<Integer> list = esitiProperties.getEsitiCodeFaultApplicativo();
  107.             boolean res = false;
  108.             if(list!=null && !list.isEmpty()) {
  109.                 for (Integer esitoCheck : list) {
  110.                     if(esitoCheck.intValue() == esito.intValue()) {
  111.                         res = true;
  112.                         break;
  113.                     }
  114.                 }
  115.             }
  116.             //System.out.println("isEsitoOk:"+res+" (esitoChecked:"+esito+")");
  117.             return res;
  118.         }catch(Exception e){
  119.             log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
  120.             return false;
  121.         }
  122.     }
  123.    
  124.     public static boolean isEsitoKo(Logger log, Integer esito, String protocollo){
  125.         EsitiProperties esitiProperties = null;
  126.         try{
  127.             esitiProperties = EsitiProperties.getInstanceFromProtocolName(log,protocollo);
  128.         }catch(Exception e){
  129.             log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
  130.             return false;
  131.         }
  132.         return isEsitoKo(log, esito, esitiProperties);
  133.     }
  134.     public static boolean isEsitoKo(Logger log, Integer esito, IProtocolFactory<?> protocolFactory){
  135.         EsitiProperties esitiProperties = null;
  136.         try{
  137.             esitiProperties = EsitiProperties.getInstance(log,protocolFactory);
  138.         }catch(Exception e){
  139.             log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
  140.             return false;
  141.         }
  142.         return isEsitoKo(log, esito, esitiProperties);
  143.     }
  144.     public static boolean isEsitoKo(Logger log, Integer esito, EsitiProperties esitiProperties){    
  145.         try{
  146.             List<Integer> list = esitiProperties.getEsitiCodeKo_senzaFaultApplicativo();
  147.             boolean res = false;
  148.             if(list!=null && !list.isEmpty()) {
  149.                 for (Integer esitoCheck : list) {
  150.                     if(esitoCheck.intValue() == esito.intValue()) {
  151.                         res = true;
  152.                         break;
  153.                     }
  154.                 }
  155.             }
  156.             //System.out.println("isEsitoOk:"+res+" (esitoChecked:"+esito+")");
  157.             return res;
  158.         }catch(Exception e){
  159.             log.error("Errore durante l'analisi dell'esito ["+esito+"]: "+e.getMessage(),e);
  160.             return false;
  161.         }
  162.     }

  163.     public static boolean isVisualizzaFault(Logger log, String fault){
  164.         boolean visualizzaMessaggio = true;

  165.         if(fault == null)
  166.             return false;

  167.         StringBuilder contenutoDocumentoStringBuilder = new StringBuilder();
  168.         String errore = FormatUtils.getTestoVisualizzabile(log, fault.getBytes(),contenutoDocumentoStringBuilder, false);
  169.         if(errore!= null)
  170.             return false;

  171.         return visualizzaMessaggio;
  172.     }

  173.     public static String getFaultPretty(Logger log, String fault, String formatoFault){
  174.         String toRet = null;
  175.         if(fault !=null) {
  176.             StringBuilder contenutoDocumentoStringBuilder = new StringBuilder();
  177.             String errore = FormatUtils.getTestoVisualizzabile(log, fault.getBytes(),contenutoDocumentoStringBuilder, true);
  178.             if(errore!= null)
  179.                 return "";

  180.             MessageType messageType= MessageType.XML;
  181.             if(StringUtils.isNotEmpty(formatoFault)) {
  182.                 messageType = MessageType.valueOf(formatoFault);
  183.             }

  184.             switch (messageType) {
  185.             case BINARY:
  186.             case MIME_MULTIPART:
  187.                 // questi due casi dovrebbero essere gestiti sopra
  188.                 break;  
  189.             case JSON:
  190.                 JSONUtils jsonUtils = JSONUtils.getInstance(true);
  191.                 try {
  192.                     toRet = jsonUtils.toString(jsonUtils.getAsNode(fault));
  193.                 } catch (UtilsException e) {
  194.                 }
  195.                 break;
  196.             case SOAP_11:
  197.             case SOAP_12:
  198.             case XML:
  199.             default:
  200.                 toRet = FormatUtils.prettifyXml(log, fault);
  201.                 break;
  202.             }
  203.         }

  204.         if(toRet == null)
  205.             toRet = fault != null ? fault : "";

  206.         return toRet;
  207.     }


  208.     // NOTA: questo ritorna anche il fault nel caso di esito inerente
  209.     public static String getDettaglioErrore(Logger log, DatiEsitoTransazione datiEsitoTransazione, List<MsgDiagnostico> msgsParams) {

  210.         IProtocolFactory<?> protocolFactory = null;
  211.         try {
  212.             protocolFactory = datiEsitoTransazione.getProtocolFactory();
  213.         }catch(Exception e){
  214.             log.error("Errore durante il recupero del ProtocolFactory: "+e.getMessage(),e);
  215.             return ""; // non dovrebbe mai succedere
  216.         }
  217.        
  218.         if(isEsitoFaultApplicativo(log, datiEsitoTransazione.getEsito(), protocolFactory)) {

  219.             if(PddRuolo.APPLICATIVA.equals(datiEsitoTransazione.getPddRuolo())) {
  220.                 if(isVisualizzaFault(log, datiEsitoTransazione.getFaultIntegrazione())) {
  221.                     return getFaultPretty(log,datiEsitoTransazione.getFaultIntegrazione(), datiEsitoTransazione.getFormatoFaultIntegrazione());
  222.                 }
  223.                 else if(isVisualizzaFault(log, datiEsitoTransazione.getFaultCooperazione())) {
  224.                     return getFaultPretty(log,datiEsitoTransazione.getFaultCooperazione(), datiEsitoTransazione.getFormatoFaultCooperazione());
  225.                 }
  226.             }
  227.             else if(PddRuolo.DELEGATA.equals(datiEsitoTransazione.getPddRuolo())) {
  228.                 if(isVisualizzaFault(log, datiEsitoTransazione.getFaultCooperazione())) {
  229.                     return getFaultPretty(log,datiEsitoTransazione.getFaultCooperazione(), datiEsitoTransazione.getFormatoFaultCooperazione());
  230.                 }
  231.                 else if(isVisualizzaFault(log, datiEsitoTransazione.getFaultIntegrazione())) {
  232.                     return getFaultPretty(log,datiEsitoTransazione.getFaultIntegrazione(), datiEsitoTransazione.getFormatoFaultIntegrazione());
  233.                 }
  234.             }

  235.         }

  236.         // diagnostico rilevante
  237.         String erroreRilevante = getMessaggioDiagnosticoErroreRilevante(log, datiEsitoTransazione.getEsito(), protocolFactory, msgsParams, false);
  238.         if(erroreRilevante!=null) {
  239.             return erroreRilevante;
  240.         }

  241.         if(!isEsitoFaultApplicativo(log, datiEsitoTransazione.getEsito(), protocolFactory)) {

  242.             if(PddRuolo.APPLICATIVA.equals(datiEsitoTransazione.getPddRuolo())) {
  243.                 if(isVisualizzaFault(log, datiEsitoTransazione.getFaultIntegrazione())) {
  244.                     return getFaultPretty(log,datiEsitoTransazione.getFaultIntegrazione(), datiEsitoTransazione.getFormatoFaultIntegrazione());
  245.                 }
  246.                 else if(isVisualizzaFault(log, datiEsitoTransazione.getFaultCooperazione())) {
  247.                     return getFaultPretty(log,datiEsitoTransazione.getFaultCooperazione(), datiEsitoTransazione.getFormatoFaultCooperazione());
  248.                 }
  249.             }
  250.             else if(PddRuolo.DELEGATA.equals(datiEsitoTransazione.getPddRuolo())) {
  251.                 if(isVisualizzaFault(log, datiEsitoTransazione.getFaultCooperazione())) {
  252.                     return getFaultPretty(log,datiEsitoTransazione.getFaultCooperazione(), datiEsitoTransazione.getFormatoFaultCooperazione());
  253.                 }
  254.                 else if(isVisualizzaFault(log, datiEsitoTransazione.getFaultIntegrazione())) {
  255.                     return getFaultPretty(log,datiEsitoTransazione.getFaultIntegrazione(), datiEsitoTransazione.getFormatoFaultIntegrazione());
  256.                 }
  257.             }

  258.         }

  259.         return null;
  260.     }

  261.     public static String getMessaggioDiagnosticoErroreRilevante(Logger log, Integer esito, IProtocolFactory<?> protocolFactory, List<MsgDiagnostico> msgsParams, boolean forceIgnoreWarning) {
  262.        
  263.         // Esito
  264.         EsitiProperties esitiProperties = null;
  265.         EsitoTransazioneName esitoTransactionName = null;
  266.         try {
  267.             esitiProperties = EsitiProperties.getInstance(log, protocolFactory);
  268.             esitoTransactionName = esitiProperties.getEsitoTransazioneName(esito);
  269.         }catch(Exception e){
  270.             log.error("Errore durante il recupero dell'esito della transazione: "+e.getMessage(),e);
  271.             return ""; // non dovrebbe mai succedere
  272.         }
  273.        
  274.         List<MsgDiagnostico> msgs = null;
  275.         if(msgsParams!=null) {
  276.             msgs = new ArrayList<MsgDiagnostico>();
  277.             if(!msgsParams.isEmpty()) {
  278.                 for (MsgDiagnostico msgDiagnostico : msgsParams) {
  279.                     if(msgDiagnostico.getSeverita()<=LogLevels.SEVERITA_ERROR_INTEGRATION) {
  280.                         msgs.add(msgDiagnostico);
  281.                     }
  282.                 }
  283.             }
  284.         }
  285.        
  286.         try {
  287.             StringBuilder sb = new StringBuilder();
  288.             StringBuilder erroreConnessone = new StringBuilder();
  289.             StringBuilder erroreSegnalaGenerazioneRispostaErrore = new StringBuilder();
  290.             if(msgs!=null && !msgs.isEmpty()) {
  291.                 for (MsgDiagnostico msgDiagnostico : msgs) {
  292.                     String codice = msgDiagnostico.getCodice();

  293.                     if(isEsitoKo(log, esito, protocolFactory) || forceIgnoreWarning) {
  294.                         // salto gli errori 'warning'
  295.                         if(MsgDiagnosticiProperties.MSG_DIAGNOSTICI_WARNING.contains(codice)) {
  296.                             continue;
  297.                         }
  298.                     }

  299.                     if(EsitoTransazioneName.isErroreRisposta(esitoTransactionName) && MsgDiagnosticiProperties.MSG_DIAGNOSTICI_ERRORE_CONNETTORE.contains(codice)) {
  300.                         if(erroreConnessone.length()>0) {
  301.                             erroreConnessone.append("\n");
  302.                         }
  303.                         erroreConnessone.append(msgDiagnostico.getMessaggio());
  304.                     }
  305.                     else if(MsgDiagnosticiProperties.MSG_DIAGNOSTICI_SEGNALA_GENERATA_RISPOSTA_ERRORE.contains(codice)) {
  306.                         if(erroreSegnalaGenerazioneRispostaErrore.length()>0) {
  307.                             erroreSegnalaGenerazioneRispostaErrore.append("\n");
  308.                         }
  309.                         erroreSegnalaGenerazioneRispostaErrore.append(msgDiagnostico.getMessaggio());
  310.                     }
  311.                     else {
  312.                         if(sb.length()>0) {
  313.                             sb.append("\n");
  314.                         }
  315.                         sb.append(msgDiagnostico.getMessaggio());

  316.                         break; // serializzo solo il primo diagnostico
  317.                     }
  318.                 }
  319.             }
  320.             if(sb.length()>0) {
  321.                 return sb.toString();
  322.             }
  323.             if(erroreConnessone.length()>0) {
  324.                 return erroreConnessone.toString();
  325.             }
  326.             if(erroreSegnalaGenerazioneRispostaErrore.length()>0) {
  327.                 return erroreSegnalaGenerazioneRispostaErrore.toString();
  328.             }

  329.         }catch(Exception e){
  330.             log.error("Errore durante il recupero dell'errore: "+e.getMessage(),e);
  331.         }
  332.        
  333.         return null;
  334.     }
  335.    
  336.     public static String getMessaggioDiagnosticoWarning(Logger log, Integer esito, IProtocolFactory<?> protocolFactory, List<MsgDiagnostico> msgsParams) {
  337.        
  338.         List<MsgDiagnostico> msgs = null;
  339.         if(msgsParams!=null) {
  340.             msgs = new ArrayList<MsgDiagnostico>();
  341.             if(!msgsParams.isEmpty()) {
  342.                 for (MsgDiagnostico msgDiagnostico : msgsParams) {
  343.                     if(msgDiagnostico.getSeverita()<=LogLevels.SEVERITA_ERROR_INTEGRATION) {
  344.                         msgs.add(msgDiagnostico);
  345.                     }
  346.                 }
  347.             }
  348.         }
  349.        
  350.         try {
  351.             StringBuilder sb = new StringBuilder();
  352.             if(msgs!=null && !msgs.isEmpty()) {
  353.                 for (MsgDiagnostico msgDiagnostico : msgs) {
  354.                     String codice = msgDiagnostico.getCodice();

  355.                     if(MsgDiagnosticiProperties.MSG_DIAGNOSTICI_WARNING.contains(codice)) {
  356.                         if(sb.length()>0) {
  357.                             sb.append("\n");
  358.                         }
  359.                         sb.append(msgDiagnostico.getMessaggio());
  360.                     }
  361.                    
  362.                 }
  363.             }
  364.             if(sb.length()>0) {
  365.                 return sb.toString();
  366.             }

  367.         }catch(Exception e){
  368.             log.error("Errore durante il recupero dell'errore: "+e.getMessage(),e);
  369.         }
  370.        
  371.         return null;
  372.     }
  373. }