SPCoopErroreApplicativoBuilder.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.spcoop.builder;

  21. import java.io.ByteArrayInputStream;
  22. import java.util.Date;

  23. import org.openspcoop2.core.id.IDSoggetto;
  24. import org.openspcoop2.protocol.basic.Costanti;
  25. import org.openspcoop2.protocol.basic.builder.CodeDetailsError;
  26. import org.openspcoop2.protocol.basic.builder.ErroreApplicativoBuilder;
  27. import org.openspcoop2.protocol.basic.builder.ErroreApplicativoMessageUtils;
  28. import org.openspcoop2.protocol.sdk.AbstractEccezioneBuilderParameter;
  29. import org.openspcoop2.protocol.sdk.EccezioneIntegrazioneBuilderParameters;
  30. import org.openspcoop2.protocol.sdk.EccezioneProtocolloBuilderParameters;
  31. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  32. import org.openspcoop2.protocol.sdk.ProtocolException;
  33. import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
  34. import org.openspcoop2.protocol.sdk.constants.CodiceErroreIntegrazione;
  35. import org.openspcoop2.protocol.sdk.constants.ErroreCooperazione;
  36. import org.openspcoop2.protocol.sdk.constants.ErroreIntegrazione;
  37. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  38. import org.openspcoop2.protocol.sdk.constants.TipoErroreApplicativo;
  39. import org.openspcoop2.protocol.spcoop.constants.SPCoopCostanti;
  40. import org.openspcoop2.protocol.utils.ErroriProperties;
  41. import org.openspcoop2.utils.date.DateManager;
  42. import org.w3c.dom.Element;

  43. import it.cnipa.schemas._2003.egovit.exception1_0.EccezioneBusta;
  44. import it.cnipa.schemas._2003.egovit.exception1_0.EccezioneProcessamento;
  45. import it.cnipa.schemas._2003.egovit.exception1_0.MessaggioDiErroreApplicativo;
  46. import it.cnipa.schemas._2003.egovit.exception1_0.utils.XMLUtils;

  47. /**
  48.  * Classe che implementa, in base al protocollo SPCoop, l'interfaccia {@link org.openspcoop2.protocol.sdk.builder.IErroreApplicativoBuilder}
  49.  *
  50.  * @author Poli Andrea (apoli@link.it)
  51.  * @author $Author$
  52.  * @version $Rev$, $Date$
  53.  */
  54. public class SPCoopErroreApplicativoBuilder extends ErroreApplicativoBuilder implements org.openspcoop2.protocol.sdk.builder.IErroreApplicativoBuilder {

  55.    
  56.     public SPCoopErroreApplicativoBuilder(IProtocolFactory<?> factory) throws ProtocolException{
  57.         super(factory);
  58.     }

  59.    
  60.     // NAMESPACE
  61.    
  62.     @Override
  63.     public String getNamespaceEccezioneProtocollo(String defaultNamespace){
  64.         return SPCoopCostanti.NAMESPACE_EGOV;
  65.     }
  66.    
  67.    
  68.    
  69.    
  70.     // UTILITY DI RICONOSCIMENTO
  71.    
  72.     @Override
  73.     public boolean isErroreApplicativo(String namespace, String localName){
  74.         if("MessaggioDiErroreApplicativo".equals(localName) &&
  75.                 SPCoopCostanti.NAMESPACE_ECCEZIONE_APPLICATIVA_EGOV.equals(namespace)
  76.             ){
  77.             return true;
  78.         }
  79.         return false;
  80.     }
  81.    

  82.    
  83.    
  84.     // BUILDER
  85.    
  86.    
  87.     /** BUILDER UTILITIES */
  88.        
  89.     @Override
  90.     protected Element _buildErroreApplicativo_Element(CodeDetailsError codeDetailsErrorWrapper, EccezioneProtocolloBuilderParameters eccezioneProtocollo,
  91.             EccezioneIntegrazioneBuilderParameters eccezioneIntegrazione)throws ProtocolException{
  92.    
  93.         MessaggioDiErroreApplicativo erroreApplicativo = this._buildErroreApplicativo_engine(codeDetailsErrorWrapper, eccezioneProtocollo, eccezioneIntegrazione);
  94.        
  95.         try{
  96.             // il passaggio da XMLUtils forza anche la validazione dell'oggetto
  97.             byte[]xmlErroreApplicativo = XMLUtils.generateErroreApplicativo(erroreApplicativo);
  98.             Element elementErroreApplicativo = this.xmlUtils.newElement(xmlErroreApplicativo);
  99.             ErroreApplicativoMessageUtils.addPrefixToElement(elementErroreApplicativo,"cnipaErrAppl");
  100.            
  101.             return elementErroreApplicativo;
  102.         } catch(Exception e) {
  103.             this.log.error("XMLBuilder.buildElement_Eccezione error: "+e.getMessage(),e);
  104.             throw new ProtocolException("buildErroreApplicativoElement failed: "+e.getMessage(),e);
  105.         }
  106.     }
  107.    
  108.     @Override
  109.     protected String _buildErroreApplicativo_String(TipoErroreApplicativo tipoErroreApplicativo, boolean omitXMLDeclaration,
  110.             CodeDetailsError codeDetailsErrorWrapper,
  111.             EccezioneProtocolloBuilderParameters eccezioneProtocollo,
  112.             EccezioneIntegrazioneBuilderParameters eccezioneIntegrazione)throws ProtocolException{
  113.        
  114.         try{
  115.             if(TipoErroreApplicativo.JSON.equals(tipoErroreApplicativo)){
  116.                 MessaggioDiErroreApplicativo erroreApplicativo = this._buildErroreApplicativo_engine(codeDetailsErrorWrapper, eccezioneProtocollo, eccezioneIntegrazione);
  117.                 return XMLUtils.generateErroreApplicativoAsJson(erroreApplicativo);
  118.             }
  119.             else{
  120.                 Element element = this._buildErroreApplicativo_Element(codeDetailsErrorWrapper, eccezioneProtocollo, eccezioneIntegrazione);
  121.                 return this.xmlUtils.toString(element, omitXMLDeclaration);
  122.             }
  123.        
  124.         }catch(Exception e){
  125.             throw new ProtocolException("toString failed: "+e.getMessage());
  126.         }
  127.     }
  128.    
  129.     @Override
  130.     protected byte[] _buildErroreApplicativo_ByteArray(TipoErroreApplicativo tipoErroreApplicativo, boolean omitXMLDeclaration,
  131.             CodeDetailsError codeDetailsErrorWrapper,
  132.             EccezioneProtocolloBuilderParameters eccezioneProtocollo,
  133.             EccezioneIntegrazioneBuilderParameters eccezioneIntegrazione)throws ProtocolException{
  134.        
  135.         try{
  136.             if(TipoErroreApplicativo.JSON.equals(tipoErroreApplicativo)){
  137.                 MessaggioDiErroreApplicativo erroreApplicativo = this._buildErroreApplicativo_engine(codeDetailsErrorWrapper, eccezioneProtocollo, eccezioneIntegrazione);
  138.                 return XMLUtils.generateErroreApplicativoAsJson(erroreApplicativo).getBytes();
  139.             }
  140.             else{
  141.                 Element element = this._buildErroreApplicativo_Element(codeDetailsErrorWrapper, eccezioneProtocollo, eccezioneIntegrazione);
  142.                 return this.xmlUtils.toByteArray(element, omitXMLDeclaration);
  143.             }
  144.        
  145.         }catch(Exception e){
  146.             throw new ProtocolException("toByteArray failed: "+e.getMessage());
  147.         }
  148.     }
  149.    
  150.     private MessaggioDiErroreApplicativo _buildErroreApplicativo_engine(CodeDetailsError codeDetailsErrorWrapper,
  151.             EccezioneProtocolloBuilderParameters eccezioneProtocollo,
  152.             EccezioneIntegrazioneBuilderParameters eccezioneIntegrazione)throws ProtocolException{
  153.         try{
  154.             ErroriProperties erroriProperties = ErroriProperties.getInstance(this.log);
  155.            
  156.             MessaggioDiErroreApplicativo erroreApplicativo = new MessaggioDiErroreApplicativo();
  157.            
  158.             String idPorta = null;
  159.             String idFunzione = null;
  160.             String codiceEccezione = null;
  161.             String descrizioneEccezione = null;
  162.             Date oraRegistrazione = null;
  163.            
  164.             IntegrationFunctionError functionError = null;
  165.             boolean genericDetails = true;
  166.            
  167.             if(eccezioneProtocollo!=null){
  168.                 idPorta = eccezioneProtocollo.getDominioPorta().getCodicePorta();
  169.                 idFunzione = eccezioneProtocollo.getIdFunzione();
  170.                 codiceEccezione = super.traduttore.toString(eccezioneProtocollo.getEccezioneProtocollo().getCodiceEccezione(),
  171.                         eccezioneProtocollo.getEccezioneProtocollo().getSubCodiceEccezione());
  172.                 descrizioneEccezione = eccezioneProtocollo.getEccezioneProtocollo().getDescrizione(this.protocolFactory);
  173.                 oraRegistrazione = eccezioneProtocollo.getOraRegistrazione();
  174.                
  175.                 functionError = eccezioneProtocollo.getFunctionError();
  176.                 if(eccezioneProtocollo.getReturnConfig()!=null) {
  177.                     genericDetails = eccezioneProtocollo.getReturnConfig().isGenericDetails();
  178.                 }
  179.                
  180.                 codeDetailsErrorWrapper.setPrefixCode(org.openspcoop2.protocol.basic.Costanti.PROBLEM_RFC7807_GOVWAY_CODE_PREFIX_PROTOCOL);
  181.                 codeDetailsErrorWrapper.setCode(codiceEccezione);
  182.                
  183.                 codeDetailsErrorWrapper.setDetails(descrizioneEccezione);
  184.                
  185.             }else{
  186.                 idPorta = eccezioneIntegrazione.getDominioPorta().getCodicePorta();
  187.                 idFunzione = eccezioneIntegrazione.getIdFunzione();
  188.                 codiceEccezione = this.traduttore.toCodiceErroreIntegrazioneAsString(eccezioneIntegrazione.getErroreIntegrazione(),
  189.                         eccezioneIntegrazione.getProprieta().getFaultPrefixCode(),
  190.                         eccezioneIntegrazione.getProprieta().isFaultAsGenericCode());
  191.                 descrizioneEccezione = eccezioneIntegrazione.getProprieta().transformFaultMsg(eccezioneIntegrazione.getErroreIntegrazione(),this.protocolFactory);
  192.                 oraRegistrazione = eccezioneIntegrazione.getOraRegistrazione();
  193.                
  194.                 functionError = eccezioneIntegrazione.getFunctionError();
  195.                 if(eccezioneIntegrazione.getReturnConfig()!=null) {
  196.                     genericDetails = eccezioneIntegrazione.getReturnConfig().isGenericDetails();
  197.                 }
  198.                
  199.                 codeDetailsErrorWrapper.setPrefixCode(org.openspcoop2.protocol.basic.Costanti.PROBLEM_RFC7807_GOVWAY_CODE_PREFIX_INTEGRATION);
  200.                 codeDetailsErrorWrapper.setCode(codiceEccezione);
  201.                
  202.                 codeDetailsErrorWrapper.setDetails(descrizioneEccezione);
  203.             }
  204.            
  205.             if(!genericDetails && erroriProperties.isForceGenericDetails(functionError)) {
  206.                 genericDetails = true;
  207.             }
  208.             if (Costanti.isTRANSACTION_FORCE_SPECIFIC_ERROR_DETAILS()) {
  209.                 genericDetails = false;
  210.             }
  211.            
  212.             if(oraRegistrazione==null){
  213.                 oraRegistrazione = DateManager.getDate();
  214.             }
  215.             erroreApplicativo.setOraRegistrazione(oraRegistrazione);
  216.            
  217.             erroreApplicativo.setIdentificativoPorta(idPorta);
  218.            
  219.             erroreApplicativo.setIdentificativoFunzione(idFunzione);
  220.            
  221.             it.cnipa.schemas._2003.egovit.exception1_0.Eccezione eccezione = new it.cnipa.schemas._2003.egovit.exception1_0.Eccezione();
  222.             if(eccezioneProtocollo!=null){
  223.                 EccezioneBusta eccezioneBusta = new EccezioneBusta();
  224.                
  225.                 //if(Costanti.TRANSACTION_ERROR_STATUS_ABILITATO) {
  226.                 // Il pacchetto CNIPA prevede un codice egov sempre
  227.                 eccezioneBusta.setCodiceEccezione(codiceEccezione);
  228.                 /*}
  229.                 else {
  230.                     String govwayType = erroriProperties.getErrorType(functionError);
  231.                     eccezioneBusta.setCodiceEccezione(govwayType);
  232.                 }*/
  233.                
  234.                 if(!genericDetails) {
  235.                     eccezioneBusta.setDescrizioneEccezione(descrizioneEccezione);
  236.                 }
  237.                 else {
  238.                     eccezioneBusta.setDescrizioneEccezione(erroriProperties.getGenericDetails(functionError));
  239.                 }
  240.                
  241.                 eccezione.setEccezioneBusta(eccezioneBusta);
  242.             }
  243.             else{
  244.                 EccezioneProcessamento eccezioneProcessamento = new EccezioneProcessamento();
  245.                
  246.                 if(Costanti.isTRANSACTION_ERROR_STATUS_ABILITATO()) {
  247.                     eccezioneProcessamento.setCodiceEccezione(codiceEccezione);
  248.                 }
  249.                 else {
  250.                     String govwayType = erroriProperties.getErrorType(functionError);
  251.                     eccezioneProcessamento.setCodiceEccezione(govwayType);
  252.                 }
  253.                
  254.                 if(!genericDetails) {
  255.                     eccezioneProcessamento.setDescrizioneEccezione(descrizioneEccezione);
  256.                 }
  257.                 else {
  258.                     eccezioneProcessamento.setDescrizioneEccezione(erroriProperties.getGenericDetails(functionError));
  259.                 }
  260.                
  261.                 eccezione.setEccezioneProcessamento(eccezioneProcessamento);
  262.             }
  263.             erroreApplicativo.setEccezione(eccezione);
  264.            
  265.             return erroreApplicativo;

  266.         } catch(Exception e) {
  267.             this.log.error("XMLBuilder.buildElement_Eccezione error: "+e.getMessage(),e);
  268.             throw new ProtocolException("buildErroreApplicativoElement failed: "+e.getMessage(),e);
  269.         }
  270.     }
  271.    
  272.    
  273.    
  274.    
  275.    
  276.    
  277.    
  278.     // PARSER
  279.    
  280.     @Override
  281.     public AbstractEccezioneBuilderParameter readErroreApplicativo(TipoErroreApplicativo tipoErroreApplicativo, byte[] erroreApplicativo,String prefixCodiceErroreApplicativoIntegrazione) throws ProtocolException{
  282.         MessaggioDiErroreApplicativo erroreApplicativoObject = null;
  283.         switch (tipoErroreApplicativo) {
  284.         case JSON:
  285.             try{
  286.                 erroreApplicativoObject = XMLUtils.getErroreApplicativoFromJson(this.log, new ByteArrayInputStream(erroreApplicativo));
  287.             }catch(Exception e){
  288.                 throw new ProtocolException("JSon fornito non contiene un errore applicativo per il protocollo "+this.getProtocolFactory().getProtocol()+": "+e.getMessage(),e);
  289.             }
  290.             break;
  291.         default:
  292.             if(XMLUtils.isErroreApplicativo(erroreApplicativo)==false){
  293.                 throw new ProtocolException("XML fornito non contiene un errore applicativo per il protocollo "+this.getProtocolFactory().getProtocol());
  294.             }
  295.             try{
  296.                 erroreApplicativoObject = XMLUtils.getErroreApplicativo(this.log, erroreApplicativo);
  297.             }catch(Exception e){
  298.                 throw new ProtocolException("Xml fornito non contiene un errore applicativo per il protocollo "+this.getProtocolFactory().getProtocol()+": "+e.getMessage(),e);
  299.             }
  300.             break;
  301.         }
  302.        
  303.         return _parseErroreApplicativo(erroreApplicativoObject, prefixCodiceErroreApplicativoIntegrazione);
  304.        
  305.     }
  306.    
  307.     private AbstractEccezioneBuilderParameter _parseErroreApplicativo(MessaggioDiErroreApplicativo erroreApplicativo,String prefixCodiceErroreApplicativoIntegrazione) throws ProtocolException{
  308.         try{
  309.            
  310.             String identificativoPorta = erroreApplicativo.getIdentificativoPorta();
  311.             String identificativoFunzione = erroreApplicativo.getIdentificativoFunzione();
  312.            
  313.             AbstractEccezioneBuilderParameter eccezione = null;
  314.             if( erroreApplicativo.getEccezione().getEccezioneBusta()!=null ){
  315.                 eccezione = new EccezioneProtocolloBuilderParameters();
  316.                
  317.                 CodiceErroreCooperazione codice = this.protocolFactory.createTraduttore().toCodiceErroreCooperazione(erroreApplicativo.getEccezione().getEccezioneBusta().getCodiceEccezione());
  318.                 ErroreCooperazione erroreCooperazione = new ErroreCooperazione(erroreApplicativo.getEccezione().getEccezioneBusta().getDescrizioneEccezione(), codice);
  319.                 org.openspcoop2.protocol.sdk.Eccezione eccezioneProtocollo =
  320.                         new org.openspcoop2.protocol.sdk.Eccezione(erroreCooperazione,true,identificativoFunzione,this.protocolFactory);
  321.                 ((EccezioneProtocolloBuilderParameters)eccezione).setEccezioneProtocollo(eccezioneProtocollo);
  322.             }
  323.             else{
  324.                 eccezione = new EccezioneIntegrazioneBuilderParameters();
  325.                 CodiceErroreIntegrazione codice = this.protocolFactory.createTraduttore().toCodiceErroreIntegrazione(erroreApplicativo.getEccezione().getEccezioneProcessamento().getCodiceEccezione(),prefixCodiceErroreApplicativoIntegrazione);
  326.                 ErroreIntegrazione erroreIntegrazione = new ErroreIntegrazione(erroreApplicativo.getEccezione().getEccezioneProcessamento().getDescrizioneEccezione(), codice);
  327.                 ((EccezioneIntegrazioneBuilderParameters)eccezione).setErroreIntegrazione(erroreIntegrazione);
  328.             }
  329.            
  330.             IDSoggetto dominio = new IDSoggetto();
  331.             dominio.setCodicePorta(identificativoPorta);
  332.             eccezione.setDominioPorta(dominio);
  333.             eccezione.setOraRegistrazione(erroreApplicativo.getOraRegistrazione());
  334.             eccezione.setIdFunzione(identificativoFunzione);
  335.            
  336.             return eccezione;
  337.            
  338.         }catch(Exception e){
  339.             throw new ProtocolException(e.getMessage(), e);
  340.         }
  341.     }
  342.    


  343. }