DaoBuilder.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.protocol.engine.builder;

  21. import java.io.ByteArrayOutputStream;
  22. import java.io.PrintWriter;
  23. import java.util.Date;

  24. import org.openspcoop2.core.constants.TipoPdD;
  25. import org.openspcoop2.core.eccezione.details.Dettagli;
  26. import org.openspcoop2.core.eccezione.details.Dettaglio;
  27. import org.openspcoop2.core.eccezione.details.DettaglioEccezione;
  28. import org.openspcoop2.core.eccezione.details.Dominio;
  29. import org.openspcoop2.core.eccezione.details.DominioSoggetto;
  30. import org.openspcoop2.core.eccezione.details.Eccezione;
  31. import org.openspcoop2.core.eccezione.details.Eccezioni;
  32. import org.openspcoop2.core.eccezione.details.constants.TipoEccezione;
  33. import org.openspcoop2.core.id.IDSoggetto;
  34. import org.openspcoop2.message.config.IntegrationErrorReturnConfiguration;
  35. import org.openspcoop2.protocol.basic.Costanti;
  36. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  37. import org.openspcoop2.protocol.sdk.ProtocolException;
  38. import org.openspcoop2.protocol.sdk.config.IProtocolManager;
  39. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  40. import org.openspcoop2.protocol.utils.ErroriProperties;
  41. import org.openspcoop2.utils.date.DateManager;

  42. /**
  43.  * DAOBuilder
  44.  *
  45.  * @author Poli Andrea (apoli@link.it)
  46.  * @author $Author$
  47.  * @version $Rev$, $Date$
  48.  */


  49. public class DaoBuilder {
  50.     /** ------------------- Metodi che generano un DettaglioEccezione ---------------- */

  51.     public static Dominio buildDominio(IDSoggetto identitaPdD,TipoPdD tipoPdD,String modulo){
  52.         org.openspcoop2.core.eccezione.details.constants.TipoPdD idFunzione = null;
  53.         if(TipoPdD.DELEGATA.equals(tipoPdD)){
  54.             idFunzione = org.openspcoop2.core.eccezione.details.constants.TipoPdD.OUTBOUND_PROXY;
  55.         }
  56.         else if(TipoPdD.APPLICATIVA.equals(tipoPdD)){
  57.             idFunzione = org.openspcoop2.core.eccezione.details.constants.TipoPdD.INBOUND_PROXY;
  58.         }
  59.         else if(TipoPdD.INTEGRATION_MANAGER.equals(tipoPdD)){
  60.             idFunzione = org.openspcoop2.core.eccezione.details.constants.TipoPdD.INTEGRATION_MANAGER;
  61.         }
  62.         else if(TipoPdD.ROUTER.equals(tipoPdD)){
  63.             idFunzione = org.openspcoop2.core.eccezione.details.constants.TipoPdD.ROUTER;
  64.         }
  65.        
  66.         Dominio dominio = new Dominio();
  67.         DominioSoggetto dominioSoggetto = new DominioSoggetto();
  68.         dominioSoggetto.setBase(identitaPdD.getNome());
  69.         dominioSoggetto.setType(identitaPdD.getTipo());
  70.         dominio.setOrganization(dominioSoggetto);
  71.         dominio.setId(identitaPdD.getCodicePorta());
  72.         dominio.setRole(idFunzione);
  73.         dominio.setModule(modulo);
  74.         return dominio;
  75.     }
  76.    
  77.     private static void setCodeInEccezione(String codErrore,  org.openspcoop2.core.eccezione.details.Eccezione eccezione,
  78.             IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError, ErroriProperties erroriProperties) throws ProtocolException {
  79.         if(Costanti.isTRANSACTION_ERROR_STATUS_ABILITATO()){
  80.             eccezione.setCode(codErrore);
  81.         }
  82.         else {
  83.             String govwayType = erroriProperties.getErrorType(functionError);
  84.             eccezione.setCode(govwayType);
  85.         }
  86.     }
  87.     private static void setDescriptionInEccezione(String descrErrore,  org.openspcoop2.core.eccezione.details.Eccezione eccezione,
  88.             IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError, ErroriProperties erroriProperties) throws ProtocolException {
  89.        
  90.         boolean genericDetails = returnConfig.isGenericDetails();
  91.         if(!genericDetails && erroriProperties.isForceGenericDetails(functionError)) {
  92.             genericDetails = true;
  93.         }
  94.         if (Costanti.isTRANSACTION_FORCE_SPECIFIC_ERROR_DETAILS()) {
  95.             genericDetails = false;
  96.         }
  97.        
  98.         if(genericDetails){
  99.             String govwayDetails = erroriProperties.getGenericDetails(functionError);
  100.             eccezione.setDescription(govwayDetails);
  101.         }
  102.         else {
  103.             eccezione.setDescription(descrErrore);
  104.         }
  105.     }
  106.     private static void addDettaglio(Dettaglio dettaglio, DettaglioEccezione dettaglioEccezione,
  107.             IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError, ErroriProperties erroriProperties) throws ProtocolException {
  108.         if(dettaglio != null){
  109.            
  110.             boolean genericDetails = returnConfig.isGenericDetails();
  111.             if(!genericDetails && erroriProperties.isForceGenericDetails(functionError)) {
  112.                 genericDetails = true;
  113.             }
  114.             if (Costanti.isTRANSACTION_FORCE_SPECIFIC_ERROR_DETAILS()) {
  115.                 genericDetails = false;
  116.             }
  117.            
  118.             if(!genericDetails) {
  119.                 if(dettaglioEccezione.getDetails()==null){
  120.                     dettaglioEccezione.setDetails(new Dettagli());
  121.                 }
  122.                 dettaglioEccezione.getDetails().addDetail(dettaglio);
  123.             }
  124.         }
  125.     }
  126.    
  127.     public static DettaglioEccezione buildDettaglioEccezione(IDSoggetto identitaPdD,TipoPdD tipoPdD,String modulo, String codErrore,String msgErrore,boolean isErroreProtocollo,
  128.             IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError, ErroriProperties erroriProperties) throws ProtocolException{
  129.         DettaglioEccezione dettaglioEccezione = new DettaglioEccezione();
  130.            
  131.         dettaglioEccezione.setTimestamp(DateManager.getDate());
  132.        
  133.         dettaglioEccezione.setDomain(buildDominio(identitaPdD, tipoPdD, modulo));
  134.        
  135.         org.openspcoop2.core.eccezione.details.Eccezione eccezione = new org.openspcoop2.core.eccezione.details.Eccezione();
  136.         setCodeInEccezione(codErrore, eccezione, returnConfig, functionError, erroriProperties);
  137.         setDescriptionInEccezione(msgErrore, eccezione, returnConfig, functionError, erroriProperties);
  138.         if(isErroreProtocollo){
  139.             eccezione.setType(TipoEccezione.PROTOCOL);
  140.         }else{
  141.             eccezione.setType(TipoEccezione.INTEGRATION);
  142.         }
  143.         if(dettaglioEccezione.getExceptions()==null){
  144.             dettaglioEccezione.setExceptions(new Eccezioni());
  145.         }
  146.         dettaglioEccezione.getExceptions().addException(eccezione);
  147.         return dettaglioEccezione;
  148.     }
  149.    
  150.     public static DettaglioEccezione buildDettaglioEccezione(Date oraRegistrazione, IDSoggetto identitaPdD,TipoPdD tipoPdD, String modulo, Eccezione eccezione, Dettaglio dettaglio,
  151.             IntegrationErrorReturnConfiguration returnConfig, IntegrationFunctionError functionError, ErroriProperties erroriProperties) throws ProtocolException{
  152.         DettaglioEccezione dettaglioEccezione = new DettaglioEccezione();

  153.         // info generali
  154.         dettaglioEccezione.setTimestamp(oraRegistrazione);
  155.        
  156.         dettaglioEccezione.setDomain(buildDominio(identitaPdD, tipoPdD, modulo));
  157.        
  158.         if(eccezione != null){
  159.             if(dettaglioEccezione.getExceptions()==null){
  160.                 dettaglioEccezione.setExceptions(new Eccezioni());
  161.             }
  162.            
  163.             setCodeInEccezione(eccezione.getCode(), eccezione, returnConfig, functionError, erroriProperties);
  164.             setDescriptionInEccezione(eccezione.getDescription(), eccezione, returnConfig, functionError, erroriProperties);
  165.            
  166.             dettaglioEccezione.getExceptions().addException(eccezione);
  167.         }
  168.        
  169.         if(dettaglio != null){
  170.             addDettaglio(dettaglio, dettaglioEccezione, returnConfig, functionError, erroriProperties);
  171.         }
  172.         return dettaglioEccezione;
  173.     }
  174.    
  175.     public static Eccezione buildEccezione(String codice, String descrizione, String rilevanza, String contesto, boolean isErroreProtocollo){
  176.         Eccezione eccezione = new Eccezione();
  177.         eccezione.setCode(codice);
  178.         eccezione.setDescription(descrizione);
  179.         eccezione.setSeverity(rilevanza);
  180.         eccezione.setContext(contesto);
  181.         if(isErroreProtocollo){
  182.             eccezione.setType(TipoEccezione.PROTOCOL);
  183.         }else{
  184.             eccezione.setType(TipoEccezione.INTEGRATION);
  185.         }
  186.         return eccezione;
  187.     }
  188.    
  189.     public static Dettaglio buildDettagio(String tipo, String base){
  190.         Dettaglio dettaglio = new Dettaglio();
  191.         dettaglio.setType(tipo);
  192.         dettaglio.setBase(base);
  193.         return dettaglio;
  194.     }
  195.    
  196.    
  197.    
  198.    
  199.    
  200.    
  201.    
  202.    
  203.    
  204.     public static void gestioneDettaglioEccezioneIntegrazione(IProtocolFactory<?> protocolFactory,Exception eProcessamento,DettaglioEccezione dettaglioEccezione,boolean generaInformazioniGeneriche) throws ProtocolException{
  205.         IProtocolManager protocolManager = protocolFactory.createProtocolManager();
  206.         DaoBuilder.gestioneDettaglioEccezioneProcessamento_engine(eProcessamento, dettaglioEccezione,
  207.                 protocolManager.isGenerazioneDetailsFaultIntegrationeConStackTrace(),
  208.                 generaInformazioniGeneriche);
  209.     }
  210.     public static void gestioneDettaglioEccezioneProcessamento(IProtocolFactory<?> protocolFactory,Exception eProcessamento,DettaglioEccezione dettaglioEccezione) throws ProtocolException{
  211.         IProtocolManager protocolManager = protocolFactory.createProtocolManager();
  212.         DaoBuilder.gestioneDettaglioEccezioneProcessamento_engine(eProcessamento, dettaglioEccezione,
  213.                 protocolManager.isGenerazioneDetailsFaultProtocolloConStackTrace(),
  214.                 protocolManager.isGenerazioneDetailsFaultProtocolloConInformazioniGeneriche());
  215.     }
  216.    
  217.     private static void gestioneDettaglioEccezioneProcessamento_engine(Exception eProcessamento,DettaglioEccezione dettaglioEccezione,
  218.             boolean generaStackTrace,boolean generaInformazioniGeneriche){
  219.         if(eProcessamento!=null){

  220.             if(generaInformazioniGeneriche){

  221.                 Dettaglio detail = new Dettaglio();
  222.                 detail.setType("causa");

  223.                 String msg = null;
  224.                 if(eProcessamento.getMessage()!=null){
  225.                     msg = eProcessamento.getMessage();
  226.                 }else{
  227.                     msg = eProcessamento.toString();
  228.                 }
  229.                 //System.out.println("MESSAGE ["+msg+"]");
  230.                 // faccio viaggiare solo le informazioni che ritengo pubbliche
  231.                 if("Connection refused".equals(msg)){
  232.                     msg = "Connection refused";
  233.                     detail.setBase(msg);
  234.                     if(dettaglioEccezione.getDetails()==null){
  235.                         dettaglioEccezione.setDetails(new Dettagli());
  236.                     }
  237.                     dettaglioEccezione.getDetails().addDetail(detail);          
  238.                 }else if("Read timed out".equals(msg)){
  239.                     msg = "Read timed out";
  240.                     detail.setBase(msg);
  241.                     if(dettaglioEccezione.getDetails()==null){
  242.                         dettaglioEccezione.setDetails(new Dettagli());
  243.                     }
  244.                     dettaglioEccezione.getDetails().addDetail(detail);  
  245.                 }else if("connect timed out".equals(msg)){
  246.                     msg = "Connect timed out";
  247.                     detail.setBase(msg);
  248.                     if(dettaglioEccezione.getDetails()==null){
  249.                         dettaglioEccezione.setDetails(new Dettagli());
  250.                     }
  251.                     dettaglioEccezione.getDetails().addDetail(detail);  
  252.                 }

  253.             }else{
  254.                 String base;
  255.                 if(eProcessamento.getMessage()!=null)
  256.                     base = eProcessamento.getMessage();
  257.                 else
  258.                     base = eProcessamento.toString();
  259.                
  260.                 Dettaglio detail = DaoBuilder.buildDettagio("causa",base);
  261.                
  262.                 if(dettaglioEccezione.getDetails()==null){
  263.                     dettaglioEccezione.setDetails(new Dettagli());
  264.                 }
  265.                 dettaglioEccezione.getDetails().addDetail(detail);

  266.                 if(eProcessamento.getCause()!=null){
  267.                     DaoBuilder.gestioneDettaglioEccezioneProcessamento_engine_InnerException(eProcessamento.getCause(), dettaglioEccezione);
  268.                 }

  269.                 if(generaStackTrace){
  270.                     Dettaglio detailStackTrace = new Dettaglio();
  271.                     detailStackTrace.setType("stackTrace");
  272.                     ByteArrayOutputStream bout = new ByteArrayOutputStream();
  273.                     PrintWriter pWriter = new PrintWriter(bout);
  274.                     eProcessamento.printStackTrace(pWriter);
  275.                     try{
  276.                         bout.flush();
  277.                         pWriter.flush();
  278.                         pWriter.close();
  279.                         bout.close();
  280.                     }catch(Exception eClose){
  281.                         System.err.println("ERRORE buildEccezioneProcessamentoFromBusta: "+eClose.getMessage());
  282.                     }
  283.                     detailStackTrace.setBase(bout.toString());
  284.                     if(dettaglioEccezione.getDetails()==null){
  285.                         dettaglioEccezione.setDetails(new Dettagli());
  286.                     }
  287.                     dettaglioEccezione.getDetails().addDetail(detailStackTrace);
  288.                 }
  289.             }
  290.         }
  291.     }
  292.    
  293.     private static void gestioneDettaglioEccezioneProcessamento_engine_InnerException(Throwable e,DettaglioEccezione dettaglioEccezione){
  294.         if(e!=null){
  295.             String base;
  296.             if(e.getMessage()!=null)
  297.                 base = e.getMessage();
  298.             else
  299.                 base = e.toString();
  300.            
  301.             Dettaglio detail = DaoBuilder.buildDettagio("causato da", base);
  302.            
  303.            
  304.             if(dettaglioEccezione.getDetails()==null){
  305.                 dettaglioEccezione.setDetails(new Dettagli());
  306.             }
  307.             dettaglioEccezione.getDetails().addDetail(detail);

  308.             if(e.getCause()!=null){
  309.                 DaoBuilder.gestioneDettaglioEccezioneProcessamento_engine_InnerException(e.getCause(), dettaglioEccezione);
  310.             }
  311.         }
  312.     }
  313. }