SDIValidazioneUtils.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.validator;

  21. import java.sql.Connection;
  22. import java.util.ArrayList;
  23. import java.util.HashMap;
  24. import java.util.List;
  25. import java.util.Map;
  26. import java.util.Properties;

  27. import org.openspcoop2.message.OpenSPCoop2Message;
  28. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  29. import org.openspcoop2.protocol.basic.ProtocolliRegistrati;
  30. import org.openspcoop2.protocol.basic.tracciamento.TracciaDriver;
  31. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  32. import org.openspcoop2.protocol.sdi.config.SDIProperties;
  33. import org.openspcoop2.protocol.sdi.constants.SDICostanti;
  34. import org.openspcoop2.protocol.sdk.Busta;
  35. import org.openspcoop2.protocol.sdk.Eccezione;
  36. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  37. import org.openspcoop2.protocol.sdk.ProtocolException;
  38. import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
  39. import org.openspcoop2.protocol.sdk.constants.LivelloRilevanza;
  40. import org.openspcoop2.protocol.sdk.constants.RuoloMessaggio;
  41. import org.openspcoop2.protocol.sdk.state.IState;
  42. import org.openspcoop2.protocol.sdk.state.StateMessage;
  43. import org.openspcoop2.protocol.sdk.tracciamento.DriverTracciamentoNotFoundException;
  44. import org.openspcoop2.protocol.sdk.tracciamento.FiltroRicercaTracceConPaginazione;
  45. import org.openspcoop2.protocol.sdk.tracciamento.ITracciaDriver;
  46. import org.openspcoop2.protocol.sdk.tracciamento.InformazioniProtocollo;
  47. import org.openspcoop2.protocol.sdk.tracciamento.Traccia;
  48. import org.openspcoop2.utils.transport.TransportUtils;

  49. /**
  50.  * SDIValidazioneUtils
  51.  *
  52.  * @author Andrea Poli (apoli@link.it)
  53.  * @author $Author$
  54.  * @version $Rev$, $Date$
  55.  */
  56. public class SDIValidazioneUtils {

  57.     private IProtocolFactory<?> protocolFactory;
  58.     private SDIProperties sdiProperties;
  59.     private ITracciaDriver _tracciaDriver;
  60.    
  61.     public SDIValidazioneUtils(IProtocolFactory<?> protocolFactory) throws ProtocolException{
  62.         this.protocolFactory = protocolFactory;
  63.         this.sdiProperties = SDIProperties.getInstance(protocolFactory.getLogger());
  64.     }
  65.     private ITracciaDriver getDriverTracciamento() throws ProtocolException {
  66.         if(this._tracciaDriver==null) {
  67.             this._initDriverTracciamento();
  68.         }
  69.         return this._tracciaDriver;
  70.     }
  71.     private synchronized void _initDriverTracciamento() throws ProtocolException {
  72.         if(this._tracciaDriver==null) {
  73.             this._tracciaDriver = newDriverTracciamento(null);
  74.         }
  75.     }
  76.     private ITracciaDriver getDriverTracciamento(Connection con) throws ProtocolException {
  77.         if(con!=null) {
  78.             return newDriverTracciamento(con);
  79.         }
  80.         else {
  81.             return getDriverTracciamento();
  82.         }
  83.     }
  84.     private TracciaDriver newDriverTracciamento(Connection con) throws ProtocolException {
  85.         if(this.sdiProperties.isTracciamentoRequiredFromConfiguration()) {
  86.             try {
  87.                 ProtocolliRegistrati pRegistrati = new ProtocolliRegistrati(ProtocolFactoryManager.getInstance().getProtocolFactories());
  88.                
  89.                 String tipoDatabase = this.sdiProperties.getTracciamentoTipoDatabase();
  90.                 if(tipoDatabase==null) {
  91.                     tipoDatabase = OpenSPCoop2Properties.getInstance().getDatabaseType();
  92.                 }
  93.            
  94.                 ITracciaDriver tracciaDriver = this.protocolFactory.createTracciaDriver();
  95.                 if(tracciaDriver instanceof TracciaDriver) {
  96.                
  97.                     TracciaDriver tracciaDriverBasic = (TracciaDriver) tracciaDriver;
  98.                    
  99.                     if(con==null) {
  100.                         String datasource = this.sdiProperties.getTracciamentoDatasource();
  101.                         Properties datasourceJndiContext = this.sdiProperties.getTracciamentoDatasource_jndiContext();
  102.                         tracciaDriverBasic.init(pRegistrati, datasource, tipoDatabase, datasourceJndiContext, this.protocolFactory.getLogger());
  103.                     }
  104.                     else {
  105.                         tracciaDriverBasic.init(pRegistrati, con, tipoDatabase, this.protocolFactory.getLogger());
  106.                     }
  107.                    
  108.                     return tracciaDriverBasic;
  109.                    
  110.                 }
  111.                 else {
  112.                     throw new Exception("Unexpected traccciamento driver '"+this._tracciaDriver.getClass().getName()+"'");
  113.                 }
  114.                
  115.             }catch(Exception e) {
  116.                 throw new ProtocolException(e.getMessage(),e);
  117.             }
  118.         }
  119.         return null;
  120.     }
  121.    
  122.    
  123.     public Eccezione newEccezioneValidazione(CodiceErroreCooperazione codiceErrore) throws ProtocolException{
  124.         return Eccezione.getEccezioneValidazione(codiceErrore,null, this.protocolFactory);
  125.     }
  126.     public Eccezione newEccezioneValidazione(CodiceErroreCooperazione codiceErrore,String descrizioneErrore) throws ProtocolException{
  127.         return Eccezione.getEccezioneValidazione(codiceErrore, descrizioneErrore, this.protocolFactory);
  128.     }
  129.     public Eccezione newEccezioneValidazione(CodiceErroreCooperazione codiceErrore,String descrizioneErrore, Throwable e) throws ProtocolException{
  130.         if(this.protocolFactory!=null && this.protocolFactory.getLogger()!=null)
  131.             this.protocolFactory.getLogger().error(descrizioneErrore,e);
  132.         return Eccezione.getEccezioneValidazione(codiceErrore, descrizioneErrore, this.protocolFactory);
  133.     }
  134.    
  135.     public Eccezione newEccezioneValidazione(CodiceErroreCooperazione codiceErrore,boolean info) throws ProtocolException{
  136.         Eccezione ecc = Eccezione.getEccezioneValidazione(codiceErrore,null, this.protocolFactory);
  137.         if(info){
  138.             ecc.setRilevanza(LivelloRilevanza.INFO);
  139.         }
  140.         return ecc;
  141.     }
  142.     public Eccezione newEccezioneValidazione(CodiceErroreCooperazione codiceErrore,String descrizioneErrore,boolean info) throws ProtocolException{
  143.         Eccezione ecc =  Eccezione.getEccezioneValidazione(codiceErrore, descrizioneErrore, this.protocolFactory);
  144.         if(info){
  145.             ecc.setRilevanza(LivelloRilevanza.INFO);
  146.         }
  147.         return ecc;
  148.     }
  149.     public Eccezione newEccezioneValidazione(CodiceErroreCooperazione codiceErrore,String descrizioneErrore, Throwable e,boolean info) throws ProtocolException{
  150.         if(this.protocolFactory!=null && this.protocolFactory.getLogger()!=null)
  151.             this.protocolFactory.getLogger().error(descrizioneErrore,e);
  152.         Eccezione ecc =  Eccezione.getEccezioneValidazione(codiceErrore, descrizioneErrore, this.protocolFactory);
  153.         if(info){
  154.             ecc.setRilevanza(LivelloRilevanza.INFO);
  155.         }
  156.         return ecc;
  157.     }
  158.    
  159.     public Eccezione newEccezioneProcessamento(CodiceErroreCooperazione codiceErrore) throws ProtocolException{
  160.         return Eccezione.getEccezioneProcessamento(codiceErrore,null, this.protocolFactory);
  161.     }
  162.     public Eccezione newEccezioneProcessamento(CodiceErroreCooperazione codiceErrore,String descrizioneErrore) throws ProtocolException{
  163.         return Eccezione.getEccezioneProcessamento(codiceErrore, descrizioneErrore, this.protocolFactory);
  164.     }
  165.     public Eccezione newEccezioneProcessamento(CodiceErroreCooperazione codiceErrore,String descrizioneErrore, Throwable e) throws ProtocolException{
  166.         if(this.protocolFactory!=null && this.protocolFactory.getLogger()!=null)
  167.             this.protocolFactory.getLogger().error(descrizioneErrore,e);
  168.         return Eccezione.getEccezioneProcessamento(codiceErrore, descrizioneErrore, this.protocolFactory);
  169.     }
  170.    
  171.    
  172.    
  173.     public void addHeaderIdentificativoSdiMessaggio(OpenSPCoop2Message msg, String idSdi, String idSdiRiferimentoArchivio) {
  174.        
  175.         if(msg==null) {
  176.             return;
  177.         }
  178.         if(msg.getTransportRequestContext()==null || msg.getTransportRequestContext().getHeaders()==null) {
  179.             return;
  180.         }
  181.        
  182.         if(idSdi==null) {
  183.             return;
  184.         }
  185.         if(idSdiRiferimentoArchivio!=null) {
  186.             TransportUtils.addHeader(msg.getTransportRequestContext().getHeaders(),SDICostanti.SDI_HEADER_ID_CORRELAZIONE,idSdi + " "+idSdiRiferimentoArchivio);
  187.         }
  188.         else {
  189.             TransportUtils.addHeader(msg.getTransportRequestContext().getHeaders(),SDICostanti.SDI_HEADER_ID_CORRELAZIONE,idSdi);
  190.         }

  191.     }
  192.    
  193.     public void readInformazioniFatturaRiferita(Busta busta, String identificativoSdI,
  194.             String servizio, String azione,
  195.             boolean applicativoMittente, boolean fatturazioneAttiva,
  196.             IState state) throws ProtocolException {
  197.        
  198.         Connection con = null;
  199.         if(state!=null) {
  200.             if(state instanceof StateMessage) {
  201.                 StateMessage s = (StateMessage) state;
  202.                 try {
  203.                     if(s.getConnectionDB()!=null && !s.getConnectionDB().isClosed()) {
  204.                         con = s.getConnectionDB();
  205.                     }
  206.                 }catch(Exception e) {} // ignore
  207.             }
  208.         }
  209.        
  210.         ITracciaDriver tracciaDriver = this.getDriverTracciamento(con);
  211.         if(tracciaDriver==null) {
  212.             throw new ProtocolException("Accesso al database delle tracce non attivo");
  213.         }
  214.        
  215.         Traccia traccia = null;
  216.         if(fatturazioneAttiva) {
  217.        
  218.             // L'identificativo SDI si trova nella risposta per la fatturazione attiva. Tutte le altre informazioni nella richiesta.
  219.             Traccia tracciaRisposta = null;
  220.             FiltroRicercaTracceConPaginazione filtro = new FiltroRicercaTracceConPaginazione();
  221.             filtro.setTipoTraccia(RuoloMessaggio.RISPOSTA);
  222.             filtro.setInformazioniProtocollo(new InformazioniProtocollo());
  223.             filtro.getInformazioniProtocollo().setServizio(servizio);
  224.             filtro.getInformazioniProtocollo().setAzione(azione);
  225.             filtro.getInformazioniProtocollo().addProprietaProtocollo(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI, identificativoSdI);
  226.             filtro.setAsc(false);
  227.             filtro.setLimit(1);
  228.             List<Traccia> list = null;
  229.             try {
  230.                 list = tracciaDriver.getTracce(filtro);
  231.             }catch(DriverTracciamentoNotFoundException notFound) {}
  232.             catch(Exception e) {
  233.                 throw new ProtocolException(e.getMessage(),e);
  234.             }
  235.             if(list!=null && !list.isEmpty()) {
  236.                 tracciaRisposta = list.get(0);
  237.             }
  238.            
  239.             if(tracciaRisposta!=null && tracciaRisposta.getIdTransazione()!=null) {
  240.                 try {
  241.                     traccia = tracciaDriver.getTraccia(tracciaRisposta.getIdTransazione(), RuoloMessaggio.RICHIESTA);
  242.                 }catch(DriverTracciamentoNotFoundException notFound) {}
  243.                 catch(Exception e) {
  244.                     throw new ProtocolException(e.getMessage(),e);
  245.                 }
  246.                
  247.                 // e' solo l'identificativo SDI e c'รจ gia.
  248. //              if(traccia!=null) {
  249. //                  // riporto all'interno dell'oggetto le informazioni mancanti presenti sulla risposta
  250. //                  if(tracciaRisposta.getBusta()!=null && tracciaRisposta.getBusta().sizeProperties()>0) {
  251. //                      
  252. //                      String identificativoSDI = tracciaRisposta.getBusta().getProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI);
  253. //                      if(identificativoSDI!=null && !"".equals(identificativoSDI)) {
  254. //                          traccia.getProperties().put(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI, identificativoSDI);
  255. //                      }
  256. //                      
  257. //                  }
  258. //              }
  259.             }
  260.            
  261.            
  262.         }
  263.         else {
  264.             FiltroRicercaTracceConPaginazione filtro = new FiltroRicercaTracceConPaginazione();
  265.             filtro.setTipoTraccia(RuoloMessaggio.RICHIESTA);
  266.             filtro.setInformazioniProtocollo(new InformazioniProtocollo());
  267.             filtro.getInformazioniProtocollo().setServizio(servizio);
  268.             filtro.getInformazioniProtocollo().setAzione(azione);
  269.             filtro.getInformazioniProtocollo().addProprietaProtocollo(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI, identificativoSdI);
  270.             filtro.setAsc(false);
  271.             filtro.setLimit(1);
  272.             List<Traccia> list = null;
  273.             try {
  274.                 list = tracciaDriver.getTracce(filtro);
  275.             }catch(DriverTracciamentoNotFoundException notFound) {}
  276.             catch(Exception e) {
  277.                 throw new ProtocolException(e.getMessage(),e);
  278.             }
  279.             if(list!=null && !list.isEmpty()) {
  280.                 traccia = list.get(0); // solo nella fatturazione passiva ne potra' esistere piu' di una in seguito a piu' tentativi di consegna. Le informazioni (raccolte sottostante, escluse gli id messaggi) saranno comunque le stesse.
  281.             }
  282.         }
  283.         if(traccia!=null) {

  284.             if(applicativoMittente) {
  285.                 if(traccia.getBusta()!=null && traccia.getBusta().getServizioApplicativoFruitore()!=null &&
  286.                         !"".equals(traccia.getBusta().getServizioApplicativoFruitore())) {
  287.                     if(busta.getServizioApplicativoFruitore()==null) {
  288.                         busta.addProperty(SDICostanti.SDI_BUSTA_APPLICATIVO_MITTENTE_FATTURA,traccia.getBusta().getServizioApplicativoFruitore());
  289.                     }
  290.                 }
  291.             }
  292.            
  293.             if(traccia.getBusta()!=null && traccia.getBusta().sizeProperties()>0) {
  294.                
  295.                 String [] names = traccia.getBusta().getPropertiesNames();
  296.                
  297.                 if(names!=null && names.length>0) {
  298.                     List<String> nomiDaRiportare = new ArrayList<>();
  299.                     nomiDaRiportare.add(SDICostanti.SDI_BUSTA_EXT_CODICE_DESTINATARIO);
  300.                     nomiDaRiportare.add(SDICostanti.SDI_BUSTA_EXT_NOME_FILE_METADATI);
  301.                     nomiDaRiportare.add(SDICostanti.SDI_BUSTA_EXT_SOGGETTO_EMITTENTE);
  302.                    
  303.                     Map<String, String> nomiDaRiportareDiversamente = new HashMap<>();
  304.                     nomiDaRiportareDiversamente.put(SDICostanti.SDI_BUSTA_EXT_NOME_FILE, SDICostanti.SDI_BUSTA_EXT_NOME_FILE_FATTURA);
  305.                    
  306.                     List<String> prefissiDaRiportare = new ArrayList<>();
  307.                     prefissiDaRiportare.add(SDICostanti.SDI_BUSTA_EXT_RIFERIMENTO_FATTURA_PREFIX_);
  308.                     prefissiDaRiportare.add(SDICostanti.SDI_BUSTA_EXT_TRASMITTENTE_PREFIX_);
  309.                     prefissiDaRiportare.add(SDICostanti.SDI_BUSTA_EXT_CEDENTE_PRESTATORE_PREFIX_);
  310.                     prefissiDaRiportare.add(SDICostanti.SDI_BUSTA_EXT_CESSIONARIO_COMMITTENTE_PREFIX_);
  311.                     prefissiDaRiportare.add(SDICostanti.SDI_BUSTA_EXT_TERZO_INTERMEDIARIO_O_SOGGETTO_EMITTENTE_PREFIX_);
  312.                    
  313.                     for (int i = 0; i < names.length; i++) {
  314.                        
  315.                         String checkNome = names[i];
  316.                         if(checkNome==null || "".equals(checkNome)) {
  317.                             continue;
  318.                         }
  319.                         String checkValue = traccia.getBusta().getProperty(checkNome);
  320.                         if(checkValue==null || "".equals(checkValue)) {
  321.                             continue;
  322.                         }
  323.                        
  324.                         if(!nomiDaRiportare.isEmpty()) {
  325.                             for (String nome : nomiDaRiportare) {
  326.                                 if(checkNome.equals(nome)) {
  327.                                     if(!busta.existsProperty(checkNome)) {
  328.                                         busta.addProperty(checkNome, checkValue);
  329.                                     }
  330.                                 }
  331.                             }
  332.                         }
  333.                        
  334.                         if(!nomiDaRiportareDiversamente.isEmpty()) {
  335.                             for (String nome : nomiDaRiportareDiversamente.keySet()) {
  336.                                 if(checkNome.equals(nome)) {
  337.                                     if(!busta.existsProperty(checkNome)) {
  338.                                         busta.addProperty(nomiDaRiportareDiversamente.get(checkNome), checkValue);
  339.                                     }
  340.                                 }
  341.                             }
  342.                         }
  343.                        
  344.                         if(!prefissiDaRiportare.isEmpty()) {
  345.                             for (String prefix : prefissiDaRiportare) {
  346.                                 if(checkNome.startsWith(prefix)) {
  347.                                     if(!busta.existsProperty(checkNome)) {
  348.                                         busta.addProperty(checkNome, checkValue);
  349.                                     }
  350.                                 }
  351.                             }
  352.                         }
  353.                        
  354.                     }
  355.                 }
  356.                
  357.             }
  358.         }

  359.     }
  360. }