BustaBuilder.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.basic.builder;

  21. import java.text.SimpleDateFormat;
  22. import java.util.Date;
  23. import java.util.Iterator;

  24. import javax.xml.namespace.QName;
  25. import javax.xml.soap.SOAPFault;

  26. import org.openspcoop2.core.constants.TipoPdD;
  27. import org.openspcoop2.core.id.IDServizio;
  28. import org.openspcoop2.core.id.IDSoggetto;
  29. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  30. import org.openspcoop2.message.OpenSPCoop2Message;
  31. import org.openspcoop2.message.OpenSPCoop2SoapMessage;
  32. import org.openspcoop2.message.config.ServiceBindingConfiguration;
  33. import org.openspcoop2.message.constants.ServiceBinding;
  34. import org.openspcoop2.message.soap.SOAPFaultCode;
  35. import org.openspcoop2.protocol.basic.BasicStateComponentFactory;
  36. import org.openspcoop2.protocol.basic.Costanti;
  37. import org.openspcoop2.protocol.sdk.Busta;
  38. import org.openspcoop2.protocol.sdk.Context;
  39. import org.openspcoop2.protocol.sdk.Eccezione;
  40. import org.openspcoop2.protocol.sdk.EccezioneProtocolloBuilderParameters;
  41. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  42. import org.openspcoop2.protocol.sdk.ProtocolException;
  43. import org.openspcoop2.protocol.sdk.ProtocolMessage;
  44. import org.openspcoop2.protocol.sdk.Riscontro;
  45. import org.openspcoop2.protocol.sdk.Trasmissione;
  46. import org.openspcoop2.protocol.sdk.builder.IErroreApplicativoBuilder;
  47. import org.openspcoop2.protocol.sdk.builder.ProprietaManifestAttachments;
  48. import org.openspcoop2.protocol.sdk.config.ITraduttore;
  49. import org.openspcoop2.protocol.sdk.constants.ErroriCooperazione;
  50. import org.openspcoop2.protocol.sdk.constants.FaseImbustamento;
  51. import org.openspcoop2.protocol.sdk.constants.FaseSbustamento;
  52. import org.openspcoop2.protocol.sdk.constants.Inoltro;
  53. import org.openspcoop2.protocol.sdk.constants.LivelloRilevanza;
  54. import org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione;
  55. import org.openspcoop2.protocol.sdk.constants.RuoloMessaggio;
  56. import org.openspcoop2.protocol.sdk.constants.TipoOraRegistrazione;
  57. import org.openspcoop2.protocol.sdk.state.IState;
  58. import org.openspcoop2.utils.date.DateManager;
  59. import org.openspcoop2.utils.date.DateUtils;
  60. import org.openspcoop2.utils.id.UniqueIdentifierManager;

  61. /**
  62.  * BustaBuilder
  63.  *
  64.  * @author Poli Andrea (apoli@link.it)
  65.  * @author $Author$
  66.  * @version $Rev$, $Date$
  67.  */
  68. public class BustaBuilder<BustaRawType> extends BasicStateComponentFactory implements org.openspcoop2.protocol.sdk.builder.IBustaBuilder<BustaRawType> {
  69.    
  70.     protected ITraduttore traduttore;
  71.     protected IErroreApplicativoBuilder erroreApplicativoBuilder = null;
  72.        
  73.     public BustaBuilder(IProtocolFactory<?> factory, IState state) throws ProtocolException{
  74.         super(factory,state);
  75.         this.traduttore = this.protocolFactory.createTraduttore();
  76.         this.erroreApplicativoBuilder = this.protocolFactory.createErroreApplicativoBuilder();
  77.     }

  78.     private static final String dateformatPattern = "yyyyMMddHHmmssSSS"; // utile per il filtro duplicati
  79.    
  80.     @Override
  81.     public String newID(IDSoggetto idSoggetto, String idTransazione, RuoloMessaggio ruoloMessaggio) throws ProtocolException {
  82.         return newID(idSoggetto, idTransazione, ruoloMessaggio, true);
  83.     }
  84.     public String newID(IDSoggetto idSoggetto, String idTransazione, RuoloMessaggio ruoloMessaggio, boolean generateIDasUUID) throws ProtocolException {
  85.        
  86.         if(generateIDasUUID){
  87.            
  88.             try{
  89.                 return UniqueIdentifierManager.newUniqueIdentifier().getAsString();
  90.             }catch(Exception e){
  91.                 throw new ProtocolException(e.getMessage());
  92.             }
  93.            
  94.         }
  95.         else{
  96.        
  97.             String id = idTransazione;
  98.            
  99.     //      try {
  100.     //          XMLGregorianCalendar cal = DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar());
  101.     //          id = id + "_T_" + cal.getSecond() + cal.getMillisecond();
  102.     //      } catch (DatatypeConfigurationException e) {
  103.     //          throw new ProtocolException(e);
  104.     //      }
  105.            
  106.             Date now = DateManager.getDate();
  107.            
  108.             // NOTA: La data nell'identificativo e' utile quando l'id viene usato in un filtro duplicati
  109.             //       Per avere un insieme di identificativi in ordine raggruppate per date. (aiuta l'indice sulla base dati)
  110.             //       Essendo questa una classe di base si preferisce aggiungere la data.
  111.             //       Se non la si vuole nel protocollo trasparente reimplementare questo metodo nel protocollo trasparente eliminando la data
  112.             //       Anche il metodo extractDate dovra' a quel punto essere reimplementato ritornando null
  113.            
  114.             SimpleDateFormat dateFormat = DateUtils.getDefaultDateTimeFormatter(dateformatPattern);
  115.            
  116.             if(RuoloMessaggio.RICHIESTA.equals(ruoloMessaggio))
  117.     //          return id+ "-request";
  118.                 return dateFormat.format(now)+"-"+id;
  119.             else
  120.                 return dateFormat.format(now)+"-"+id + "-response";
  121.            
  122.         }
  123.     }

  124.     @Override
  125.     public Date extractDateFromID(String id) throws ProtocolException {
  126.         return this.extractDateFromID(id, true);
  127.     }
  128.     public Date extractDateFromID(String id, boolean generateIDasUUID) throws ProtocolException {
  129.         if(id==null){
  130.             throw new ProtocolException("ID non fornito");
  131.         }
  132.         if(generateIDasUUID == false){
  133.             if(id.contains("-")==false){
  134.                 throw new ProtocolException("ID fornito ["+id+"] non e' corretto (missing '-')");
  135.             }
  136.             String [] split = id.split("-");
  137.            
  138.             SimpleDateFormat dateFormat = DateUtils.getDefaultDateTimeFormatter(dateformatPattern);
  139.            
  140.             try{
  141.                 return dateFormat.parse(split[0].trim());
  142.             }catch(Exception e){
  143.                 throw new ProtocolException("ID fornito ["+id+"] non e' corretto: "+e.getMessage());
  144.             }
  145.         }
  146.         else{
  147.             return null;
  148.         }
  149.     }
  150.    

  151.    
  152.     @Override
  153.     public ProtocolMessage imbustamento(OpenSPCoop2Message msg, Context context,
  154.             Busta busta, Busta bustaRichiesta,
  155.             RuoloMessaggio ruoloMessaggio,
  156.             ProprietaManifestAttachments proprietaManifestAttachments,
  157.             FaseImbustamento faseImbustamento)
  158.             throws ProtocolException {
  159.        
  160.         if(FaseImbustamento.DOPO_SICUREZZA_MESSAGGIO.equals(faseImbustamento)) {
  161.             ProtocolMessage protocolMessage = new ProtocolMessage();
  162.             protocolMessage.setPhaseUnsupported(true);
  163.             return protocolMessage;
  164.         }
  165.        
  166.         if(busta.getProfiloDiCollaborazione() != null) {
  167.             switch (busta.getProfiloDiCollaborazione()) {
  168.             case ONEWAY:
  169.                 busta.setProfiloDiCollaborazione(ProfiloDiCollaborazione.ONEWAY, ProfiloDiCollaborazione.ONEWAY.getEngineValue());
  170.                 break;
  171.             case SINCRONO:
  172.                 busta.setProfiloDiCollaborazione(ProfiloDiCollaborazione.SINCRONO, ProfiloDiCollaborazione.SINCRONO.getEngineValue());
  173.                 break;
  174.             case ASINCRONO_ASIMMETRICO:
  175.                 busta.setProfiloDiCollaborazione(ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO, ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.getEngineValue());
  176.                 break;
  177.             case ASINCRONO_SIMMETRICO:
  178.                 busta.setProfiloDiCollaborazione(ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO, ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.getEngineValue());
  179.                 break;
  180.             case UNKNOWN:
  181.                 break;
  182.             }
  183.         }
  184.        
  185.         if(busta.getTipoOraRegistrazione() != null) {
  186.             switch (busta.getTipoOraRegistrazione()) {
  187.             case LOCALE:
  188.                 busta.setTipoOraRegistrazione(TipoOraRegistrazione.LOCALE,Costanti.TIPO_TEMPO_LOCALE);
  189.                 break;
  190.             case SINCRONIZZATO:
  191.                 busta.setTipoOraRegistrazione(TipoOraRegistrazione.SINCRONIZZATO,Costanti.TIPO_TEMPO_SINCRONIZZATO);
  192.                 break;
  193.             case UNKNOWN:
  194.                 break;
  195.             }
  196.         }
  197.        
  198.         if(busta.getInoltro() != null) {
  199.             switch (busta.getInoltro()) {
  200.             case CON_DUPLICATI:
  201.                 busta.setInoltro(Inoltro.CON_DUPLICATI, Costanti.PROFILO_TRASMISSIONE_CON_DUPLICATI);
  202.                 break;
  203.             case SENZA_DUPLICATI:
  204.                 busta.setInoltro(Inoltro.SENZA_DUPLICATI, Costanti.PROFILO_TRASMISSIONE_SENZA_DUPLICATI);
  205.                 break;
  206.             case UNKNOWN:
  207.                 break;
  208.             }
  209.         }
  210.        
  211.         Iterator<Riscontro> riscontri = busta.getListaRiscontri().iterator();
  212.         while(riscontri.hasNext()){
  213.             Riscontro riscontro = riscontri.next();
  214.             if(riscontro.getTipoOraRegistrazione() == null)
  215.                 continue;
  216.             if(riscontro.getTipoOraRegistrazione().equals(TipoOraRegistrazione.LOCALE))
  217.                 riscontro.setTipoOraRegistrazioneValue(Costanti.TIPO_TEMPO_LOCALE);
  218.             if(riscontro.getTipoOraRegistrazione().equals(TipoOraRegistrazione.SINCRONIZZATO))
  219.                 riscontro.setTipoOraRegistrazioneValue(Costanti.TIPO_TEMPO_SINCRONIZZATO);
  220.         }
  221.        
  222.         Iterator<Trasmissione> trasmissioni = busta.getListaTrasmissioni().iterator();
  223.         while(trasmissioni.hasNext()){
  224.             Trasmissione trasmissione = trasmissioni.next();
  225.             if(trasmissione.getTempo() == null) continue;
  226.            
  227.             if(trasmissione.getTempo().equals(TipoOraRegistrazione.LOCALE))
  228.                 trasmissione.setTempoValue(Costanti.TIPO_TEMPO_LOCALE);
  229.             else  
  230.                 trasmissione.setTempoValue(Costanti.TIPO_TEMPO_SINCRONIZZATO);
  231.              
  232.         }
  233.        
  234.         ProtocolMessage protocolMessage = new ProtocolMessage();
  235.         protocolMessage.setMessage(msg);
  236.         return protocolMessage;
  237.     }
  238.    
  239.     @Override
  240.     public ProtocolMessage addTrasmissione(OpenSPCoop2Message message,
  241.             Trasmissione trasmissione,
  242.             FaseImbustamento faseImbustamento) throws ProtocolException {
  243.         ProtocolMessage protocolMessage = new ProtocolMessage();
  244.         protocolMessage.setMessage(message);
  245.         return protocolMessage;
  246.     }

  247.     @Override
  248.     public ProtocolMessage sbustamento(OpenSPCoop2Message msg, Context context,
  249.             Busta busta,
  250.             RuoloMessaggio ruoloMessaggio, ProprietaManifestAttachments proprietaManifestAttachments,
  251.             FaseSbustamento faseSbustamento, ServiceBinding integrationServiceBinding, ServiceBindingConfiguration serviceBindingConfiguration) throws ProtocolException {
  252.        
  253.         ProtocolMessage protocolMessage = new ProtocolMessage();
  254.         protocolMessage.setMessage(msg);
  255.         return protocolMessage;
  256.        
  257.     }
  258.    
  259.    
  260.     protected void enrichFault(OpenSPCoop2Message msg, Busta busta, boolean ignoraEccezioniNonGravi,
  261.             boolean modifyFault, boolean generateErroreApplicativoIntoDetail) throws ProtocolException{
  262.         SOAPFault f = null;
  263.         OpenSPCoop2SoapMessage soapMessage = null;
  264.         try{
  265.             if(!modifyFault && !generateErroreApplicativoIntoDetail) {
  266.                 return;
  267.             }
  268.            
  269.             if(ServiceBinding.SOAP.equals(msg.getServiceBinding())){
  270.                 soapMessage = msg.castAsSoap();
  271.                 if(soapMessage.hasSOAPFault()) {
  272.                     if(soapMessage.getSOAPBody()!=null){
  273.                         f = soapMessage.getSOAPBody().getFault();
  274.                     }
  275.                 }
  276.             }
  277.                    
  278.             if(soapMessage==null || f==null){
  279.                 return;
  280.             }
  281.            
  282.            
  283.             // Eccezione
  284.             // NOTA: il parametro 'ignoraEccezioniNonGravi' serve solo a filtrare.
  285.             //       il controllo che esista almeno una eccezione non grave e' fatto dove viene chiamato il metodo.
  286.             Eccezione ecc = null;
  287.             if(busta.sizeListaEccezioni()==1){
  288.                 ecc = busta.getEccezione(0);
  289.             }
  290.             else{
  291.                 ecc = Eccezione.getEccezioneProcessamento(ErroriCooperazione.ERRORE_GENERICO_PROTOCOLLO_NON_CORRETTO.getErroreCooperazione(), this.protocolFactory);
  292.                 StringBuilder bfDescrizione = new StringBuilder();
  293.                 for(int k=0; k<busta.sizeListaEccezioni();k++){
  294.                     Eccezione eccLista = busta.getEccezione(k);
  295.                     if(eccLista.getRilevanza()==null || LivelloRilevanza.isEccezioneLivelloGrave(eccLista.getRilevanza())){
  296.                         if(eccLista.getDescrizione(this.protocolFactory)!=null)
  297.                             bfDescrizione.append("["+this.traduttore.toString(eccLista.getCodiceEccezione(),eccLista.getSubCodiceEccezione())+"] "+eccLista.getDescrizione(this.protocolFactory)+"\n");
  298.                     }
  299.                 }
  300.                 if(bfDescrizione.length()>0)
  301.                     ecc.setDescrizione(bfDescrizione.toString());
  302.             }
  303.             if(ecc==null) {
  304.                 // non ci sono segnalazioni di errore
  305.                 return ;
  306.             }
  307.            
  308.             EccezioneProtocolloBuilderParameters params = new EccezioneProtocolloBuilderParameters();          
  309.             params.setEccezioneProtocollo(ecc);
  310.                        
  311.             if(modifyFault) {
  312.                 // Set Fault Code
  313.                 String codiceEccezione =
  314.                         this.traduttore.toString(ecc.getCodiceEccezione(),
  315.                                 ecc.getSubCodiceEccezione());
  316.                 QName eccezioneName = this.erroreApplicativoBuilder.getQNameEccezioneProtocollo(null, codiceEccezione);
  317.                 SOAPFaultCode code = params.getSoapFaultCode();
  318.                 soapMessage.setFaultCode(f, code, eccezioneName);
  319.                
  320.                 // Set fault String
  321.                 soapMessage.setFaultString(f, ecc.getDescrizione(this.protocolFactory));
  322.                
  323.                 // Set fault Actor
  324.                 f.setFaultActor(org.openspcoop2.utils.Costanti.OPENSPCOOP2);
  325.             }
  326.            
  327.             if(generateErroreApplicativoIntoDetail) {
  328.                
  329.                 // Soggetto Produce Eccezione == Dominio
  330.                 IDSoggetto soggettoProduceEccezione = new IDSoggetto(busta.getTipoMittente(),busta.getMittente(),busta.getIdentificativoPortaMittente());
  331.                 params.setSoggettoProduceEccezione(soggettoProduceEccezione);
  332.                 params.setDominioPorta(soggettoProduceEccezione);
  333.                
  334.                 // Mittente (può essere non definito in protocollo che supportano l'invocazione anonima)
  335.                 if(busta.getTipoDestinatario()!=null && busta.getDestinatario()!=null){
  336.                     IDSoggetto idSoggettoMittente = new IDSoggetto(busta.getTipoDestinatario(), busta.getDestinatario());
  337.                     String idPortaMittente = busta.getIdentificativoPortaDestinatario();
  338.                     if(idPortaMittente==null){
  339.                         idPortaMittente = this.traduttore.getIdentificativoPortaDefault(idSoggettoMittente);
  340.                     }
  341.                     idSoggettoMittente.setCodicePorta(idPortaMittente);
  342.                     params.setMittente(idSoggettoMittente);
  343.                 }
  344.                            
  345.                 // Servizio
  346.                 IDServizio idServizio =
  347.                 IDServizioFactory.getInstance().getIDServizioFromValues(busta.getTipoServizio(), busta.getServizio(),
  348.                         soggettoProduceEccezione, busta.getVersioneServizio());
  349.                 idServizio.setAzione(busta.getAzione());
  350.                 params.setServizio(idServizio);
  351.                
  352.                 // MessageType
  353.                 params.setMessageType(msg.getMessageType());
  354.                
  355.                 // IDFunzione
  356.                 params.setIdFunzione("PortaApplicativa");
  357.                
  358.                 // ServizioApplicativo
  359.                 params.setServizioApplicativo(busta.getServizioApplicativoErogatore());
  360.                
  361.                 // TipoPdD
  362.                 params.setTipoPorta(TipoPdD.APPLICATIVA);
  363.                
  364.                 // genero errore applicativo
  365.                 this.erroreApplicativoBuilder.insertInSOAPFault(params, msg);
  366.             }
  367.            
  368.         }catch(Exception e){
  369.             throw new ProtocolException(e.getMessage(),e);
  370.         }
  371.     }
  372.    
  373. }