RicezioneBusteUtils.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.pdd.services.core;

  21. import java.util.List;

  22. import org.openspcoop2.core.config.PortaApplicativa;
  23. import org.openspcoop2.core.config.PortaDelegata;
  24. import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
  25. import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
  26. import org.openspcoop2.core.id.IDPortaDelegata;
  27. import org.openspcoop2.core.id.IDServizio;
  28. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  29. import org.openspcoop2.message.OpenSPCoop2Message;
  30. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  31. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  32. import org.openspcoop2.pdd.core.PdDContext;
  33. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  34. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  35. import org.openspcoop2.protocol.engine.driver.ProfiloDiCollaborazione;
  36. import org.openspcoop2.protocol.engine.driver.RepositoryBuste;
  37. import org.openspcoop2.protocol.sdk.Busta;
  38. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  39. import org.openspcoop2.protocol.sdk.Integrazione;
  40. import org.openspcoop2.protocol.sdk.constants.RuoloBusta;
  41. import org.openspcoop2.protocol.sdk.constants.RuoloMessaggio;
  42. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  43. import org.openspcoop2.protocol.sdk.state.StateMessage;
  44. import org.slf4j.Logger;

  45. /**
  46.  * RicezioneBusteUtils
  47.  *
  48.  * @author Poli Andrea (apoli@link.it)
  49.  * @author $Author$
  50.  * @version $Rev$, $Date$
  51.  */
  52. public class RicezioneBusteUtils {

  53.     /* Utility per la gestione del Message-Security e MTOM */
  54.     /**
  55.      * Ritorna le Proprieta' Message-Security relative alla ricezione della busta
  56.      *
  57.      * @return Proprieta' Message-Security relative alla ricezione della busta
  58.      */
  59.     public FlowProperties getFlowPropertiesRequest(OpenSPCoop2Message requestMessage, Busta bustaRichiesta,
  60.             ConfigurazionePdDManager configurazionePdDReader,StateMessage state,
  61.             MsgDiagnostico msgDiag,Logger logCore,OpenSPCoop2Properties properties,
  62.             RuoloBusta ruoloBustaRicevuta,String implementazionePdDMittente,
  63.             RequestInfo requestInfo, PdDContext pddContext,
  64.             PortaApplicativa paFind)throws DriverConfigurazioneException{

  65.         // Proprieta' Message-Security relative alla ricezione della busta

  66.         // Messaggi AD HOC (riscontro) responseFlow della porta delegata, utilizzo l'id del riscontro

  67.         // RichiestaOneWay requestFlow della PortaApplicativa
  68.         // RispostaOneWay (integrazione) responseFlow della porta delegata

  69.         // RichiestaSincrona requestFlow della porta applicativa
  70.         // RispostaSincrona su new Connection NON SUPPORTATA, cmq: (integrazione) responseFlow della porta delegata

  71.         // RichiestaAsincronaSimmetrica requestFlow della PortaApplicativa
  72.         // RicevutaRichiestaAsincronaSimmetrica (integrazione) responseFlow della porta delegata che ha effettuato la richiesta
  73.         // RispostaAsincronaSimmetrica (integrazione) responseFlow della porta delegata che ha effettuato la richiesta
  74.         // RicevutaRispostaAsincronaSimmetrica (integrazione) responseFlow della porta delegata che ha effettuato la risposta

  75.         // RichiestaAsincronaAsimmetrica requestFlow della PortaApplicativa
  76.         // RicevutaRichiestaAsincronaAsimmetrica (integrazione) responseFlow della porta delegata che ha effettuato la richiesta
  77.         // RispostaAsincronaAsimmetrica (conversioneServizio) requestFlow della porta applicativa
  78.         // RicevutaRispostaAsincronaAsimmetrica (integrazione) responseFlow della porta delegata che ha effettuato la risposta

  79.         FlowProperties flowProperties = new FlowProperties();
  80.         flowProperties.tipoMessaggio = RuoloMessaggio.RICHIESTA;
  81.        
  82.         ProfiloDiCollaborazione profiloCollaborazione = null;
  83.         try{
  84.            
  85.             IProtocolFactory<?> protocolFactory = ProtocolFactoryManager.getInstance().getProtocolFactoryByName((String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME));
  86.                        
  87.             // Messaggi AD HOC senza profilo: RISCONTRO
  88.             if(bustaRichiesta.getProfiloDiCollaborazione()==null && bustaRichiesta.sizeListaRiscontri()>0 &&
  89.                     properties.isGestioneRiscontri(implementazionePdDMittente)){
  90.                 RepositoryBuste repository = new RepositoryBuste(state, true,protocolFactory);
  91.                 Integrazione integrazione = repository.getInfoIntegrazioneFromOutBox(bustaRichiesta.getRiscontro(0).getID());
  92.                 if(integrazione.getNomePorta()!=null){
  93.                     IDPortaDelegata idPD = new IDPortaDelegata();
  94.                     idPD.setNome(integrazione.getNomePorta());
  95.                     PortaDelegata pd = configurazionePdDReader.getPortaDelegataSafeMethod(idPD, requestInfo);
  96.                     flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForReceiver(pd);
  97.                     flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForReceiver(pd);
  98.                 }

  99.             }

  100.             // Profilo OneWay e Sincrono
  101.             if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(bustaRichiesta.getProfiloDiCollaborazione()) ||
  102.                     org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(bustaRichiesta.getProfiloDiCollaborazione())
  103.             ) {
  104.                 // Richiesta
  105.                 if(bustaRichiesta.getRiferimentoMessaggio()==null){
  106.                     PortaApplicativa pa = paFind;
  107.                     if(pa==null){
  108.                         IDServizio idServizioPA = buildIdServizio(bustaRichiesta);
  109.                         // se non sono presenti dati identificativi del servizio non potro poi localizzare la PA
  110.                         if(idServizioPA!=null) {
  111.                             idServizioPA.setAzione(bustaRichiesta.getAzione());
  112.                             pa = this.getPortaApplicativaIgnoreNotFound(configurazionePdDReader, idServizioPA);
  113.                         }
  114.                     }
  115.                     if(pa!=null) {
  116.                         flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForReceiver(pa, logCore, requestMessage, bustaRichiesta, requestInfo, pddContext);
  117.                         flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForReceiver(pa);
  118.                     }
  119.                 }
  120.                 // Risposta
  121.                 else{
  122.                     PortaDelegata pd = null;
  123.                     if(state!=null) {
  124.                         RepositoryBuste repository = new RepositoryBuste(state, false,protocolFactory);
  125.                         Integrazione integrazione = repository.getInfoIntegrazioneFromOutBox(bustaRichiesta.getRiferimentoMessaggio());
  126.                         IDPortaDelegata idPD = new IDPortaDelegata();
  127.                         idPD.setNome(integrazione.getNomePorta());
  128.                         pd = configurazionePdDReader.getPortaDelegataSafeMethod(idPD, requestInfo);
  129.                     }
  130.                     flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForReceiver(pd);
  131.                     flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForReceiver(pd);
  132.                     flowProperties.tipoMessaggio = RuoloMessaggio.RISPOSTA;
  133.                 }
  134.             }

  135.             // Profilo Asincrono Simmetrico
  136.             else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(bustaRichiesta.getProfiloDiCollaborazione())) {  

  137.                 //  Richiesta Asincrona
  138.                 if(bustaRichiesta.getRiferimentoMessaggio()==null){

  139.                     PortaApplicativa pa = paFind;
  140.                     if(pa==null){
  141.                         IDServizio idServizioPA = buildIdServizio(bustaRichiesta);
  142.                         // se non sono presenti dati identificativi del servizio non potro poi localizzare la PA
  143.                         if(idServizioPA!=null) {
  144.                             idServizioPA.setAzione(bustaRichiesta.getAzione());
  145.                             pa = this.getPortaApplicativaIgnoreNotFound(configurazionePdDReader, idServizioPA);
  146.                         }
  147.                     }
  148.                     if(pa!=null) {
  149.                         flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForReceiver(pa, logCore, requestMessage, bustaRichiesta, requestInfo, pddContext);
  150.                         flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForReceiver(pa);
  151.                     }

  152.                 }else{

  153.                     //  Risposta Asincrona
  154.                     if(RuoloBusta.RISPOSTA.equals(ruoloBustaRicevuta.toString())){

  155.                         RepositoryBuste repository = new RepositoryBuste(state, false,protocolFactory);
  156.                         Integrazione integrazione = repository.getInfoIntegrazioneFromOutBox(bustaRichiesta.getRiferimentoMessaggio());
  157.                         IDPortaDelegata idPD = new IDPortaDelegata();
  158.                         idPD.setNome(integrazione.getNomePorta());
  159.                         PortaDelegata pd = configurazionePdDReader.getPortaDelegataSafeMethod(idPD, requestInfo);
  160.                         flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForSender(pd, logCore, requestMessage, bustaRichiesta, requestInfo, pddContext);
  161.                         flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForSender(pd);

  162.                     }
  163.                     //  Ricevuta alla richiesta.
  164.                     else if(RuoloBusta.RICEVUTA_RICHIESTA.equals(ruoloBustaRicevuta.toString())){

  165.                         RepositoryBuste repository = new RepositoryBuste(state, true, protocolFactory);
  166.                         Integrazione integrazione = repository.getInfoIntegrazioneFromOutBox(bustaRichiesta.getRiferimentoMessaggio());
  167.                         IDPortaDelegata idPD = new IDPortaDelegata();
  168.                         idPD.setNome(integrazione.getNomePorta());
  169.                         PortaDelegata pd = configurazionePdDReader.getPortaDelegataSafeMethod(idPD, requestInfo);
  170.                         flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForReceiver(pd);
  171.                         flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForReceiver(pd);
  172.                         flowProperties.tipoMessaggio = RuoloMessaggio.RISPOSTA;

  173.                     }
  174.                     //  Ricevuta alla risposta.
  175.                     else if(RuoloBusta.RICEVUTA_RISPOSTA.equals(ruoloBustaRicevuta.toString())){

  176.                         RepositoryBuste repository = new RepositoryBuste(state, false, protocolFactory);
  177.                         Integrazione integrazione = repository.getInfoIntegrazioneFromOutBox(bustaRichiesta.getRiferimentoMessaggio());
  178.                         IDPortaDelegata idPD = new IDPortaDelegata();
  179.                         idPD.setNome(integrazione.getNomePorta());
  180.                         PortaDelegata pd = configurazionePdDReader.getPortaDelegataSafeMethod(idPD, requestInfo);
  181.                         flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForReceiver(pd);
  182.                         flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForReceiver(pd);
  183.                         flowProperties.tipoMessaggio = RuoloMessaggio.RISPOSTA;

  184.                     }

  185.                 }

  186.             }

  187.             // Profilo Asincrono Asimmetrico
  188.             else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(bustaRichiesta.getProfiloDiCollaborazione())) {

  189.                 //  Richiesta Asincrona
  190.                 if(bustaRichiesta.getRiferimentoMessaggio()==null){

  191.                     PortaApplicativa pa = paFind;
  192.                     if(pa==null){
  193.                         IDServizio idServizioPA = buildIdServizio(bustaRichiesta);
  194.                         // se non sono presenti dati identificativi del servizio non potro poi localizzare la PA
  195.                         if(idServizioPA!=null) {
  196.                             idServizioPA.setAzione(bustaRichiesta.getAzione());
  197.                             pa = this.getPortaApplicativaIgnoreNotFound(configurazionePdDReader, idServizioPA);
  198.                         }
  199.                     }
  200.                     if(pa!=null) {
  201.                         flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForReceiver(pa, logCore, requestMessage, bustaRichiesta, requestInfo, pddContext);
  202.                         flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForReceiver(pa);
  203.                     }

  204.                 }else{

  205.                     profiloCollaborazione = new ProfiloDiCollaborazione(state,protocolFactory);

  206.                     //  Risposta Asincrona
  207.                     if(RuoloBusta.RISPOSTA.equals(ruoloBustaRicevuta.toString())){

  208.                         // ConversioneServizio.
  209.                         IDServizio idServizioOriginale = profiloCollaborazione.asincronoAsimmetrico_getDatiConsegnaRisposta(bustaRichiesta.getRiferimentoMessaggio());
  210.                         PortaApplicativa pa = paFind;
  211.                         if(pa==null){
  212.                             IDServizio idServizioPA = buildIdServizio(bustaRichiesta);
  213.                             // se non sono presenti dati identificativi del servizio non potro poi localizzare la PA
  214.                             if(idServizioPA!=null) {
  215.                                 idServizioPA.setAzione(idServizioOriginale.getAzione());
  216.                                 pa = this.getPortaApplicativaIgnoreNotFound(configurazionePdDReader,idServizioPA);
  217.                             }
  218.                         }
  219.                         if(pa!=null) {
  220.                             flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForReceiver(pa, logCore, requestMessage, bustaRichiesta, requestInfo, pddContext);
  221.                             flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForReceiver(pa);
  222.                         }

  223.                     }
  224.                     //  Ricevuta alla richiesta.
  225.                     else if(RuoloBusta.RICEVUTA_RICHIESTA.equals(ruoloBustaRicevuta.toString())){

  226.                         RepositoryBuste repository = new RepositoryBuste(state, true,protocolFactory);
  227.                         Integrazione integrazione = repository.getInfoIntegrazioneFromOutBox(bustaRichiesta.getRiferimentoMessaggio());
  228.                         IDPortaDelegata idPD = new IDPortaDelegata();
  229.                         idPD.setNome(integrazione.getNomePorta());
  230.                         PortaDelegata pd = configurazionePdDReader.getPortaDelegataSafeMethod(idPD, requestInfo);
  231.                         flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForReceiver(pd);
  232.                         flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForReceiver(pd);
  233.                         flowProperties.tipoMessaggio = RuoloMessaggio.RISPOSTA;

  234.                     }
  235.                     //  Ricevuta alla risposta.
  236.                     else if(RuoloBusta.RICEVUTA_RISPOSTA.equals(ruoloBustaRicevuta.toString())){

  237.                         RepositoryBuste repository = new RepositoryBuste(state, false,protocolFactory);
  238.                         Integrazione integrazione = repository.getInfoIntegrazioneFromOutBox(bustaRichiesta.getRiferimentoMessaggio());
  239.                         IDPortaDelegata idPD = new IDPortaDelegata();
  240.                         idPD.setNome(integrazione.getNomePorta());
  241.                         PortaDelegata pd = configurazionePdDReader.getPortaDelegataSafeMethod(idPD, requestInfo);
  242.                         flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForReceiver(pd);
  243.                         flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForReceiver(pd);
  244.                         flowProperties.tipoMessaggio = RuoloMessaggio.RISPOSTA;

  245.                     }

  246.                 }

  247.             }

  248.         }catch(Exception e){
  249.             msgDiag.logErroreGenerico(e, "lettura_MessageSecurity_MTOM_RequestProperties");
  250.             logCore.error("Lettura dati Message-Security / MTOM per la ricezione del messaggio non riuscita",e);
  251.         }finally{
  252.             if(profiloCollaborazione!=null)
  253.                 state.closePreparedStatement();
  254.         }

  255.         return flowProperties;
  256.     }


  257.     /**
  258.      * Ritorna le Proprieta' Message-Security relative alla spedizione della busta
  259.      *
  260.      * @return Proprieta' Message-Security relative alla spedizione della busta
  261.      */
  262.     public FlowProperties getFlowPropertiesResponse(OpenSPCoop2Message requestMessage, Busta bustaRichiesta,
  263.             ConfigurazionePdDManager configurazionePdDReader,StateMessage state,
  264.             MsgDiagnostico msgDiag,Logger logCore,OpenSPCoop2Properties properties,
  265.             RuoloBusta ruoloBustaRicevuta,String implementazionePdDMittente,
  266.             RequestInfo requestInfo, PdDContext pddContext,
  267.             PortaApplicativa paFind,
  268.             FlowProperties flowPropertiesRequest)throws DriverConfigurazioneException{

  269.         //  Proprieta' Message-Security relative alla spedizione della busta

  270.         // Messaggi AD HOC senza profilo (riscontro) responseFlow della porta applicativa

  271.         // RispostaOneWay responseFlow della porta applicativa

  272.         // RispostaSincrona responseFlow della porta applicativa

  273.         // RicevutaRichiestaAsincronaSimmetrica responseFlow della porta applicativa
  274.         // RicevutaRispostaAsincronaSimmetrica (integrazione) requestFlow della porta delegata che ha effettuato la richiesta

  275.         // RicevutaRichiestaAsincronaAsimmetrica responseFlow della porta applicativa
  276.         // RicevutaRispostaAsincronaAsimmetrica (conversioneServizio) responseFlow della porta applicativa

  277.         FlowProperties flowProperties = new FlowProperties();
  278.         flowProperties.tipoMessaggio = RuoloMessaggio.RISPOSTA;

  279.         // NOTA: La busta che sto gestendo e' la busta che ho ricevuto, non quella che sto inviando!!

  280.         ProfiloDiCollaborazione profiloCollaborazione = null;
  281.         try{

  282.             IProtocolFactory<?> protocolFactory = ProtocolFactoryManager.getInstance().getProtocolFactoryByName((String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME));
  283.                        
  284.             // Messaggi AD HOC senza profilo: RISCONTRO
  285.             if(bustaRichiesta.getProfiloDiCollaborazione()==null && bustaRichiesta.sizeListaRiscontri()>0 &&
  286.                     properties.isGestioneRiscontri(implementazionePdDMittente)){
  287.                 if(bustaRichiesta.getTipoServizio()!=null &&
  288.                         bustaRichiesta.getServizio()!=null){
  289.                     PortaApplicativa pa = paFind;
  290.                     if(pa==null){
  291.                         IDServizio idServizioPA = buildIdServizio(bustaRichiesta);
  292.                         // se non sono presenti dati identificativi del servizio non potro poi localizzare la PA
  293.                         if(idServizioPA!=null) {
  294.                             idServizioPA.setAzione(bustaRichiesta.getAzione());
  295.                             pa = this.getPortaApplicativaIgnoreNotFound(configurazionePdDReader, idServizioPA);
  296.                         }
  297.                     }
  298.                     if(pa!=null) {
  299.                         flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForSender(pa, logCore, requestMessage, bustaRichiesta, requestInfo, pddContext,
  300.                                 null);
  301.                         flowProperties.messageSecurityRequest = flowPropertiesRequest!=null ? flowPropertiesRequest.messageSecurity : null;
  302.                         flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForSender(pa);
  303.                     }
  304.                 }
  305.             }
  306.             // Messaggi con profilo
  307.             else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(bustaRichiesta.getProfiloDiCollaborazione()) ||
  308.                     org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(bustaRichiesta.getProfiloDiCollaborazione())
  309.             ) {
  310.                 PortaApplicativa pa = paFind;
  311.                 if(pa==null){
  312.                     IDServizio idServizioPA = buildIdServizio(bustaRichiesta);
  313.                     // se non sono presenti dati identificativi del servizio non potro poi localizzare la PA
  314.                     if(idServizioPA!=null) {
  315.                         idServizioPA.setAzione(bustaRichiesta.getAzione());
  316.                         pa = this.getPortaApplicativaIgnoreNotFound(configurazionePdDReader, idServizioPA);
  317.                     }
  318.                 }
  319.                 if(pa!=null) {
  320.                     flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForSender(pa, logCore, requestMessage, bustaRichiesta, requestInfo, pddContext,
  321.                             null);
  322.                     flowProperties.messageSecurityRequest = flowPropertiesRequest!=null ? flowPropertiesRequest.messageSecurity : null;
  323.                     flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForSender(pa);
  324.                 }
  325.             }

  326.             //   Profilo Asincrono Simmetrico
  327.             else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(bustaRichiesta.getProfiloDiCollaborazione())) {  

  328.                 //  Ricevuta alla richiesta.
  329.                 if(bustaRichiesta.getRiferimentoMessaggio()==null){

  330.                     PortaApplicativa pa = paFind;
  331.                     if(pa==null){
  332.                         IDServizio idServizioPA = buildIdServizio(bustaRichiesta);
  333.                         // se non sono presenti dati identificativi del servizio non potro poi localizzare la PA
  334.                         if(idServizioPA!=null) {
  335.                             idServizioPA.setAzione(bustaRichiesta.getAzione());
  336.                             pa = this.getPortaApplicativaIgnoreNotFound(configurazionePdDReader, idServizioPA);
  337.                         }
  338.                     }
  339.                     if(pa!=null) {
  340.                         flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForSender(pa, logCore, requestMessage, bustaRichiesta, requestInfo, pddContext,
  341.                                 null);
  342.                         flowProperties.messageSecurityRequest = flowPropertiesRequest!=null ? flowPropertiesRequest.messageSecurity : null;
  343.                         flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForSender(pa);
  344.                     }

  345.                 }

  346.                 //  Ricevuta alla risposta.
  347.                 else if(RuoloBusta.RISPOSTA.equals(ruoloBustaRicevuta.toString())){

  348.                     RepositoryBuste repository = new RepositoryBuste(state, false, protocolFactory);
  349.                     Integrazione integrazione = repository.getInfoIntegrazioneFromOutBox(bustaRichiesta.getRiferimentoMessaggio());
  350.                     IDPortaDelegata idPD = new IDPortaDelegata();
  351.                     idPD.setNome(integrazione.getNomePorta());
  352.                     PortaDelegata pd = configurazionePdDReader.getPortaDelegataSafeMethod(idPD, requestInfo);
  353.                     flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForSender(pd, logCore, requestMessage, bustaRichiesta, requestInfo, pddContext);
  354.                     flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForSender(pd);

  355.                 }

  356.             }

  357.             //  Profilo Asincrono Asimmetrico
  358.             else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(bustaRichiesta.getProfiloDiCollaborazione())) {

  359.                 profiloCollaborazione = new ProfiloDiCollaborazione(state, protocolFactory);

  360.                 //  Ricevuta alla richiesta.
  361.                 if(bustaRichiesta.getRiferimentoMessaggio()==null){

  362.                     PortaApplicativa pa = paFind;
  363.                     if(pa==null){
  364.                         IDServizio idServizioPA = buildIdServizio(bustaRichiesta);
  365.                         // se non sono presenti dati identificativi del servizio non potro poi localizzare la PA
  366.                         if(idServizioPA!=null) {
  367.                             idServizioPA.setAzione(bustaRichiesta.getAzione());
  368.                             pa = this.getPortaApplicativaIgnoreNotFound(configurazionePdDReader, idServizioPA);
  369.                         }
  370.                     }
  371.                     if(pa!=null) {
  372.                         flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForSender(pa, logCore, requestMessage, bustaRichiesta, requestInfo, pddContext,
  373.                                 null);
  374.                         flowProperties.messageSecurityRequest = flowPropertiesRequest!=null ? flowPropertiesRequest.messageSecurity : null;
  375.                         flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForSender(pa);
  376.                     }

  377.                 }

  378.                 //  Ricevuta alla risposta.
  379.                 else if(RuoloBusta.RISPOSTA.equals(ruoloBustaRicevuta.toString())){

  380.                     // ConversioneServizio.
  381.                     IDServizio idServizioOriginale = profiloCollaborazione.asincronoAsimmetrico_getDatiConsegnaRisposta(bustaRichiesta.getRiferimentoMessaggio());
  382.                     PortaApplicativa pa = paFind;
  383.                     if(pa==null){
  384.                         IDServizio idServizioPA = buildIdServizio(bustaRichiesta);
  385.                         // se non sono presenti dati identificativi del servizio non potro poi localizzare la PA
  386.                         if(idServizioPA!=null) {
  387.                             idServizioPA.setAzione(idServizioOriginale.getAzione());
  388.                             pa = this.getPortaApplicativaIgnoreNotFound(configurazionePdDReader, idServizioPA);
  389.                         }
  390.                     }
  391.                     if(pa!=null) {
  392.                         flowProperties.messageSecurity = configurazionePdDReader.getMessageSecurityForSender(pa, logCore, requestMessage, bustaRichiesta, requestInfo, pddContext,
  393.                                 null);
  394.                         flowProperties.messageSecurityRequest = flowPropertiesRequest!=null ? flowPropertiesRequest.messageSecurity : null;
  395.                         flowProperties.mtom = configurazionePdDReader.getMTOMProcessorForSender(pa);
  396.                     }

  397.                 }

  398.             }



  399.         }catch(Exception e){
  400.             msgDiag.logErroreGenerico(e, "lettura_MessageSecurity_MTOM_ResponseProperties");
  401.             logCore.error("Lettura dati Message-Security / MTOM per la spedizione del messaggio di risposta non riuscita",e);
  402.         }finally{
  403.             if(profiloCollaborazione!=null)
  404.                 state.closePreparedStatement();
  405.         }

  406.         return flowProperties;
  407.     }

  408.     public PortaApplicativa getPortaApplicativa(ConfigurazionePdDManager configurazionePdDReader, IDServizio idServizio) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
  409.         List<PortaApplicativa> listPa = configurazionePdDReader.getPorteApplicative(idServizio, false);
  410.         if(listPa.isEmpty()){
  411.             throw new DriverConfigurazioneException("Non esiste alcuna porta applicativa indirizzabile tramite il servizio ["+idServizio+"]");
  412.         }
  413.         else{
  414.             if(listPa.size()>1)
  415.                 throw new DriverConfigurazioneException("Esiste più di una porta applicativa indirizzabile tramite il servizio ["+idServizio+"]");
  416.             return listPa.get(0);
  417.         }
  418.     }
  419.     public PortaApplicativa getPortaApplicativaIgnoreNotFound(ConfigurazionePdDManager configurazionePdDReader, IDServizio idServizio) throws Exception{
  420.         try {
  421.             return this.getPortaApplicativa(configurazionePdDReader, idServizio);
  422.         }catch(DriverConfigurazioneNotFound notFound) {
  423.             // ignore
  424.         }
  425.         return null;
  426.     }
  427.    
  428.     private IDServizio buildIdServizio(Busta bustaRichiesta) {
  429.         IDServizio idServizioPA = null;
  430.         try {
  431.             idServizioPA = IDServizioFactory.getInstance().getIDServizioFromValues(bustaRichiesta.getTipoServizio(),bustaRichiesta.getServizio(),
  432.                     bustaRichiesta.getTipoDestinatario(),bustaRichiesta.getDestinatario(),
  433.                     bustaRichiesta.getVersioneServizio());
  434.         }catch(Exception e) {
  435.             // se non sono presenti dati identificativi del servizio non potro poi localizzare la PA
  436.         }
  437.         return idServizioPA;
  438.     }
  439. }