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

  21. import org.openspcoop2.core.id.IDServizio;
  22. import org.openspcoop2.core.id.IDSoggetto;
  23. import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
  24. import org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound;
  25. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  26. import org.openspcoop2.message.OpenSPCoop2Message;
  27. import org.openspcoop2.message.constants.ServiceBinding;
  28. import org.openspcoop2.protocol.engine.Configurazione;
  29. import org.openspcoop2.protocol.engine.driver.ProfiloDiCollaborazione;
  30. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  31. import org.openspcoop2.protocol.sdk.Busta;
  32. import org.openspcoop2.protocol.sdk.Context;
  33. import org.openspcoop2.protocol.sdk.Eccezione;
  34. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  35. import org.openspcoop2.protocol.sdk.ProtocolException;
  36. import org.openspcoop2.protocol.sdk.Servizio;
  37. import org.openspcoop2.protocol.sdk.config.IProtocolVersionManager;
  38. import org.openspcoop2.protocol.sdk.constants.ErroriCooperazione;
  39. import org.openspcoop2.protocol.sdk.constants.FunzionalitaProtocollo;
  40. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  41. import org.openspcoop2.protocol.sdk.constants.RuoloBusta;
  42. import org.openspcoop2.protocol.sdk.constants.StatoFunzionalitaProtocollo;
  43. import org.openspcoop2.protocol.sdk.state.IState;
  44. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  45. import org.openspcoop2.protocol.sdk.state.StatefulMessage;
  46. import org.openspcoop2.protocol.sdk.state.StatelessMessage;
  47. import org.openspcoop2.protocol.sdk.validator.IValidazioneSemantica;
  48. import org.openspcoop2.protocol.sdk.validator.ProprietaValidazione;
  49. import org.openspcoop2.protocol.sdk.validator.ValidazioneSemanticaResult;
  50. import org.openspcoop2.utils.LoggerWrapperFactory;
  51. import org.slf4j.Logger;

  52. /**
  53.  * Classe utilizzata per effettuare un controllo di registrazione dei soggetti di una busta nel registro dei servizi.
  54.  *
  55.  * @author Poli Andrea (apoli@link.it)
  56.  * @author Tronci Fabio (tronci@link.it)
  57.  * @author $Author$
  58.  * @version $Rev$, $Date$
  59.  *
  60.  */

  61. public class ValidazioneSemantica  {

  62.     /** Se IState e' un'istanza di StatefulMessage possiede una Connessione SQL in autoCommit mode su cui effettuare query
  63.      *  Altrimenti, e' un'istanza di StatelessMessage e nn necessita di connessioni  */
  64.     protected IState state;
  65.     /** Context */
  66.     protected Context context;
  67.     /** Errori di validazione riscontrati sulla busta */
  68.     protected java.util.List<Eccezione> erroriValidazione;
  69.     /** Errori di processamento riscontrati sulla busta */
  70.     protected java.util.List<Eccezione> erroriProcessamento;
  71.     /** Dettaglio errore */
  72.     protected IntegrationFunctionError errore_integrationFunctionError;
  73.     /** Busta */
  74.     protected Busta busta;
  75.     /** Validazione ID completa */
  76.     protected boolean validazioneIdentificativiCompleta = false;
  77.     /** ServizioCorrelato */
  78.     protected String servizioCorrelato;
  79.     /** Tipo ServizioCorrelato */
  80.     protected String tipoServizioCorrelato;
  81.     /** Versione ServizioCorrelato */
  82.     protected Integer versioneServizioCorrelato;
  83.     /** Azione Correlata */
  84.     protected String azioneCorrelata;
  85.     /** Reader Registro */
  86.     protected RegistroServiziManager registroServiziReader;
  87.     /** informazioni Servizio */
  88.     protected Servizio infoServizio = null;
  89.     /** Logger utilizzato per debug. */
  90.     protected Logger log = null;
  91.     private IProtocolFactory<?> protocolFactory;
  92.     public IProtocolFactory<?> getProtocolFactory(){
  93.         return this.protocolFactory;
  94.     }

  95.     /**
  96.      * Costruttore.
  97.      *
  98.      * @param aBusta Busta da validare.
  99.      * @param state Oggetto che rappresenta lo stato di una busta
  100.      *
  101.      */
  102.      
  103.     public ValidazioneSemantica(Busta aBusta, Context context, IState state, boolean validazioneIdentificativiCompleta, IProtocolFactory<?> protocolFactory){
  104.         this(aBusta,context, state,validazioneIdentificativiCompleta,Configurazione.getLibraryLog(), protocolFactory);
  105.     }
  106.    
  107.     /**
  108.      * Costruttore.
  109.      *
  110.      * @param aBusta Busta da validare.
  111.      * @param state Oggetto che rappresenta lo stato di una busta
  112.      *
  113.      */
  114.      
  115.     public ValidazioneSemantica(Busta aBusta, Context context, IState state, boolean validazioneIdentificativiCompleta, Logger alog, IProtocolFactory<?> protocolFactory){
  116.         this.busta = aBusta;
  117.         this.context = context;
  118.         this.state = state;
  119.         this.registroServiziReader = RegistroServiziManager.getInstance(state);
  120.         if(alog!=null){
  121.             this.log = alog;
  122.         }else{
  123.             this.log = LoggerWrapperFactory.getLogger(ValidazioneSemantica.class);
  124.         }
  125.         this.validazioneIdentificativiCompleta = validazioneIdentificativiCompleta;
  126.         this.protocolFactory = protocolFactory;
  127.     }


  128.     /**
  129.      * Ritorna un List contenente eventuali eccezioni di validazione riscontrate nella busta.  
  130.      *
  131.      * @return Eccezioni riscontrate nella busta.
  132.      *
  133.      */
  134.     public java.util.List<Eccezione> getEccezioniValidazione(){
  135.         return this.erroriValidazione;
  136.     }
  137.     /**
  138.      * Ritorna un List contenente eventuali eccezioni di processamento riscontrate nella busta.  
  139.      *
  140.      * @return Eccezioni riscontrate nella busta.
  141.      *
  142.      */
  143.     public java.util.List<Eccezione> getEccezioniProcessamento(){
  144.         return this.erroriProcessamento;
  145.     }
  146.    
  147.     public IntegrationFunctionError getErrore_integrationFunctionError() {
  148.         return this.errore_integrationFunctionError;
  149.     }
  150.    
  151.     /**
  152.      * Metodo che effettua la validazione dei soggetti di una busta, controllando la loro registrazione nel registro dei servizi.
  153.      *
  154.      * Mano mano che sono incontrati errori di validazione, viene creato un oggetto
  155.      *   {@link Eccezione}, e viene inserito nel List <var>errors</var>.
  156.      *
  157.      * @param proprietaValidazione tipo di Validazione
  158.      * @throws ProtocolException
  159.      *
  160.      */
  161.     public void valida(OpenSPCoop2Message msg, ProprietaValidazione proprietaValidazione,RuoloBusta tipoBusta,String versioneProtocollo, RequestInfo requestInfo) throws ProtocolException{
  162.         try {
  163.            
  164.             proprietaValidazione.setValidazioneIDCompleta(this.validazioneIdentificativiCompleta);
  165.             proprietaValidazione.setVersioneProtocollo(versioneProtocollo);
  166.             IValidazioneSemantica validazioneSemantica = this.protocolFactory.createValidazioneSemantica(this.state);
  167.             validazioneSemantica.setContext(this.context);
  168.             ValidazioneSemanticaResult result = validazioneSemantica.valida(msg, this.busta, proprietaValidazione, tipoBusta);
  169.             this.infoServizio = result.getInfoServizio();
  170.             this.servizioCorrelato = result.getServizioCorrelato();
  171.             this.tipoServizioCorrelato = result.getTipoServizioCorrelato();
  172.             this.versioneServizioCorrelato = result.getVersioneServizioCorrelato();
  173.             this.erroriProcessamento = result.getErroriProcessamento();
  174.             if(this.erroriProcessamento == null)
  175.                 this.erroriProcessamento = new java.util.ArrayList<Eccezione>();
  176.             this.erroriValidazione = result.getErroriValidazione();
  177.             if(this.erroriValidazione == null)
  178.                 this.erroriValidazione = new java.util.ArrayList<Eccezione>();
  179.             this.errore_integrationFunctionError = result.getErrore_integrationFunctionError();
  180.            
  181.             // Controllo correlazione alla richiesta per buste contenenti Risposte o ricevute
  182.             //System.out.println("TIPO BUSTA ["+tipoBusta+"]");
  183.             if(this.erroriValidazione.size()==0 && this.erroriProcessamento.size()==0 && this.busta!=null ){
  184.                 if( RuoloBusta.BUSTA_DI_SERVIZIO.equals(tipoBusta.toString()) == false &&
  185.                         RuoloBusta.RICHIESTA.equals(tipoBusta.toString()) == false){
  186.                     //log.info("Validazione correlazione...");
  187.                     validazioneCorrelazione(tipoBusta);
  188.                 }
  189.             }
  190.            
  191.             // Controllo riferimentoMessaggio
  192.             if(this.erroriValidazione.size()==0 && this.erroriProcessamento.size()==0 && this.busta!=null && this.busta.getRiferimentoMessaggio()!=null){
  193.                 validazioneRiferimentoMessaggio(tipoBusta);
  194.             }
  195.            
  196.             // Riconoscimento collaborazione
  197.             if(this.erroriValidazione.size()==0 && this.erroriProcessamento.size()==0 && this.busta!=null && this.busta.getProfiloDiCollaborazione()!=null ){
  198.                 // Controllo Collaborazione (validazioneID e Riconoscimento)
  199.                 // Controllo che non deve essere effettuato se ho ricevuto un Fault
  200.                 if( RuoloBusta.BUSTA_DI_SERVIZIO.equals(tipoBusta.toString()) == false ){
  201.                     //log.info("Validazione Collaborazione...");
  202.                     IProtocolVersionManager protocolVersioneManager = this.protocolFactory.createProtocolVersionManager(versioneProtocollo);
  203.                     StatoFunzionalitaProtocollo modalitaGestioneCollaborazione = protocolVersioneManager.getCollaborazione(this.busta);
  204.                     if(StatoFunzionalitaProtocollo.ABILITATA.equals(modalitaGestioneCollaborazione) ||
  205.                             (StatoFunzionalitaProtocollo.REGISTRO.equals(modalitaGestioneCollaborazione) && (this.infoServizio!=null) && this.infoServizio.getCollaborazione() ) ){
  206.                         riconoscimentoCollaborazione(tipoBusta, requestInfo);      
  207.                     }
  208.                 }
  209.             }
  210.            
  211.         } catch (ProtocolException e) {
  212.             this.log.error("ProtocolException error",e);
  213.             throw e;
  214.         }
  215.     }

  216.     public static String riconoscimentoVersioneProtocolloServizioErogato(Busta busta, org.openspcoop2.protocol.sdk.config.ITraduttore costanti, RuoloBusta tipoBusta, IState state, RequestInfo requestInfo) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
  217.         // Normalmente prendo il soggetto destinatario come erogatore del servizio.
  218.         // Devono essere gestiti i seguenti casi particolari, in cui devo invece prendere il mittente
  219.         // - risposta sincrona
  220.         // - ricevute asincrone asimmetriche
  221.         //
  222.         // Caso speciale è il profilo asincrono simmetrico
  223.         // - richiesta l'erogatore è il destinatario
  224.         // - ricevuta alla richiesta è il mittente
  225.         // - risposta è il destinatario, però se per il servizio non è definito un profilo, poi devo vedere il fruitore, ancora per il destinatario
  226.         // - ricevuta alla risposta è il mittente, però se per il servizio non è definito un profilo, poi devo vedere il fruitore, ancora per il mittente
  227.         //
  228.         // Inoltre deve essere gestito il caso in cui la busta arrivata non contiene un servizio.
  229.         // In tal caso mi base sul soggetto mittente, se questo ha profilo che supporta i riscontri, può darsi che mi sta inviando una busta di servizio.
  230.         // Altrimenti, questo non puo' succedere e verrà segnalato un errore

  231.         IDSoggetto idSoggettoFruitoreProfiloGestito = null;
  232.         if(busta.getTipoServizio()!=null && busta.getServizio()!=null){    
  233.             IDSoggetto idSoggettoErogatoreProfiloGestito = null;
  234.             if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(busta.getProfiloDiCollaborazione()) && RuoloBusta.RISPOSTA.equals(tipoBusta.toString())){
  235.                 idSoggettoErogatoreProfiloGestito = new IDSoggetto(busta.getTipoMittente(), busta.getMittente());
  236.                 idSoggettoFruitoreProfiloGestito = new IDSoggetto(busta.getTipoDestinatario(), busta.getDestinatario());
  237.             }else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(busta.getProfiloDiCollaborazione()) && (RuoloBusta.RICHIESTA.equals(tipoBusta.toString())==false) ){
  238.                 if(RuoloBusta.RICEVUTA_RICHIESTA.equals(tipoBusta.toString())){
  239.                     idSoggettoErogatoreProfiloGestito = new IDSoggetto(busta.getTipoMittente(), busta.getMittente());
  240.                     idSoggettoFruitoreProfiloGestito = new IDSoggetto(busta.getTipoDestinatario(), busta.getDestinatario());
  241.                 }else if(RuoloBusta.RISPOSTA.equals(tipoBusta.toString())){
  242.                     idSoggettoErogatoreProfiloGestito = new IDSoggetto(busta.getTipoDestinatario(), busta.getDestinatario());
  243.                     idSoggettoFruitoreProfiloGestito = new IDSoggetto(busta.getTipoDestinatario(), busta.getDestinatario());
  244.                 }else { // RICEVUTA_RISPOSTA
  245.                     idSoggettoErogatoreProfiloGestito = new IDSoggetto(busta.getTipoMittente(), busta.getMittente());
  246.                     idSoggettoFruitoreProfiloGestito = new IDSoggetto(busta.getTipoMittente(), busta.getMittente());
  247.                 }
  248.             }else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(busta.getProfiloDiCollaborazione()) &&
  249.                     (RuoloBusta.RICEVUTA_RICHIESTA.equals(tipoBusta.toString()) || RuoloBusta.RICEVUTA_RISPOSTA.equals(tipoBusta.toString())) ){
  250.                 idSoggettoErogatoreProfiloGestito = new IDSoggetto(busta.getTipoMittente(), busta.getMittente());
  251.                 idSoggettoFruitoreProfiloGestito = new IDSoggetto(busta.getTipoDestinatario(), busta.getDestinatario());
  252.             }else{
  253.                 idSoggettoErogatoreProfiloGestito = new IDSoggetto(busta.getTipoDestinatario(), busta.getDestinatario());
  254.                 idSoggettoFruitoreProfiloGestito = new IDSoggetto(busta.getTipoMittente(), busta.getMittente());
  255.             }
  256.            
  257.             IDServizio idServizioProfiloGestito = IDServizioFactory.getInstance().getIDServizioFromValues(busta.getTipoServizio(), busta.getServizio(),
  258.                     idSoggettoErogatoreProfiloGestito,
  259.                     busta.getVersioneServizio());
  260.             idServizioProfiloGestito.setAzione(busta.getAzione());
  261.            
  262.             return RegistroServiziManager.getInstance(state).getProfiloGestioneErogazioneServizio(idSoggettoFruitoreProfiloGestito, idServizioProfiloGestito, null, requestInfo);
  263.         }
  264.         else{
  265.             idSoggettoFruitoreProfiloGestito = new IDSoggetto(busta.getTipoMittente(), busta.getMittente());
  266.             return RegistroServiziManager.getInstance(state).getProfiloGestioneSoggetto(idSoggettoFruitoreProfiloGestito, null, requestInfo);
  267.         }
  268.     }


  269.     public static RuoloBusta getTipoBustaDaValidare(ServiceBinding serviceBinding, Busta busta, org.openspcoop2.protocol.sdk.IProtocolFactory<?> protocolFactory,
  270.             boolean rispostaConnectionReply, IState state, Logger log) throws ProtocolException{

  271.         RuoloBusta tipo = RuoloBusta.BUSTA_DI_SERVIZIO;

  272.         if(busta.getProfiloDiCollaborazione()==null ||
  273.                 busta.getServizio()==null ||
  274.                 busta.getTipoServizio()==null){
  275.             tipo = RuoloBusta.BUSTA_DI_SERVIZIO;
  276.         }

  277.         // OneWay
  278.         else if(busta.getProfiloDiCollaborazione().equals(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY) &&
  279.                 busta.getRiferimentoMessaggio()!=null) {
  280.             // X Interoperabilita' spcoop
  281.             if(protocolFactory.createProtocolConfiguration().isSupportato(serviceBinding, FunzionalitaProtocollo.RIFERIMENTO_ID_RICHIESTA)) {
  282.                 tipo = RuoloBusta.RICHIESTA;
  283.             }
  284.             else {
  285.                 tipo = RuoloBusta.BUSTA_DI_SERVIZIO;
  286.             }
  287.         }else if(busta.getProfiloDiCollaborazione().equals(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY))
  288.             tipo = RuoloBusta.RICHIESTA;

  289.         // Sincrono
  290.         else if(busta.getProfiloDiCollaborazione().equals(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO)){
  291.             if(busta.getRiferimentoMessaggio() == null) {
  292.                 tipo = RuoloBusta.RICHIESTA;
  293.             }else {
  294.                 if(rispostaConnectionReply) {
  295.                     tipo = RuoloBusta.RISPOSTA;
  296.                 }
  297.                 else {
  298.                     if(protocolFactory.createProtocolConfiguration().isSupportato(serviceBinding, FunzionalitaProtocollo.RIFERIMENTO_ID_RICHIESTA)) {
  299.                         tipo = RuoloBusta.RICHIESTA;
  300.                     }
  301.                     else {
  302.                         tipo = RuoloBusta.RISPOSTA;
  303.                     }
  304.                 }
  305.             }
  306.         }
  307.        
  308.         // Asincrono Simmetrico e Asimmetrico
  309.         else if( (busta.getProfiloDiCollaborazione().equals(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO)) ||
  310.                 (busta.getProfiloDiCollaborazione().equals(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO)) ){
  311.             // NOTA:
  312.             //   una busta asincrona RISPOSTA puo avere riferimentoMessaggio o collaborazione
  313.        
  314.             if( (busta.getRiferimentoMessaggio() == null) && (busta.getCollaborazione()==null) ){
  315.                 tipo = RuoloBusta.RICHIESTA;
  316.             } else {
  317.                 ProfiloDiCollaborazione profilo = new ProfiloDiCollaborazione(state, log, protocolFactory);
  318.                 if(profilo.asincrono_isRicevutaRichiesta(busta.getRiferimentoMessaggio())){
  319.                     tipo = RuoloBusta.RICEVUTA_RICHIESTA;  
  320.                 }else if(profilo.asincrono_isRicevutaRisposta(busta.getRiferimentoMessaggio())){
  321.                     tipo = RuoloBusta.RICEVUTA_RISPOSTA;    
  322.                 }else if( (rispostaConnectionReply==false) && (profilo.asincrono_isRisposta(busta)) ){
  323.                     tipo = RuoloBusta.RISPOSTA;
  324.                 }else{
  325.                     tipo = RuoloBusta.RICHIESTA;
  326.                 }
  327.             }
  328.         }
  329.         return tipo;
  330.     }

  331.  
  332.     /**
  333.      * Metodo che si occupa di validare l'identificativo <var>id</var> secondo la specifica.
  334.      *
  335.      * @param id identificativo da validare
  336.      * @return il valore boolean true se l'identificativo fornito e' conforme alla specifica. Altrimenti false.
  337.      * @throws ProtocolException
  338.      *
  339.      */
  340.     public boolean validazioneID(String id) throws ProtocolException{
  341.         return validazioneID(id,null,null,null);
  342.     }

  343.     /**
  344.      * Metodo che si occupa di validare l'identificativo <var>id</var> secondo la specifica.
  345.      * L'identificativo e' formato da :
  346.      * codAmministrazione_codPortaDominio_num.progressivo_data_ora
  347.      * <p>
  348.      * Il codice Amministrazione e' preso da <var>codAmm</var>.
  349.      * Il codice Amministrazione deve contenere l'identificativo parte del mittente, quando deve essere validato
  350.      * un identificativo del messaggio od una collaborazione di una richiesta
  351.      * (oneWay, richiestaSincrona , richiesta/ricevutaRisposta AsincronaSimmetrica ,
  352.      *  richiesta/richiestaStato AsincronaAsimmetrica), poiche' e' lui che lo ha spedito
  353.      * e che ha quindi creato l'identificatore.
  354.      * Deve contenere invece il codice del destinatario, quando deve essere validato un RiferimentoMessaggio, od una
  355.      * collaborazione di una risposta (Sincrona , ricevutaRichiesta/Risposta AsincronaSimmetrica ,
  356.      * ricevutaRichiesta/ricevutaRichiestaStato AsincronaAsimmetrica),
  357.      * poiche' la creazione dell'identificatore venne fatta dal destinatario quando creo' la richiesta.
  358.      * <p>
  359.      * Il codice amministrativo <var>codAmm</var>,  sara' utilizzato anche per ottenere dal
  360.      * registro dei servizi di openspcoop la validazione del codice della Porta di Dominio presente nell'identificativo.
  361.      *
  362.      * Prima di invocare questo metodo deve essere stata effettuata l'inizializzazione
  363.      * dell'engine utilizzato per leggere all'interno del registro dei servizi,
  364.      * attraverso il metodo 'initialize' della classe {@link org.openspcoop2.protocol.registry.RegistroServiziReader}
  365.      *
  366.      * @param id identificativo da validare
  367.      * @param codAmm Identificativo Parte mittente o destinatario di una busta.
  368.      * @param codDominio Identificativo del dominio del codice di amministrazione
  369.      * @return il valore boolean true se l'identificativo fornito e' conforme alla specifica. Altrimenti false.
  370.      * @throws ProtocolException
  371.      *
  372.      */
  373.     private boolean validazioneID(String id, String tipoCodAmm, String codAmm, String codDominio) throws ProtocolException{
  374.         ProprietaValidazione proprietaValidazione = new ProprietaValidazione();
  375.         proprietaValidazione.setValidazioneIDCompleta(this.validazioneIdentificativiCompleta);
  376.         IDSoggetto dominio = new IDSoggetto(tipoCodAmm, codAmm, codDominio);
  377.         return this.protocolFactory.createValidazioneSemantica(this.state).validazioneID(id, dominio, proprietaValidazione);
  378.     }

  379.    
  380.     /**
  381.      * Metodo che si occupa di validare il riferimento del messaggio
  382.      *
  383.      * @param tipoBusta tipo di Busta da validare
  384.      *
  385.      */
  386.     private void validazioneRiferimentoMessaggio(RuoloBusta tipoBusta)throws ProtocolException{
  387.         if(this.state==null &&
  388.                 RuoloBusta.RICHIESTA.equals(tipoBusta) &&
  389.                 this.busta!=null
  390.                 &&
  391.                 (
  392.                         org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(this.busta.getProfiloDiCollaborazione())
  393.                         ||
  394.                         org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(this.busta.getProfiloDiCollaborazione())
  395.                 )
  396.                 ) {
  397.             return; // per supportare il rilascio della connessione
  398.         }
  399.        
  400.         if(this.state instanceof StatefulMessage) {
  401.             StatefulMessage stateful = (StatefulMessage)this.state;

  402.             //OneWay: non importa il riferimentoMessaggio...

  403.             org.openspcoop2.protocol.engine.driver.ProfiloDiCollaborazione profiloDiCollaborazione =
  404.                 new org.openspcoop2.protocol.engine.driver.ProfiloDiCollaborazione(stateful, this.log, this.protocolFactory);
  405.             boolean error = false;

  406.             // Sincrono
  407.             if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(this.busta.getProfiloDiCollaborazione())){
  408.                 if( RuoloBusta.RISPOSTA.equals(tipoBusta.toString()) ){
  409.                     if(profiloDiCollaborazione.sincrono_validazioneRiferimentoMessaggio(this.busta.getRiferimentoMessaggio())==false){
  410.                         error = true;
  411.                     }
  412.                 }
  413.             }  

  414.             // Asincrono Simmetrico
  415.             else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(this.busta.getProfiloDiCollaborazione())){
  416.                 if(profiloDiCollaborazione.asincronoSimmetrico_validazioneRiferimentoMessaggio(this.busta.getRiferimentoMessaggio())==false){
  417.                     error = true;
  418.                 }
  419.             }

  420.             //  Asincrono Asimmetrico
  421.             else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(this.busta.getProfiloDiCollaborazione())){
  422.                 if(RuoloBusta.RISPOSTA.equals(tipoBusta.toString())){
  423.                     // richiestaStato
  424.                     if(profiloDiCollaborazione.asincronoAsimmetrico_validazioneRiferimentoMessaggio_richiestaStato(this.busta.getRiferimentoMessaggio())==false){
  425.                         error = true;
  426.                     }
  427.                 }else {
  428.                     // ricevuta
  429.                     if(profiloDiCollaborazione.asincronoAsimmetrico_validazioneRiferimentoMessaggio_ricevuta(this.busta.getRiferimentoMessaggio())==false){
  430.                         error = true;
  431.                     }
  432.                 }
  433.             }

  434.             if(error){
  435.                 Eccezione ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.RIFERIMENTO_MESSAGGIO_NON_VALIDO.getErroreCooperazione(), this.protocolFactory);
  436.                 this.erroriValidazione.add(ecc);
  437.             }
  438.         }else if (this.state instanceof StatelessMessage){
  439.             // Lo stateless gestisce solo i profili oneway e sincrono
  440.             // Il oneway non ha una busta correlata
  441.             if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(this.busta.getProfiloDiCollaborazione())){
  442.                 StatelessMessage stateless = (StatelessMessage)this.state;
  443.                 Busta bustaCorrelata = stateless.getBustaCorrelata();
  444.                 if(bustaCorrelata!=null){
  445.                     if(this.busta.getRiferimentoMessaggio()!=null && !(this.busta.getRiferimentoMessaggio().equals(bustaCorrelata.getID())) ){
  446.                         Eccezione ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.RIFERIMENTO_MESSAGGIO_NON_VALIDO.getErroreCooperazione(), this.protocolFactory);
  447.                         this.erroriValidazione.add(ecc);
  448.                     }
  449.                 }
  450.             }
  451.         }else{
  452.             throw new ProtocolException("Metodo invocato con IState non valido");
  453.         }
  454.     }
  455.    
  456.     private void riconoscimentoCollaborazione(RuoloBusta tipoBusta, RequestInfo requestInfo) throws ProtocolException{
  457.                
  458.         //log.info("Validazione mittente...");
  459.         // Mittente: check registrazione nel Registro dei Servizi
  460.         IDSoggetto soggMitt = new IDSoggetto(this.busta.getTipoMittente(),this.busta.getMittente());
  461.         String dominioMittente = null;
  462.         try{
  463.             dominioMittente = this.registroServiziReader.getDominio(soggMitt,null,this.protocolFactory, requestInfo); //null=allRegistri
  464.             if(dominioMittente==null)
  465.                 throw new Exception("Dominio non definito");
  466.         }catch(DriverRegistroServiziNotFound es){
  467.             Eccezione ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.MITTENTE_SCONOSCIUTO.getErroreCooperazione(), this.protocolFactory);
  468.             this.log.debug("Identificazione mittente fallita:"+es.getMessage());
  469.             this.erroriValidazione.add(ecc);
  470.             return;
  471.         }catch(Exception es){
  472.             Eccezione ecc = Eccezione.getEccezioneProcessamento(ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.
  473.                     getErroreProcessamento("Identificazione mittente non riuscita: errore di processamento"), this.protocolFactory);
  474.             this.log.error("Identificazione mittente non riuscita",es);
  475.             this.erroriProcessamento.add(ecc);
  476.             return;
  477.         }

  478.         //log.info("Validazione destinatario...");
  479.         // Destinatario: check registrazione nel Registro dei Servizi
  480.         IDSoggetto soggDest = new IDSoggetto(this.busta.getTipoDestinatario(),this.busta.getDestinatario());
  481.         String dominioDestinatario = null;
  482.         try{
  483.             dominioDestinatario = this.registroServiziReader.getDominio(soggDest,null,this.protocolFactory, requestInfo); // null=allRegistri
  484.             if(dominioDestinatario==null)
  485.                 throw new Exception("Dominio non definito");
  486.         }catch(DriverRegistroServiziNotFound es){
  487.             Eccezione ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.DESTINATARIO_SCONOSCIUTO.getErroreCooperazione(), this.protocolFactory);
  488.             this.log.debug("Identificazione destinatario fallita: "+es.getMessage());
  489.             this.erroriValidazione.add(ecc);
  490.             return;
  491.         }catch(Exception es){
  492.             Eccezione ecc = Eccezione.getEccezioneProcessamento(ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.
  493.                     getErroreProcessamento("Identificazione destinatario non riuscita: errore di processamento"), this.protocolFactory);
  494.             this.log.error("Identificazione destinatario non riuscita",es);
  495.             this.erroriProcessamento.add(ecc);
  496.             return;
  497.         }
  498.        
  499.        
  500.         // La collaborazione deve appartenere o al mittente, o al destinatario della busta.
  501.         if(this.busta.getCollaborazione()!=null){
  502.             if( (validazioneID(this.busta.getCollaborazione(),this.busta.getTipoMittente(),this.busta.getMittente(),dominioMittente) == false) &&
  503.                     (validazioneID(this.busta.getCollaborazione(),this.busta.getTipoDestinatario(),this.busta.getDestinatario(),dominioDestinatario) == false) ){
  504.                 Eccezione ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.COLLABORAZIONE_NON_VALIDA.getErroreCooperazione(), this.protocolFactory);
  505.                 this.erroriValidazione.add(ecc);
  506.                 return;
  507.             }
  508.         }
  509.        
  510.         boolean validaIdCollaborazioneProfiliNonOneway = false;
  511.         boolean validaIdCollaborazioneConsegnaInOrdine = false;
  512.         if(!org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(this.busta.getProfiloDiCollaborazione())){
  513.             validaIdCollaborazioneProfiliNonOneway = (tipoBusta.equals(RuoloBusta.RICHIESTA) == false);
  514.         }
  515.         else {
  516.             if(this.busta.getSequenza()!=-1 && this.busta.getCollaborazione()!=null) {
  517.                 validaIdCollaborazioneConsegnaInOrdine = true;
  518.             }
  519.         }
  520.        
  521.         if(!validaIdCollaborazioneProfiliNonOneway && !validaIdCollaborazioneConsegnaInOrdine) {
  522.             return;
  523.         }
  524.        
  525.         if(this.state instanceof StatefulMessage) {
  526.             StatefulMessage stateful = (StatefulMessage)this.state;
  527.             if(this.busta.getCollaborazione()!=null){

  528.                 org.openspcoop2.protocol.engine.driver.ProfiloDiCollaborazione profiloDiCollaborazione =
  529.                     new org.openspcoop2.protocol.engine.driver.ProfiloDiCollaborazione(stateful, this.log, this.protocolFactory);
  530.                
  531.                 // Validazione Collaborazione.
  532.                 boolean error = false;

  533.                 // Check per profili non oneway
  534.                 if(!org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(this.busta.getProfiloDiCollaborazione())){

  535.                     //  Sulla busta di richiesta non posso effettuare alcun controllo.
  536.                     if(tipoBusta.equals(RuoloBusta.RICHIESTA) == false){

  537.                         // buste di risposta/ricevuta
  538.                         //  Sincrono
  539.                         if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(this.busta.getProfiloDiCollaborazione())){
  540.                             if(RuoloBusta.RISPOSTA.equals(tipoBusta.toString())){
  541.                                 if(profiloDiCollaborazione.sincrono_validazioneCollaborazione(this.busta.getRiferimentoMessaggio(),this.busta.getCollaborazione())==false){
  542.                                     error = true;
  543.                                 }
  544.                             }
  545.                         }
  546.                         // Asincrono Simmetrico
  547.                         else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(this.busta.getProfiloDiCollaborazione())){
  548.                             // Risposta
  549.                             if(RuoloBusta.RISPOSTA.equals(tipoBusta.toString())){
  550.                                 if(profiloDiCollaborazione.asincronoSimmetrico_validazioneCollaborazione_risposta(this.busta.getRiferimentoMessaggio(),this.busta.getCollaborazione())==false){
  551.                                     error = true;
  552.                                 }
  553.                             }else if(RuoloBusta.RICEVUTA_RICHIESTA.equals(tipoBusta.toString()) || RuoloBusta.RICEVUTA_RISPOSTA.equals(tipoBusta.toString())){
  554.                                 if(profiloDiCollaborazione.asincronoSimmetrico_validazioneCollaborazione_ricevuta(this.busta.getRiferimentoMessaggio(),this.busta.getCollaborazione())==false){
  555.                                     error = true;
  556.                                 }
  557.                             }
  558.                         }
  559.                         // Asincrono Asimmetrico
  560.                         else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(this.busta.getProfiloDiCollaborazione())){
  561.                             // richiestaStato
  562.                             if(RuoloBusta.RISPOSTA.equals(tipoBusta.toString())){
  563.                                 if(profiloDiCollaborazione.asincronoAsimmetrico_validazioneCollaborazione_richiestaStato(this.busta.getRiferimentoMessaggio(),this.busta.getCollaborazione())==false){
  564.                                     error = true;
  565.                                 }
  566.                             }else if(RuoloBusta.RICEVUTA_RICHIESTA.equals(tipoBusta.toString()) || RuoloBusta.RICEVUTA_RISPOSTA.equals(tipoBusta.toString())){
  567.                                 if(profiloDiCollaborazione.asincronoAsimmetrico_validazioneCollaborazione_ricevuta(this.busta.getRiferimentoMessaggio(),this.busta.getCollaborazione())==false){
  568.                                     error = true;
  569.                                 }
  570.                             }
  571.                         }  
  572.                     }
  573.                 }

  574.                 // check per profilo oneway
  575.                 else{
  576.                    
  577.                     if(validaIdCollaborazioneConsegnaInOrdine) {
  578.                         org.openspcoop2.protocol.engine.driver.ConsegnaInOrdine consegna = new org.openspcoop2.protocol.engine.driver.ConsegnaInOrdine(stateful,this.log,this.protocolFactory);
  579.                         Eccezione ecc = consegna.validazioneDatiConsegnaInOrdine(this.busta, this.protocolFactory);
  580.                         if(ecc!=null){
  581.                             this.erroriValidazione.add(ecc);
  582.                             return;
  583.                         }
  584.                     }

  585.                 }

  586.                 // se errori sono stati riscontrati in un profilo non oneWay
  587.                 if(error){
  588.                     Eccezione ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.COLLABORAZIONE_SCONOSCIUTA.getErroreCooperazione(), this.protocolFactory);
  589.                     this.erroriValidazione.add(ecc);
  590.                     return;
  591.                 }
  592.             }

  593.             return;
  594.         }else if (this.state instanceof StatelessMessage){
  595.             // Lo stateless gestisce solo i profili oneway e sincrono
  596.            
  597.             StatelessMessage stateless = (StatelessMessage)this.state;
  598.            
  599.             // Check per profili oneway
  600.             if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(this.busta.getProfiloDiCollaborazione())){
  601.            
  602.                 if(validaIdCollaborazioneConsegnaInOrdine) {
  603.                     org.openspcoop2.protocol.engine.driver.ConsegnaInOrdine consegna = new org.openspcoop2.protocol.engine.driver.ConsegnaInOrdine(stateless,this.log,this.protocolFactory);
  604.                     Eccezione ecc = consegna.validazioneDatiConsegnaInOrdine(this.busta, this.protocolFactory);
  605.                     if(ecc!=null){
  606.                         this.erroriValidazione.add(ecc);
  607.                         return;
  608.                     }
  609.                 }
  610.                
  611.             }
  612.            
  613.             return;
  614.         }else{
  615.             throw new ProtocolException("Metodo invocato con IState non valido");
  616.         }
  617.     }
  618.    
  619.     /**
  620.      * Effettua la validazione della correlazione con la precedente richiesta
  621.      *
  622.      * @param tipoBusta tipo di Busta da validare
  623.      *
  624.      */
  625.     private void validazioneCorrelazione(RuoloBusta tipoBusta) throws ProtocolException{
  626.         if(this.state instanceof StatefulMessage) {
  627.             StatefulMessage stateful = (StatefulMessage)this.state;
  628.             org.openspcoop2.protocol.engine.driver.ProfiloDiCollaborazione profiloDiCollaborazione =
  629.                 new org.openspcoop2.protocol.engine.driver.ProfiloDiCollaborazione(stateful, this.log, this.protocolFactory);
  630.             Eccezione ecc = null;
  631.             if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(this.busta.getProfiloDiCollaborazione())){
  632.                 if( RuoloBusta.RISPOSTA.equals(tipoBusta.toString()) ){
  633.                     ecc = profiloDiCollaborazione.sincrono_validazioneCorrelazione(this.busta, this.protocolFactory);
  634.                 }
  635.             }
  636.             else if( org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(this.busta.getProfiloDiCollaborazione()) ){
  637.                 if( RuoloBusta.RICEVUTA_RICHIESTA.equals(tipoBusta.toString()) ){
  638.                     ecc = profiloDiCollaborazione.asincronoSimmetrico_validazioneCorrelazione_ricevutaRichiesta(this.busta, this.protocolFactory);
  639.                 }else if( RuoloBusta.RISPOSTA.equals(tipoBusta.toString()) ){
  640.                     ecc = profiloDiCollaborazione.asincronoSimmetrico_validazioneCorrelazione_risposta(this.busta, this.protocolFactory);
  641.                 }else if( RuoloBusta.RICEVUTA_RISPOSTA.equals(tipoBusta.toString()) ){
  642.                     ecc = profiloDiCollaborazione.asincronoSimmetrico_validazioneCorrelazione_ricevutaRisposta(this.busta, this.protocolFactory);
  643.                 }
  644.             }
  645.             else if( org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(this.busta.getProfiloDiCollaborazione()) ){
  646.                 if( RuoloBusta.RICEVUTA_RICHIESTA.equals(tipoBusta.toString()) ){
  647.                     ecc = profiloDiCollaborazione.asincronoAsimmetrico_validazioneCorrelazione_ricevutaRichiesta(this.busta, this.protocolFactory);
  648.                 }else if( RuoloBusta.RISPOSTA.equals(tipoBusta.toString()) ){
  649.                     ecc = profiloDiCollaborazione.asincronoAsimmetrico_validazioneCorrelazione_richiestaStato(this.busta, this.protocolFactory);
  650.                 }else if( RuoloBusta.RICEVUTA_RISPOSTA.equals(tipoBusta.toString()) ){
  651.                     ecc = profiloDiCollaborazione.asincronoAsimmetrico_validazioneCorrelazione_ricevutaRichiestaStato(this.busta, this.protocolFactory);
  652.                 }
  653.             }  
  654.             if(ecc!=null){
  655.                 this.erroriValidazione.add(ecc);
  656.                 return;
  657.             }
  658.         }else if (this.state instanceof StatelessMessage){
  659.             // Lo stateless gestisce solo i profili oneway e sincrono
  660.             // Il oneway non ha una busta correlata
  661.             if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(this.busta.getProfiloDiCollaborazione())){
  662.                 StatelessMessage stateless = (StatelessMessage)this.state;
  663.                 Busta bustaCorrelata = stateless.getBustaCorrelata();
  664.                 if(bustaCorrelata!=null){
  665.                                        
  666.                     if (this.busta.getTipoDestinatario().equals(bustaCorrelata.getTipoMittente())==false){
  667.                         Eccezione ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.TIPO_MITTENTE_NON_VALIDO.
  668.                                 getErroreCooperazione("Tipo del mittente diverso da quello atteso nella gestione del profilo di collaborazione Sincrono"), this.protocolFactory);
  669.                         this.erroriValidazione.add(ecc);
  670.                         return;
  671.                     }
  672.                     if (this.busta.getDestinatario().equals(bustaCorrelata.getMittente())==false){
  673.                         Eccezione ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.MITTENTE_NON_VALIDO.
  674.                                 getErroreCooperazione("Mittente diverso da quello atteso nella gestione del profilo di collaborazione Sincrono"), this.protocolFactory);
  675.                         this.erroriValidazione.add(ecc);
  676.                         return;
  677.                     }
  678.                     if (this.busta.getTipoMittente().equals(bustaCorrelata.getTipoDestinatario())==false){
  679.                         Eccezione ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.TIPO_DESTINATARIO_NON_VALIDO.
  680.                                 getErroreCooperazione("Tipo del destinatario diverso da quello atteso nella gestione del profilo di collaborazione Sincrono"), this.protocolFactory);
  681.                         this.erroriValidazione.add(ecc);
  682.                         return;
  683.                     }
  684.                     if (this.busta.getMittente().equals(bustaCorrelata.getDestinatario())==false){
  685.                         Eccezione ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.DESTINATARIO_NON_VALIDO.
  686.                                 getErroreCooperazione("Destinatario diverso da quello atteso nella gestione del profilo di collaborazione Sincrono"), this.protocolFactory);
  687.                         this.erroriValidazione.add(ecc);
  688.                         return;
  689.                     }

  690.                     if(this.busta.getServizio()!=null && bustaCorrelata.getTipoServizio()!=null){
  691.                         if (this.busta.getTipoServizio().equals(bustaCorrelata.getTipoServizio())==false){
  692.                             Eccezione ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.TIPO_SERVIZIO_NON_VALIDO.
  693.                                     getErroreCooperazione("Tipo di servizio diverso da quello atteso nella gestione del profilo di collaborazione Sincrono"), this.protocolFactory);
  694.                             this.erroriValidazione.add(ecc);
  695.                             return;
  696.                         }
  697.                         if (this.busta.getServizio().equals(bustaCorrelata.getServizio())==false){
  698.                             Eccezione ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.SERVIZIO_NON_VALIDO.
  699.                                     getErroreCooperazione("Servizio diverso da quello atteso nella gestione del profilo di collaborazione Sincrono"), this.protocolFactory);
  700.                             this.erroriValidazione.add(ecc);
  701.                             return;
  702.                         }
  703.                         if(this.busta.getAzione()!=null){
  704.                             if (this.busta.getAzione().equals(bustaCorrelata.getAzione()) == false){
  705.                                 Eccezione ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.AZIONE_NON_VALIDA.
  706.                                         getErroreCooperazione("Azione diversa da quella atteso nella gestione del profilo di collaborazione Sincrono"), this.protocolFactory);
  707.                                 this.erroriValidazione.add(ecc);
  708.                                 return;
  709.                             }
  710.                         }
  711.                     }
  712.                 }
  713.             }
  714.         }else{
  715.             throw new ProtocolException("Metodo invocato con IState non valido");
  716.         }
  717.     }
  718.    
  719.     /**
  720.      * Metodo che si occupa di validare il riferimento del messaggio
  721.      *
  722.      * @param tipoBusta tipo di Busta da validare
  723.      *
  724.      */
  725.    
  726.     /**
  727.      * Eventuale servizio correlato associato al servizio presente nella busta.
  728.      *
  729.      * @return Eventuale servizio correlato associato al servizio presente nella busta.
  730.      *
  731.      */
  732.     public String getServizioCorrelato() {
  733.         return this.servizioCorrelato;
  734.     }

  735.     /**
  736.      * Eventuale tipo di servizio correlato associato al servizio presente nella busta.
  737.      *
  738.      * @return Eventuale tipo di servizio correlato associato al servizio presente nella busta.
  739.      *
  740.      */
  741.     public String getTipoServizioCorrelato() {
  742.         return this.tipoServizioCorrelato;
  743.     }
  744.     public Integer getVersioneServizioCorrelato() {
  745.         return this.versioneServizioCorrelato;
  746.     }
  747.     public Servizio getInfoServizio() {
  748.         return this.infoServizio;
  749.     }
  750.     public String getAzioneCorrelata() {
  751.         return this.azioneCorrelata;
  752.     }
  753.     public void setAzioneCorrelata(String azioneCorrelata) {
  754.         this.azioneCorrelata = azioneCorrelata;
  755.     }
  756.     public void setValidazioneIdentificativiCompleta(boolean v) {
  757.         this.validazioneIdentificativiCompleta = v;
  758.     }

  759. }