SDIBustaBuilder.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.sdi.builder;

  21. import it.gov.fatturapa.sdi.messaggi.v1_0.constants.TipiMessaggi;

  22. import javax.xml.soap.SOAPElement;

  23. import org.openspcoop2.message.OpenSPCoop2Message;
  24. import org.openspcoop2.message.OpenSPCoop2SoapMessage;
  25. import org.openspcoop2.message.config.ServiceBindingConfiguration;
  26. import org.openspcoop2.message.constants.ServiceBinding;
  27. import org.openspcoop2.protocol.basic.builder.BustaBuilder;
  28. import org.openspcoop2.protocol.sdi.SDIBustaRawContent;
  29. import org.openspcoop2.protocol.sdi.config.SDIProperties;
  30. import org.openspcoop2.protocol.sdi.constants.SDICostantiServizioRiceviFile;
  31. import org.openspcoop2.protocol.sdi.constants.SDICostantiServizioRiceviNotifica;
  32. import org.openspcoop2.protocol.sdi.constants.SDICostantiServizioRicezioneFatture;
  33. import org.openspcoop2.protocol.sdi.constants.SDICostantiServizioTrasmissioneFatture;
  34. import org.openspcoop2.protocol.sdk.Busta;
  35. import org.openspcoop2.protocol.sdk.Context;
  36. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  37. import org.openspcoop2.protocol.sdk.ProtocolException;
  38. import org.openspcoop2.protocol.sdk.ProtocolMessage;
  39. import org.openspcoop2.protocol.sdk.builder.ProprietaManifestAttachments;
  40. import org.openspcoop2.protocol.sdk.constants.FaseImbustamento;
  41. import org.openspcoop2.protocol.sdk.constants.FaseSbustamento;
  42. import org.openspcoop2.protocol.sdk.constants.RuoloMessaggio;
  43. import org.openspcoop2.protocol.sdk.state.IState;

  44. /**
  45.  * Classe che implementa, in base al protocollo SdI, l'interfaccia {@link org.openspcoop2.protocol.sdk.builder.IBustaBuilder}
  46.  *
  47.  * @author Poli Andrea (apoli@link.it)
  48.  * @author $Author$
  49.  * @version $Rev$, $Date$
  50.  */
  51. public class SDIBustaBuilder extends BustaBuilder<SOAPElement> {

  52.     /** Properties */
  53.     protected SDIProperties sdiProperties;
  54.     /** SDIImbustamento */
  55.     private SDIImbustamento sdiImbustamento;
  56.     /** SDISbustamento */
  57.     private SDISbustamento sdiSbustamento;
  58.    
  59.     public SDIBustaBuilder(IProtocolFactory<SOAPElement> factory, IState state) throws ProtocolException {
  60.         super(factory, state);
  61.         this.sdiProperties = SDIProperties.getInstance(this.log);
  62.         this.sdiImbustamento = new SDIImbustamento(this);
  63.         this.sdiSbustamento = new SDISbustamento(this);
  64.     }

  65.     @Override
  66.     public ProtocolMessage imbustamento(OpenSPCoop2Message msg, Context context,
  67.             Busta busta, Busta bustaRichiesta,
  68.             RuoloMessaggio ruoloMessaggio,
  69.             ProprietaManifestAttachments proprietaManifestAttachments,
  70.             FaseImbustamento faseImbustamento)
  71.             throws ProtocolException {
  72.        
  73.         if(FaseImbustamento.DOPO_SICUREZZA_MESSAGGIO.equals(faseImbustamento)) {
  74.             ProtocolMessage protocolMessage = new ProtocolMessage();
  75.             protocolMessage.setPhaseUnsupported(true);
  76.             return protocolMessage;
  77.         }
  78.        
  79.         ProtocolMessage protocolMessage = super.imbustamento(msg, context,
  80.                 busta, bustaRichiesta,
  81.                 ruoloMessaggio, proprietaManifestAttachments, faseImbustamento);
  82.        
  83.         // Modifico il messaggio per aggiungere la struttura SDI in base all'azione invocata e al ruolo (Richiesta/Risposta) e al fatto che non vi sono errori.
  84.         // TODO: il body attuale lo devo inserire come valore codificato in base 64 tramite la struttura Corretta
  85.         // Forse è utile in questo contesto generare gli elementi con jaxb.
  86.         // Dopo configuro il packaging di MTOM
  87.        
  88.         // Check Destinatario
  89.         if(busta.getTipoDestinatario().equals(this.sdiProperties.getTipoSoggettoSDI())==false){
  90.             throw new ProtocolException("TipoDestinatario["+busta.getTipoDestinatario()+"] differente da quello atteso per il Sistema di Interscambio ["+this.sdiProperties.getTipoSoggettoSDI()+"]");
  91.         }
  92.         if(busta.getDestinatario().equals(this.sdiProperties.getNomeSoggettoSDI())==false){
  93.             boolean whiteList = false;
  94.             if(busta.getDestinatario()!=null && this.sdiProperties.getSoggettiWhiteList().contains(busta.getDestinatario())){
  95.                 this.log.debug("Destinatario ["+busta.getDestinatario()+"] in white list");
  96.                 whiteList = true;
  97.             }
  98.             if(!whiteList){
  99.                 throw new ProtocolException("NomeDestinatario["+busta.getDestinatario()+"] differente da quello atteso per il Sistema di Interscambio ["+this.sdiProperties.getNomeSoggettoSDI()+"]");
  100.             }
  101.         }
  102.        
  103.         SOAPElement element = null;
  104.        
  105.         if(RuoloMessaggio.RICHIESTA.equals(ruoloMessaggio)){
  106.    
  107.             // Servizio
  108.             if(SDICostantiServizioRiceviFile.SDI_SERVIZIO_RICEVI_FILE.equals(busta.getServizio())
  109.                     && SDICostantiServizioRiceviFile.SDI_SERVIZIO_RICEVI_FILE_AZIONE_RICEVI_FILE.equals(busta.getAzione())){
  110.                 element = this.sdiImbustamento.creaRichiesta_ServizioSdIRiceviFile_AzioneRiceviFile(this.protocolFactory, this.state, busta, msg);
  111.             }
  112.             else if(SDICostantiServizioRiceviNotifica.SDI_SERVIZIO_RICEVI_NOTIFICA.equals(busta.getServizio())
  113.                     && SDICostantiServizioRiceviNotifica.SDI_SERVIZIO_NOTIFICA_ESITO_AZIONE_NOTIFICA_ESITO.equals(busta.getAzione())){
  114.                 element = this.sdiImbustamento.creaRichiesta_ServizioSdIRiceviNotifica_AzioneNotificaEsito(this.protocolFactory,this.state,busta,msg,
  115.                         this.sdiProperties.isEnableGenerazioneMessaggiCompatibilitaNamespaceSenzaGov(),
  116.                         this.sdiProperties.isEnableValidazioneMessaggiCompatibilitaNamespaceSenzaGov());
  117.             }
  118.             else{
  119.                 boolean whiteList = false;
  120.                 if(busta.getServizio()!=null && this.sdiProperties.getServiziWhiteList().contains(busta.getServizio())){
  121.                     if(busta.getAzione()!=null && this.sdiProperties.getAzioniWhiteList().contains(busta.getAzione())){
  122.                         this.log.debug("Servizio ["+busta.getServizio()+"] e Azione ["+busta.getAzione()+"] in white list");
  123.                         whiteList = true;
  124.                     }
  125.                 }
  126.                 if(!whiteList){
  127.                     throw new ProtocolException("Servizio["+busta.getServizio()+"] e Azione["+busta.getAzione()+"] non gestite dal protocollo durante la fase di richiesta");
  128.                 }
  129.             }
  130.            
  131.         }
  132.         else{
  133.             if(busta.sizeListaEccezioni()>0){
  134.                
  135.                 // le eccezioni vengono tornate anche per gli errori di processamento poiche' in TrasparenteProtocolVersionManager
  136.                 // e' stato cablato il metodo isGenerazioneListaEccezioniErroreProcessamento al valore 'true'
  137.                
  138.                 // Per quanto riguarda la generazione dei codici SOAPFault personalizzati e/o la generazione dell'elemento errore-applicativo
  139.                 // la scelta e' delegata a due proprieta' nel file di proprieta'.
  140.                 //
  141.                 // Infine la scelta della presenza o meno dell'elemento OpenSPCoop2Details lo stesso viene pilotata dalle proprieta' presenti nel file di proprieta'
  142.                
  143.                 boolean ignoraEccezioniNonGravi = this.protocolFactory.createProtocolManager().isIgnoraEccezioniNonGravi();
  144.                 if(ignoraEccezioniNonGravi){
  145.                     if(busta.containsEccezioniGravi() ){
  146.                         this.enrichFault(msg, busta, ignoraEccezioniNonGravi,
  147.                                 this.sdiProperties.isPortaApplicativaBustaErrore_personalizzaElementiFault(),
  148.                                 this.sdiProperties.isPortaApplicativaBustaErrore_aggiungiErroreApplicativo());
  149.                     }  
  150.                 }
  151.                 else{
  152.                     this.enrichFault(msg, busta, ignoraEccezioniNonGravi,
  153.                             this.sdiProperties.isPortaApplicativaBustaErrore_personalizzaElementiFault(),
  154.                             this.sdiProperties.isPortaApplicativaBustaErrore_aggiungiErroreApplicativo());
  155.                 }
  156.             }
  157.            
  158.             try{
  159.                 OpenSPCoop2SoapMessage soapMsg = msg.castAsSoap();
  160.                 if(soapMsg.getSOAPBody()!=null && soapMsg.getSOAPBody().hasFault()){
  161.                     return null;
  162.                 }
  163.             }catch(Exception e){
  164.                 throw new ProtocolException(e.getMessage(),e);
  165.             }
  166.            
  167.             // Servizio
  168.             if(SDICostantiServizioRicezioneFatture.RICEZIONE_SERVIZIO_RICEZIONE_FATTURE.equals(busta.getServizio())
  169.                     && SDICostantiServizioRicezioneFatture.RICEZIONE_SERVIZIO_RICEZIONE_FATTURE_AZIONE_RICEVI_FATTURE.equals(busta.getAzione())){
  170.                 element = this.sdiImbustamento.creaRisposta_ServizioRicezioneFatture_AzioneRiceviFatture(this.protocolFactory,this.state,busta,msg);
  171.             }
  172.             else{
  173.                 boolean whiteList = false;
  174.                 if(busta.getServizio()!=null && this.sdiProperties.getServiziWhiteList().contains(busta.getServizio())){
  175.                     if(busta.getAzione()!=null && this.sdiProperties.getAzioniWhiteList().contains(busta.getAzione())){
  176.                         this.log.debug("Servizio ["+busta.getServizio()+"] e Azione ["+busta.getAzione()+"] in white list");
  177.                         whiteList = true;
  178.                     }
  179.                 }
  180.                 if(!whiteList){
  181.                     throw new ProtocolException("Servizio["+busta.getServizio()+"] e Azione["+busta.getAzione()+"] non gestite dal protocollo durante la fase di risposta");
  182.                 }
  183.             }
  184.            
  185.         }

  186.         if(element!=null) {
  187.             protocolMessage.setBustaRawContent(new SDIBustaRawContent(element));
  188.         }
  189.         return protocolMessage;
  190.        
  191.     }
  192.    
  193.     @Override
  194.     public ProtocolMessage sbustamento(OpenSPCoop2Message msg, Context context,
  195.             Busta busta,
  196.             RuoloMessaggio ruoloMessaggio, ProprietaManifestAttachments proprietaManifestAttachments,
  197.             FaseSbustamento faseSbustamento, ServiceBinding integrationServiceBinding, ServiceBindingConfiguration serviceBindingConfiguration) throws ProtocolException{
  198.        
  199.         try{
  200.        
  201.             ProtocolMessage protocolMessage = new ProtocolMessage();
  202.             protocolMessage.setMessage(msg);
  203.            
  204.             if(FaseSbustamento.POST_VALIDAZIONE_SEMANTICA_RICHIESTA.equals(faseSbustamento) == false &&
  205.                     FaseSbustamento.POST_VALIDAZIONE_SEMANTICA_RISPOSTA.equals(faseSbustamento) == false){
  206.                
  207.                 // Lo sbustamento effettivo in sdi viene ritardato fino alla consegna del servizio applicativo
  208.                 // il servizio applicativo può richiederlo di non effettuarlo
  209.                 SOAPElement se = null;
  210.                        
  211.                 if(RuoloMessaggio.RICHIESTA.equals(ruoloMessaggio)){
  212.                    
  213.                     // Servizio
  214.                     if(SDICostantiServizioTrasmissioneFatture.TRASMISSIONE_SERVIZIO_TRASMISSIONE_FATTURE.equals(busta.getServizio())){
  215.                         if(SDICostantiServizioTrasmissioneFatture.TRASMISSIONE_SERVIZIO_TRASMISSIONE_FATTURE_AZIONE_RICEVUTA_CONSEGNA.equals(busta.getAzione())){
  216.                             se = this.sdiSbustamento.sbustamentoRichiesta_ServizioTrasmissioneFatture_Notifiche(TipiMessaggi.RC, busta, msg);
  217.                         }
  218.                         else if(SDICostantiServizioTrasmissioneFatture.TRASMISSIONE_SERVIZIO_TRASMISSIONE_FATTURE_AZIONE_NOTIFICA_MANCATA_CONSEGNA.equals(busta.getAzione())){
  219.                             se = this.sdiSbustamento.sbustamentoRichiesta_ServizioTrasmissioneFatture_Notifiche(TipiMessaggi.MC, busta, msg);
  220.                         }
  221.                         else if(SDICostantiServizioTrasmissioneFatture.TRASMISSIONE_SERVIZIO_TRASMISSIONE_FATTURE_AZIONE_NOTIFICA_SCARTO.equals(busta.getAzione())){
  222.                             se = this.sdiSbustamento.sbustamentoRichiesta_ServizioTrasmissioneFatture_Notifiche(TipiMessaggi.NS, busta, msg);
  223.                         }
  224.                         else if(SDICostantiServizioTrasmissioneFatture.TRASMISSIONE_SERVIZIO_TRASMISSIONE_FATTURE_AZIONE_NOTIFICA_ESITO.equals(busta.getAzione())){
  225.                             se = this.sdiSbustamento.sbustamentoRichiesta_ServizioTrasmissioneFatture_Notifiche(TipiMessaggi.NE, busta, msg);
  226.                         }
  227.                         else if(SDICostantiServizioTrasmissioneFatture.TRASMISSIONE_SERVIZIO_TRASMISSIONE_FATTURE_AZIONE_NOTIFICA_DECORRENZA_TERMINI.equals(busta.getAzione())){
  228.                             se = this.sdiSbustamento.sbustamentoRichiesta_ServizioTrasmissioneFatture_Notifiche(TipiMessaggi.DT, busta, msg);
  229.                         }
  230.                         else if(SDICostantiServizioTrasmissioneFatture.TRASMISSIONE_SERVIZIO_TRASMISSIONE_FATTURE_AZIONE_ATTESTAZIONE_TRASMISSIONE_FATTURA.equals(busta.getAzione())){
  231.                             se = this.sdiSbustamento.sbustamentoRichiesta_ServizioTrasmissioneFatture_Notifiche(TipiMessaggi.AT, busta, msg);
  232.                         }
  233.                         else{
  234.                             throw new ProtocolException("Servizio["+busta.getServizio()+"] con Azione["+busta.getAzione()+"] non gestita dal protocollo durante la fase di richiesta");
  235.                         }
  236.                     }
  237.                     else if(SDICostantiServizioRicezioneFatture.RICEZIONE_SERVIZIO_RICEZIONE_FATTURE.equals(busta.getServizio())){
  238.                         if(SDICostantiServizioRicezioneFatture.RICEZIONE_SERVIZIO_RICEZIONE_FATTURE_AZIONE_RICEVI_FATTURE.equals(busta.getAzione())){
  239.                             se = this.sdiSbustamento.sbustamentoRichiesta_ServizioRicezioneFatture_AzioneRiceviFatture(busta, msg);
  240.                         }
  241.                         else if(SDICostantiServizioRicezioneFatture.RICEZIONE_SERVIZIO_RICEZIONE_FATTURE_AZIONE_NOTIFICA_DECORRENZA_TERMINI.equals(busta.getAzione())){
  242.                             se = this.sdiSbustamento.sbustamentoRichiesta_ServizioTrasmissioneFatture_Notifiche(TipiMessaggi.DT, busta, msg); // e' uguale a ricezione
  243.                         }
  244.                         else{
  245.                             throw new ProtocolException("Servizio["+busta.getServizio()+"] con Azione["+busta.getAzione()+"] non gestita dal protocollo durante la fase di richiesta");
  246.                         }
  247.                     }
  248.                     else{
  249.                         boolean whiteList = false;
  250.                         if(busta.getServizio()!=null && this.sdiProperties.getServiziWhiteList().contains(busta.getServizio())){
  251.                             if(busta.getAzione()!=null && this.sdiProperties.getAzioniWhiteList().contains(busta.getAzione())){
  252.                                 this.log.debug("Servizio ["+busta.getServizio()+"] e Azione ["+busta.getAzione()+"] in white list");
  253.                                 whiteList = true;
  254.                             }
  255.                         }
  256.                         if(!whiteList){
  257.                             throw new ProtocolException("Servizio["+busta.getServizio()+"] non gestite dal protocollo durante la fase di richiesta");
  258.                         }
  259.                     }
  260.                    
  261.                 }
  262.                 else{
  263.        
  264.                     // Servizio
  265.                     if(SDICostantiServizioRiceviFile.SDI_SERVIZIO_RICEVI_FILE.equals(busta.getServizio())
  266.                             && SDICostantiServizioRiceviFile.SDI_SERVIZIO_RICEVI_FILE_AZIONE_RICEVI_FILE.equals(busta.getAzione())){
  267.                         se = this.sdiSbustamento.sbustamentoRisposta_ServizioSdIRiceviFile_AzioneRiceviFile(busta, msg);
  268.                     }
  269.                     else if(SDICostantiServizioRiceviNotifica.SDI_SERVIZIO_RICEVI_NOTIFICA.equals(busta.getServizio())
  270.                             && SDICostantiServizioRiceviNotifica.SDI_SERVIZIO_NOTIFICA_ESITO_AZIONE_NOTIFICA_ESITO.equals(busta.getAzione())){
  271.                         se = this.sdiSbustamento.sbustamentoRisposta_ServizioSdIRiceviNotifica_AzioneNotificaEsito(busta, msg);
  272.                     }
  273.                     else{
  274.                         boolean whiteList = false;
  275.                         if(busta.getServizio()!=null && this.sdiProperties.getServiziWhiteList().contains(busta.getServizio())){
  276.                             if(busta.getAzione()!=null && this.sdiProperties.getAzioniWhiteList().contains(busta.getAzione())){
  277.                                 this.log.debug("Servizio ["+busta.getServizio()+"] e Azione ["+busta.getAzione()+"] in white list");
  278.                                 whiteList = true;
  279.                             }
  280.                         }
  281.                         if(!whiteList){
  282.                             throw new ProtocolException("Servizio["+busta.getServizio()+"] e Azione["+busta.getAzione()+"] non gestite dal protocollo durante la fase di risposta");
  283.                         }
  284.                     }
  285.                    
  286.                 }
  287.                
  288.                 if(se!=null) {
  289.                     protocolMessage.setBustaRawContent(new SDIBustaRawContent(se));
  290.                 }
  291.                 protocolMessage.setMessage(msg);
  292.             }
  293.            
  294.             return protocolMessage;
  295.            
  296.         }catch(Exception e){
  297.             throw new ProtocolException(e.getMessage(),e);
  298.         }
  299.        
  300.     }
  301.    
  302. }