InoltroRisposte.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.mdb;

  21. import java.util.HashMap;
  22. import java.util.List;
  23. import java.util.Map;

  24. import javax.xml.soap.SOAPFault;

  25. import org.openspcoop2.core.config.Connettore;
  26. import org.openspcoop2.core.config.DumpConfigurazione;
  27. import org.openspcoop2.core.config.GestioneErrore;
  28. import org.openspcoop2.core.config.PortaApplicativa;
  29. import org.openspcoop2.core.config.PortaDelegata;
  30. import org.openspcoop2.core.config.Property;
  31. import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
  32. import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
  33. import org.openspcoop2.core.constants.CostantiConnettori;
  34. import org.openspcoop2.core.constants.TipiConnettore;
  35. import org.openspcoop2.core.constants.TipoPdD;
  36. import org.openspcoop2.core.id.IDPortaDelegata;
  37. import org.openspcoop2.core.id.IDServizio;
  38. import org.openspcoop2.core.id.IDSoggetto;
  39. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  40. import org.openspcoop2.message.OpenSPCoop2Message;
  41. import org.openspcoop2.message.OpenSPCoop2MessageFactory;
  42. import org.openspcoop2.message.constants.ServiceBinding;
  43. import org.openspcoop2.message.soap.SoapUtils;
  44. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  45. import org.openspcoop2.pdd.config.MessageSecurityConfig;
  46. import org.openspcoop2.pdd.core.AbstractCore;
  47. import org.openspcoop2.pdd.core.CostantiPdD;
  48. import org.openspcoop2.pdd.core.EJBUtils;
  49. import org.openspcoop2.pdd.core.GestoreMessaggi;
  50. import org.openspcoop2.pdd.core.IntegrationContext;
  51. import org.openspcoop2.pdd.core.MTOMProcessor;
  52. import org.openspcoop2.pdd.core.PdDContext;
  53. import org.openspcoop2.pdd.core.ProtocolContext;
  54. import org.openspcoop2.pdd.core.connettori.ConnettoreBase;
  55. import org.openspcoop2.pdd.core.connettori.ConnettoreBaseHTTP;
  56. import org.openspcoop2.pdd.core.connettori.ConnettoreMsg;
  57. import org.openspcoop2.pdd.core.connettori.ConnettoreUtils;
  58. import org.openspcoop2.pdd.core.connettori.GestoreErroreConnettore;
  59. import org.openspcoop2.pdd.core.connettori.IConnettore;
  60. import org.openspcoop2.pdd.core.connettori.InfoConnettoreUscita;
  61. import org.openspcoop2.pdd.core.controllo_traffico.ConnettoreUtilities;
  62. import org.openspcoop2.pdd.core.controllo_traffico.DatiTempiRisposta;
  63. import org.openspcoop2.pdd.core.dynamic.DynamicMapBuilderUtils;
  64. import org.openspcoop2.pdd.core.handlers.GestoreHandlers;
  65. import org.openspcoop2.pdd.core.handlers.HandlerException;
  66. import org.openspcoop2.pdd.core.handlers.OutResponseContext;
  67. import org.openspcoop2.pdd.core.handlers.PostOutResponseContext;
  68. import org.openspcoop2.pdd.core.integrazione.UtilitiesIntegrazione;
  69. import org.openspcoop2.pdd.core.state.IOpenSPCoopState;
  70. import org.openspcoop2.pdd.core.state.OpenSPCoopStateException;
  71. import org.openspcoop2.pdd.core.transazioni.Transaction;
  72. import org.openspcoop2.pdd.core.transazioni.TransactionContext;
  73. import org.openspcoop2.pdd.logger.Dump;
  74. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  75. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  76. import org.openspcoop2.pdd.logger.Tracciamento;
  77. import org.openspcoop2.pdd.services.core.FlowProperties;
  78. import org.openspcoop2.pdd.timers.TimerGestoreMessaggi;
  79. import org.openspcoop2.protocol.engine.constants.Costanti;
  80. import org.openspcoop2.protocol.engine.driver.ProfiloDiCollaborazione;
  81. import org.openspcoop2.protocol.engine.driver.RepositoryBuste;
  82. import org.openspcoop2.protocol.engine.validator.Validatore;
  83. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  84. import org.openspcoop2.protocol.sdk.Busta;
  85. import org.openspcoop2.protocol.sdk.BustaRawContent;
  86. import org.openspcoop2.protocol.sdk.Eccezione;
  87. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  88. import org.openspcoop2.protocol.sdk.Integrazione;
  89. import org.openspcoop2.protocol.sdk.ProtocolMessage;
  90. import org.openspcoop2.protocol.sdk.SecurityInfo;
  91. import org.openspcoop2.protocol.sdk.Trasmissione;
  92. import org.openspcoop2.protocol.sdk.builder.EsitoTransazione;
  93. import org.openspcoop2.protocol.sdk.builder.ProprietaManifestAttachments;
  94. import org.openspcoop2.protocol.sdk.config.IProtocolVersionManager;
  95. import org.openspcoop2.protocol.sdk.constants.FaseImbustamento;
  96. import org.openspcoop2.protocol.sdk.constants.FaseSbustamento;
  97. import org.openspcoop2.protocol.sdk.constants.LivelloRilevanza;
  98. import org.openspcoop2.protocol.sdk.constants.RuoloMessaggio;
  99. import org.openspcoop2.protocol.sdk.state.IState;
  100. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  101. import org.openspcoop2.protocol.sdk.state.StatefulMessage;
  102. import org.openspcoop2.protocol.sdk.tracciamento.EsitoElaborazioneMessaggioTracciato;
  103. import org.openspcoop2.protocol.sdk.validator.IValidatoreErrori;
  104. import org.openspcoop2.protocol.sdk.validator.IValidazioneSemantica;
  105. import org.openspcoop2.protocol.sdk.validator.ProprietaValidazione;
  106. import org.openspcoop2.protocol.sdk.validator.ProprietaValidazioneErrori;
  107. import org.openspcoop2.security.message.MessageSecurityContext;
  108. import org.openspcoop2.security.message.MessageSecurityContextParameters;
  109. import org.openspcoop2.security.message.constants.SecurityConstants;
  110. import org.openspcoop2.security.message.engine.MessageSecurityFactory;
  111. import org.openspcoop2.utils.date.DateManager;
  112. import org.openspcoop2.utils.digest.IDigestReader;
  113. import org.openspcoop2.utils.rest.problem.ProblemRFC7807;
  114. import org.openspcoop2.utils.transport.http.HttpRequestMethod;
  115. import org.slf4j.Logger;



  116. /**
  117.  * Contiene la libreria InoltroRisposte
  118.  *
  119.  * @author Poli Andrea (apoli@link.it)
  120.  * @author Tronci Fabio (tronci@link.it)
  121.  * @author $Author$
  122.  * @version $Rev$, $Date$
  123.  */
  124. public class InoltroRisposte extends GenericLib{

  125.     public static final String ID_MODULO = "InoltroRisposte";

  126.     public InoltroRisposte(Logger log) throws GenericLibException {
  127.         super(InoltroRisposte.ID_MODULO, log);
  128.         inizializza();
  129.     }

  130.     @Override
  131.     public EsitoLib _onMessage(IOpenSPCoopState openspcoopstate,
  132.             RegistroServiziManager registroServiziManager,ConfigurazionePdDManager configurazionePdDManager,
  133.             MsgDiagnostico msgDiag) throws OpenSPCoopStateException {
  134.        
  135.         EsitoLib esito = new EsitoLib();
  136.                
  137.         if(openspcoopstate==null) {
  138.             if(msgDiag!=null) {
  139.                 msgDiag.logErroreGenerico("openspcoopstate is null", "openspcoopstate.checkNull");
  140.             }
  141.             else {
  142.                 this.log.error("openspcoopstate is null");
  143.             }
  144.             esito.setEsitoInvocazione(false);
  145.             return esito;
  146.         }
  147.        
  148.         InoltroRisposteMessage inoltroRisposteMsg = (InoltroRisposteMessage) openspcoopstate.getMessageLib();      
  149.        
  150.         if(msgDiag==null) {
  151.             if(this.log!=null) {
  152.                 this.log.error("MsgDiagnostico is null");
  153.             }
  154.             openspcoopstate.releaseResource();
  155.             esito.setEsitoInvocazione(false);
  156.             return esito;
  157.         }
  158.        
  159.         /* PddContext */
  160.         PdDContext pddContext = inoltroRisposteMsg.getPddContext();
  161.         String idTransazione = PdDContext.getValue(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE, pddContext);
  162.         RequestInfo requestInfo = (RequestInfo) pddContext.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  163.        
  164.         /* Busta e tipo di implementazione PdD con cui interoperare */
  165.         // Busta da inviare (tracciamento e Message-Security)
  166.         Busta busta = inoltroRisposteMsg.getBustaRisposta();
  167.         if(busta==null) {
  168.             msgDiag.logErroreGenerico("Busta is null", "Busta.checkNull");
  169.             openspcoopstate.releaseResource();
  170.             esito.setEsitoInvocazione(false);
  171.             return esito;
  172.         }
  173.         String implementazionePdDDestinatario = inoltroRisposteMsg.getImplementazionePdDSoggettoDestinatario();
  174.        
  175.         IDSoggetto identitaPdD = inoltroRisposteMsg.getDominio();
  176.         msgDiag.setDominio(identitaPdD);  // imposto anche il dominio nel msgDiag
  177.        
  178.         // Tipo di busta da inoltrare
  179.         boolean inoltroSegnalazioneErrore =
  180.             inoltroRisposteMsg.getInoltroSegnalazioneErrore();
  181.        
  182.         //  Aggiornamento Informazioni
  183.         msgDiag.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_INOLTRO_BUSTE);
  184.        
  185.         // Gestisco i log come fossero una richiesta, come se fossi nel modulo InoltroBuste
  186.         msgDiag.addKeywords(busta, true);

  187.         // Dati consegna
  188.         IDSoggetto soggettoMittente = new IDSoggetto(busta.getTipoMittente(),busta.getMittente());
  189.         IDSoggetto soggettoDestinatario = new IDSoggetto(busta.getTipoDestinatario(),busta.getDestinatario());
  190.         IDServizio idServizio = null;
  191.         try{
  192.             idServizio = IDServizioFactory.getInstance().getIDServizioFromValues(busta.getTipoServizio(),busta.getServizio(),
  193.                     soggettoDestinatario, busta.getVersioneServizio());
  194.         }catch(Exception e){
  195.             msgDiag.logErroreGenerico(e, "IDServizioFactory.getIDServizioFromValues");  
  196.             openspcoopstate.releaseResource();
  197.             esito.setStatoInvocazioneErroreNonGestito(e);
  198.             esito.setEsitoInvocazione(false);
  199.             return esito;
  200.         }
  201.         idServizio.setAzione(busta.getAzione());

  202.         String idMessageResponse = busta.getID();
  203.        
  204.         msgDiag.setIdMessaggioRichiesta(busta.getRiferimentoMessaggio());
  205.         msgDiag.setIdMessaggioRisposta(busta.getID());
  206.         msgDiag.setFruitore(soggettoMittente);
  207.         msgDiag.setServizio(idServizio);
  208.         msgDiag.setIdCorrelazioneApplicativa(inoltroRisposteMsg.getIdCorrelazioneApplicativa());
  209.         msgDiag.addKeyword(CostantiPdD.KEY_ID_CORRELAZIONE_APPLICATIVA, inoltroRisposteMsg.getIdCorrelazioneApplicativa());


  210.         /* ------------------ Inizializzo stato OpenSPCoop  --------------- */
  211.         msgDiag.mediumDebug("Inizializzo stato per la gestione della richiesta...");
  212.         openspcoopstate.initResource(identitaPdD, InoltroRisposte.ID_MODULO,idTransazione);
  213.         registroServiziManager = registroServiziManager.refreshState(openspcoopstate.getStatoRichiesta(),openspcoopstate.getStatoRisposta());
  214.         configurazionePdDManager = configurazionePdDManager.refreshState(registroServiziManager);
  215.         msgDiag.updateState(configurazionePdDManager);
  216.        
  217.         /* Protocol Factory */
  218.         IProtocolFactory<?> protocolFactory = null;
  219.         IValidazioneSemantica validazioneSemantica = null;
  220.         org.openspcoop2.protocol.sdk.config.ITraduttore traduttore = null;
  221.         try{
  222.             protocolFactory = this.protocolFactoryManager.getProtocolFactoryByName((String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME));
  223.             traduttore = protocolFactory.createTraduttore();
  224.             validazioneSemantica = protocolFactory.createValidazioneSemantica(openspcoopstate.getStatoRichiesta());
  225.         }catch(Exception e){
  226.             msgDiag.logErroreGenerico(e, "ProtocolFactory.instanziazione");
  227.             openspcoopstate.releaseResource();
  228.             esito.setEsitoInvocazione(false);
  229.             esito.setStatoInvocazioneErroreNonGestito(e);
  230.             return esito;
  231.         }
  232.        
  233.        
  234.         // Transaction
  235.         Transaction transactionNullable = null;
  236.         try{
  237.             transactionNullable = TransactionContext.getTransaction(idTransazione);
  238.         }catch(Exception e){
  239.             // La transazione potrebbe essere stata eliminata nelle comunicazioni stateful
  240. //          msgDiag.logErroreGenerico(e, "getTransaction");
  241. //          openspcoopstate.releaseResource();
  242. //          esito.setEsitoInvocazione(false);
  243. //          esito.setStatoInvocazioneErroreNonGestito(e);
  244. //          return esito;
  245.         }
  246.        
  247.         msgDiag.setPddContext(pddContext, protocolFactory);


  248.         /* ------------- STATO RICHIESTA E STATO RISPOSTA ------------------------------- */
  249.         //IState statoRichiesta = openSPCoopState.getStatoRichiesta();
  250.         //IState statoRisposta = openSPCoopState.getStatoRisposta();

  251.         /* ----------------- ID RICHIESTA ---------------------------------------------- */
  252.         String idMessageRequest = openspcoopstate.getIDMessaggioSessione();

  253.         /* ------------------ Inizializzazione Contesto di gestione della Richiesta --------------- */
  254.         msgDiag.mediumDebug("Inizializzo contesto per la gestione...");

  255.         boolean oneWayVersione11 = inoltroRisposteMsg.isOneWayVersione11();
  256.        
  257.         // Check FunctionRouting  
  258.         boolean functionAsRouter = false;
  259.         msgDiag.mediumDebug("Esamina modalita' di ricezione (PdD/Router)...");
  260.         boolean existsSoggetto = false;
  261.         try{
  262.             existsSoggetto = configurazionePdDManager.existsSoggetto(soggettoMittente, requestInfo);
  263.         }catch(Exception e){
  264.             msgDiag.logErroreGenerico(e, "existsSoggetto("+soggettoMittente.toString()+")");  
  265.             openspcoopstate.releaseResource();
  266.             esito.setStatoInvocazioneErroreNonGestito(e);
  267.             esito.setEsitoInvocazione(false);
  268.             return esito;
  269.         }
  270.         if(existsSoggetto==false){
  271.             // La PdD non gestisce il soggetto mittente della busta.
  272.             // Controllo adesso che sia abilitata la funzione di Router per la PdD, poiche'
  273.             // mi dovrebbe essere arrivata per forza dal modulo di ricezione buste in modalita' Router.
  274.             boolean routerFunctionActive = false;
  275.             try{
  276.                 routerFunctionActive = configurazionePdDManager.routerFunctionActive();
  277.             }catch(Exception e){
  278.                 msgDiag.logErroreGenerico(e,"routerFunctionActive()");
  279.                 openspcoopstate.releaseResource();
  280.                 esito.setStatoInvocazioneErroreNonGestito(e);
  281.                 esito.setEsitoInvocazione(false);
  282.                 return esito;
  283.             }
  284.             if(routerFunctionActive){
  285.                 functionAsRouter = true;
  286.             }else{
  287.                 msgDiag.logPersonalizzato("routingTable.soggettoFruitoreNonGestito");
  288.                
  289.                 try{
  290.                     GestoreMessaggi msgResponse = new GestoreMessaggi(openspcoopstate, false,idMessageResponse,Costanti.OUTBOX,msgDiag,pddContext);
  291.                     msgResponse.setOneWayVersione11(oneWayVersione11);
  292.                     msgResponse.aggiornaProprietarioMessaggio(TimerGestoreMessaggi.ID_MODULO);
  293.                    
  294.                     RepositoryBuste repositoryBuste = new RepositoryBuste(openspcoopstate.getStatoRisposta(), false,protocolFactory);
  295.                     repositoryBuste.eliminaBustaStatelessFromOutBox(busta.getID());
  296.                    
  297.                     openspcoopstate.commit();
  298.                 }catch(Exception e){
  299.                     msgDiag.logErroreGenerico(e,"EliminazioneMessaggioSoggettoFruitoreNonGestito");
  300.                     openspcoopstate.releaseResource();
  301.                     esito.setStatoInvocazioneErroreNonGestito(e);
  302.                     esito.setEsitoInvocazione(false);
  303.                     return esito;
  304.                 }
  305.                
  306.                 openspcoopstate.releaseResource();
  307.                 esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,
  308.                         "routingTable.soggettoFruitoreNonGestito");
  309.                 esito.setEsitoInvocazione(true);
  310.                 return esito;
  311.             }
  312.         }


  313.         // Funzione
  314.         TipoPdD tipoPorta = TipoPdD.APPLICATIVA;
  315.         if(functionAsRouter)
  316.             tipoPorta = TipoPdD.ROUTER;


  317.         // Profilo di gestione
  318.         String versioneProtocollo = inoltroRisposteMsg.getProfiloGestione();
  319.         msgDiag.mediumDebug("Profilo di gestione ["+InoltroRisposte.ID_MODULO+"] della busta: "+versioneProtocollo);


  320.         // EJBUtils (per eventuali errori)
  321.         EJBUtils ejbUtils = null;
  322.         try{
  323.             ejbUtils = new EJBUtils(identitaPdD,tipoPorta,InoltroRisposte.ID_MODULO,idMessageRequest,
  324.                     idMessageResponse,Costanti.OUTBOX,openspcoopstate,msgDiag,functionAsRouter,
  325.                     inoltroRisposteMsg.getImplementazionePdDSoggettoMittente(),
  326.                     inoltroRisposteMsg.getImplementazionePdDSoggettoDestinatario(),
  327.                     versioneProtocollo,pddContext);
  328.         }catch(Exception e){
  329.             msgDiag.logErroreGenerico(e, "EJBUtils.new");  
  330.             openspcoopstate.releaseResource();
  331.             esito.setStatoInvocazioneErroreNonGestito(e);
  332.             esito.setEsitoInvocazione(false);
  333.             return esito;
  334.         }
  335.         // Oneway versione 11
  336.         ejbUtils.setOneWayVersione11(oneWayVersione11);


  337.         // GestoriMessaggio
  338.         GestoreMessaggi msgResponse = new GestoreMessaggi(openspcoopstate, false,idMessageResponse,Costanti.OUTBOX,msgDiag,pddContext);
  339.         msgResponse.setOneWayVersione11(oneWayVersione11);
  340.         GestoreMessaggi msgConnectionReply = null;
  341.         try{
  342.             if(msgResponse.isRiconsegnaMessaggio(null) == false){
  343.                 msgDiag.logPersonalizzato("riconsegnaMessaggioPrematura");
  344.                 openspcoopstate.releaseResource();
  345.                 esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,
  346.                         msgDiag.getMessaggio_replaceKeywords("riconsegnaMessaggioPrematura"));
  347.                 esito.setEsitoInvocazione(false);
  348.                 return esito;
  349.             }
  350.         }catch(Exception e){
  351.             msgDiag.logErroreGenerico(e, "msgRequest.isRiconsegnaMessaggio()");
  352.             ejbUtils.rollbackMessage("Errore verifica riconsegna messaggio", esito);
  353.             openspcoopstate.releaseResource();
  354.             esito.setStatoInvocazioneErroreNonGestito(e);
  355.             esito.setEsitoInvocazione(true);
  356.             return esito;
  357.         }
  358.        

  359.         // Repository
  360.         RepositoryBuste repositoryBuste = null;
  361.         RepositoryBuste repositoryConnectionReply = null;

  362.         // Tracciamento
  363.         org.openspcoop2.pdd.logger.Tracciamento tracciamento;
  364.         try {
  365.             tracciamento = new org.openspcoop2.pdd.logger.Tracciamento(identitaPdD,InoltroBuste.ID_MODULO,pddContext,tipoPorta,msgDiag.getPorta(),
  366.                     configurazionePdDManager);
  367.         } catch (Exception e) {
  368.             msgDiag.logErroreGenerico(e, "ProtocolFactory.instanziazione");
  369.             openspcoopstate.releaseResource();
  370.             esito.setEsitoInvocazione(false);
  371.             esito.setStatoInvocazioneErroreNonGestito(e);
  372.             return esito;
  373.         }
  374.         // Proprieta Manifest Attachments
  375.         ProprietaManifestAttachments proprietaManifestAttachments =
  376.             this.propertiesReader.getProprietaManifestAttachments(implementazionePdDDestinatario);

  377.         // Read QualifiedAttribute
  378.         boolean readQualifiedAttribute = this.propertiesReader.isReadQualifiedAttribute(implementazionePdDDestinatario);









  379.         // Punto di inizio per la transazione.
  380.         Validatore validatoreProtocolConnectionReply = null;
  381.         IConnettore connectorSender = null;
  382.         String location = "";
  383.         try{

  384.             IProtocolVersionManager protocolManager = protocolFactory.createProtocolVersionManager(versioneProtocollo);



  385.             /* ------------------ Routing --------------- */

  386.             Connettore connettore = null;
  387.             String erroreRicercaConnettore = null;
  388.             if(functionAsRouter){
  389.                 // Un router puo' inoltrare solo verso il connettore del soggetto destinatario
  390.                 msgDiag.logPersonalizzato_prefix("(Router) ","routingTable.esaminaInCorso");
  391.                 try{
  392.                     connettore = configurazionePdDManager.getForwardRoute(soggettoDestinatario,functionAsRouter, requestInfo);
  393.                 }catch(Exception e){
  394.                     erroreRicercaConnettore = e.getMessage();
  395.                 }
  396.                 msgDiag.logPersonalizzato_prefix("(Router) ","routingTable.esaminaEffettuata");        
  397.             }else{
  398.                 if(configurazionePdDManager.isUtilizzoIndirizzoTelematico() && busta.getIndirizzoDestinatario()!=null){
  399.                     msgDiag.logPersonalizzato("routingTable.utilizzoIndirizzoTelematico");
  400.                     Property locationIndTel = new Property();
  401.                     locationIndTel.setNome(CostantiConnettori.CONNETTORE_LOCATION);
  402.                     locationIndTel.setValore(busta.getIndirizzoDestinatario());
  403.                     connettore = new Connettore();
  404.                     connettore.setTipo(TipiConnettore.HTTP.getNome());
  405.                     connettore.addProperty(locationIndTel);
  406.                 }else{
  407.                     msgDiag.logPersonalizzato("routingTable.esaminaInCorso");
  408.                     if(inoltroSegnalazioneErrore){
  409.                         try{
  410.                             // provo a cercare un connettore specializzato
  411.                             //log.info("Cerco busta per Mittente["+soggettoMittente.toString()+"] Destinatario["+soggettoDestinatario.toString()+"] Servizio["+busta.getTipoServizio()+busta.getServizio()+"] Azione["+busta.getAzione()+"]");
  412.                             connettore = configurazionePdDManager.getForwardRoute(soggettoMittente,idServizio,functionAsRouter, requestInfo);
  413.                         }catch(Exception e){
  414.                             erroreRicercaConnettore = "RicercaConnettoreSpecializzato, "+e.getMessage();
  415.                         }
  416.                         // provo ad inviarlo solo al soggetto
  417.                         if(connettore==null){
  418.                             try{
  419.                                 connettore = configurazionePdDManager.getForwardRoute(soggettoDestinatario,functionAsRouter, requestInfo);
  420.                             }catch(Exception e){
  421.                                 erroreRicercaConnettore = "\nRicercaConnettore, "+e.getMessage();
  422.                             }
  423.                         }
  424.                     }else{
  425.                         try{
  426.                             connettore = configurazionePdDManager.getForwardRoute(soggettoDestinatario,functionAsRouter, requestInfo);
  427.                         }catch(Exception e){
  428.                             erroreRicercaConnettore = e.getMessage();
  429.                         }
  430.                     }
  431.                     msgDiag.logPersonalizzato("routingTable.esaminaEffettuata");
  432.                 }
  433.             }          
  434.             if (connettore == null) {
  435.                 if(erroreRicercaConnettore!=null){
  436.                     msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, erroreRicercaConnettore);
  437.                     erroreRicercaConnettore = "Riscontrato errore durante la ricerca del connettore a cui inoltrare la busta: "+erroreRicercaConnettore;
  438.                 }else{
  439.                     msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, "non definito");
  440.                     erroreRicercaConnettore = "Riscontrato errore durante la ricerca del connettore a cui inoltrare la busta: non definito";
  441.                 }
  442.                 msgDiag.logPersonalizzato("routingTable.esaminaInCorsoFallita");
  443.                 ejbUtils.rollbackMessage(erroreRicercaConnettore, esito);
  444.                 openspcoopstate.releaseResource();
  445.                 esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,erroreRicercaConnettore);
  446.                 esito.setEsitoInvocazione(false);
  447.                 return esito;
  448.             }









  449.             /* ----------- Trasmissione ------------------ */
  450.             String soggettoDestinatarioTrasmissione = "";
  451.             Trasmissione tras = null;
  452.             if(this.propertiesReader.isGenerazioneListaTrasmissioni(implementazionePdDDestinatario)){
  453.                 msgDiag.mediumDebug("Aggiunta trasmissione della busta ...");
  454.                 // Tracciamento in busta
  455.                 tras = new Trasmissione();
  456.                 tras.setOrigine(identitaPdD.getNome());
  457.                 tras.setTipoOrigine(identitaPdD.getTipo());
  458.                 IDSoggetto destTrasm = null;
  459.                 if(connettore.getNomeDestinatarioTrasmissioneBusta()!=null && connettore.getTipoDestinatarioTrasmissioneBusta()!=null)
  460.                     destTrasm = new IDSoggetto(connettore.getTipoDestinatarioTrasmissioneBusta(),connettore.getNomeDestinatarioTrasmissioneBusta());
  461.                 else
  462.                     destTrasm = new IDSoggetto(busta.getTipoDestinatario(),
  463.                             busta.getDestinatario());    
  464.                 tras.setDestinazione(destTrasm.getNome());
  465.                 tras.setTipoDestinazione(destTrasm.getTipo());
  466.                 tras.setOraRegistrazione(busta.getOraRegistrazione());
  467.                 tras.setTempo(this.propertiesReader.getTipoTempoBusta(implementazionePdDDestinatario));
  468.                 busta.addTrasmissione(tras);
  469.                 // net hop is Router?  
  470.                 if( (soggettoDestinatario.getNome().equals(destTrasm.getNome())==false) ||
  471.                         (soggettoDestinatario.getTipo().equals(destTrasm.getTipo())==false) )
  472.                     soggettoDestinatarioTrasmissione = " (tramite router "+destTrasm.getTipo()+"/"+destTrasm.getNome()+")";
  473.             }
  474.             msgDiag.addKeyword(CostantiPdD.KEY_DESTINATARIO_TRASMISSIONE, soggettoDestinatarioTrasmissione);







  475.             /* ------------  Ricostruzione Messaggio Soap da spedire ------------- */
  476.             msgDiag.mediumDebug("Lettura messaggio da spedire...");
  477.             OpenSPCoop2Message responseMessage = null;
  478.             //TempiAttraversamentoPDD tempiAttraversamentoGestioneMessaggi = null;
  479.             //DimensioneMessaggiAttraversamentoPdD dimensioneMessaggiAttraversamentoGestioneMessaggi = null;
  480.             try{
  481.                 responseMessage = msgResponse.getMessage();
  482.                 //tempiAttraversamentoGestioneMessaggi = msgResponse.getTempiAttraversamentoPdD();
  483.                 //dimensioneMessaggiAttraversamentoGestioneMessaggi = msgResponse.getDimensioneMessaggiAttraversamentoPdD();
  484.             }catch(Exception e){
  485.                 msgDiag.logErroreGenerico(e, "msgResponse.getMessage()");
  486.                 ejbUtils.rollbackMessage("Ricostruzione del messaggio Soap da Spedire non riuscita.", esito);
  487.                 openspcoopstate.releaseResource();
  488.                 esito.setStatoInvocazioneErroreNonGestito(e);
  489.                 esito.setEsitoInvocazione(false);
  490.                 return esito;
  491.             }  



  492.            
  493.            
  494.            
  495.            
  496.             /* ------------ Porta Applicativa ------------ */
  497.             PortaApplicativa pa = null;
  498.             if(functionAsRouter==false){
  499.                 try{
  500.                     IDServizio idServizioPA = IDServizioFactory.getInstance().getIDServizioFromValues(busta.getTipoServizio(),busta.getServizio(),
  501.                             busta.getTipoMittente(),busta.getMittente(),
  502.                             busta.getVersioneServizio());
  503.                     idServizioPA.setAzione(busta.getAzione());
  504.                     pa = getPortaApplicativa(configurazionePdDManager, idServizioPA);
  505.                 }catch(Exception e){
  506.                     if( !(e instanceof DriverConfigurazioneNotFound)  ){
  507.                         msgDiag.logErroreGenerico(e, "getPortaApplicativaSafeMethod");
  508.                         ejbUtils.rollbackMessage("Ricostruzione errore durante la lettura della porta applicativa.", esito);
  509.                         openspcoopstate.releaseResource();
  510.                         esito.setStatoInvocazioneErroreNonGestito(e);
  511.                         esito.setEsitoInvocazione(false);
  512.                         return esito;
  513.                     }
  514.                 }  
  515.             }
  516.            
  517.            
  518.            
  519.            
  520.            
  521.            



  522.             /* ------------  Gestione Funzionalita' speciali per Attachments (Manifest) ------------- */    
  523.             boolean scartaBody = false;
  524.             // viene controllato servizio is not null, poiche' i riscontri non hanno un servizio
  525.             if(functionAsRouter==false && inoltroSegnalazioneErrore==false && busta.getTipoServizio()!=null && busta.getServizio()!=null){
  526.                 boolean allegaBody = configurazionePdDManager.isAllegaBody(pa);
  527.                 if(allegaBody){
  528.                     // E' stato effettuato prima l'inserimento del body come allegato.
  529.                     // Forzo lo scartamento.
  530.                     scartaBody = true;
  531.                 }else{
  532.                     scartaBody = configurazionePdDManager.isScartaBody(pa);
  533.                 }
  534.             }




  535.            

  536.             /* ------------  Aggiunta eccezioni di livello info riscontrate dalla validazione, se profilo e' lineeGuida1.1 ------------- */
  537.             if(functionAsRouter==false){
  538.                 if(  (inoltroSegnalazioneErrore==false) && (busta.sizeListaEccezioni()==0) && protocolManager.isEccezioniLivelloInfoAbilitato() ){
  539.                     RepositoryBuste repositoryBustaRichiesta = new RepositoryBuste(openspcoopstate.getStatoRisposta(), false, protocolFactory);
  540.                     List<Eccezione> erroriValidazione = repositoryBustaRichiesta.getErrorsFromInBox(busta.getRiferimentoMessaggio());
  541.                     for(int i=0; i<erroriValidazione.size();i++){
  542.                         Eccezione ec = erroriValidazione.get(i);
  543.                         if(LivelloRilevanza.INFO.equals(ec.getRilevanza())){
  544.                             busta.addEccezione(ec);
  545.                         }
  546.                     }
  547.                 }
  548.             }






  549.             /* ------------  Imbustamento ------------- */  
  550.             msgDiag.mediumDebug("Imbustamento ...");
  551.             BustaRawContent<?> headerBusta = null;
  552.             org.openspcoop2.protocol.engine.builder.Imbustamento imbustatore = null;
  553.             boolean gestioneManifest = false;
  554.             RuoloMessaggio ruoloMessaggio = null;
  555.             if(inoltroRisposteMsg.isImbustamento()){
  556.                 try{
  557.                     ruoloMessaggio = RuoloMessaggio.RISPOSTA;
  558.                     if(inoltroSegnalazioneErrore)
  559.                         ruoloMessaggio = RuoloMessaggio.RICHIESTA;
  560.                     imbustatore =
  561.                             new org.openspcoop2.protocol.engine.builder.Imbustamento(this.log,protocolFactory, openspcoopstate.getStatoRichiesta());
  562.    
  563.                     gestioneManifest = configurazionePdDManager.isGestioneManifestAttachments();
  564.                     // viene controllato servizio is not null, poiche' i riscontri non hanno un servizio
  565.                     if(functionAsRouter==false && inoltroSegnalazioneErrore==false  && busta.getTipoServizio()!=null && busta.getServizio()!=null){
  566.                         gestioneManifest = configurazionePdDManager.isGestioneManifestAttachments(pa,protocolFactory);
  567.                     }
  568.                     if(functionAsRouter &&
  569.                             !( identitaPdD.getTipo().equals(busta.getTipoMittente()) && identitaPdD.getNome().equals(busta.getMittente()) )
  570.                     ){
  571.                         // Aggiungo trasmissione solo se la busta e' stata generata dalla porta di dominio destinataria della richiesta.
  572.                         // Se il mittente e' il router, logicamente la busta sara' un errore generato dal router
  573.                         msgDiag.highDebug("Tipo Messaggio Risposta prima dell'imbustamento ["+responseMessage.getClass().getName()+"]");
  574.                         ProtocolMessage protocolMessage = imbustatore.addTrasmissione(responseMessage, tras, readQualifiedAttribute,
  575.                                 FaseImbustamento.PRIMA_SICUREZZA_MESSAGGIO);
  576.                         if(protocolMessage!=null && !protocolMessage.isPhaseUnsupported()) {
  577.                             headerBusta = protocolMessage.getBustaRawContent();
  578.                             responseMessage = protocolMessage.getMessage(); // updated
  579.                         }
  580.                         msgDiag.highDebug("Tipo Messaggio Risposta dopo l'imbustamento ["+responseMessage.getClass().getName()+"]");
  581.                     }
  582.                     else{
  583.                         Integrazione integrazione = new Integrazione();
  584.                         integrazione.setStateless(false);
  585.                         msgDiag.highDebug("Tipo Messaggio Risposta prima dell'imbustamento ["+responseMessage.getClass().getName()+"]");
  586.                         ProtocolMessage protocolMessage = null;
  587.                         if(RuoloMessaggio.RICHIESTA.equals(ruoloMessaggio)) {
  588.                             protocolMessage = imbustatore.imbustamentoRichiesta(responseMessage,pddContext,
  589.                                     busta,
  590.                                     integrazione,gestioneManifest,scartaBody,proprietaManifestAttachments,
  591.                                     FaseImbustamento.PRIMA_SICUREZZA_MESSAGGIO);
  592.                         }
  593.                         else {
  594.                             protocolMessage = imbustatore.imbustamentoRisposta(responseMessage,pddContext,
  595.                                     busta,null,
  596.                                     integrazione,gestioneManifest,scartaBody,proprietaManifestAttachments,
  597.                                     FaseImbustamento.DOPO_SICUREZZA_MESSAGGIO);
  598.                         }
  599.                         if(protocolMessage!=null && !protocolMessage.isPhaseUnsupported()) {
  600.                             headerBusta = protocolMessage.getBustaRawContent();
  601.                             responseMessage = protocolMessage.getMessage(); // updated
  602.                         }
  603.                         msgDiag.highDebug("Tipo Messaggio Risposta dopo l'imbustamento ["+responseMessage.getClass().getName()+"]");
  604.                     }
  605.                 }catch(Exception e){
  606.                     if(functionAsRouter)
  607.                         msgDiag.logErroreGenerico(e, "imbustatore.before-security.addTrasmissione");
  608.                     else
  609.                         msgDiag.logErroreGenerico(e, "imbustatore.before-security.imbustamento");
  610.                     ejbUtils.rollbackMessage("Imbustamento non riuscito.", esito);
  611.                     openspcoopstate.releaseResource();  
  612.                     esito.setStatoInvocazioneErroreNonGestito(e);
  613.                     esito.setEsitoInvocazione(false);
  614.                     return esito;
  615.                 }
  616.             }






  617.             /* ----------- Raccolta FlowParameter MTOM / Security ------------ */
  618.             msgDiag.mediumDebug("Raccolta FlowParameter MTOM / Security proprieta...");
  619.             MTOMProcessor mtomProcessor = null;
  620.             MessageSecurityConfig securityConfig = null;
  621.             FlowProperties flowProperties = null;
  622.             if(functionAsRouter==false){
  623.                
  624.                 try{
  625.                     flowProperties = this.getFlowProperties(busta,configurazionePdDManager,openspcoopstate.getStatoRisposta(),
  626.                             msgDiag,protocolFactory,pa, requestInfo);
  627.                 }catch(Exception e){
  628.                     msgDiag.logErroreGenerico(e, "RaccoltaFlowParameter_MTOM_Security");
  629.                     ejbUtils.rollbackMessage("RaccoltaFlowParameter_MTOM_Security non riuscita:"+e.getMessage(), esito);
  630.                     openspcoopstate.releaseResource();
  631.                     esito.setStatoInvocazioneErroreNonGestito(e);
  632.                     esito.setEsitoInvocazione(false);
  633.                     return esito;
  634.                 }
  635.                
  636.                 if(flowProperties!=null){
  637.                     msgDiag.mediumDebug("init MTOM Processor ...");
  638.                     mtomProcessor = new MTOMProcessor(flowProperties.mtom, flowProperties.messageSecurity,
  639.                             tipoPorta, msgDiag, this.log, pddContext);
  640.                     securityConfig = flowProperties.messageSecurity;
  641.                 }
  642.             }
  643.            
  644.            


  645.            
  646.            
  647.            
  648.            
  649.            
  650.             /* ----------- MTOM Processor BeforeSecurity ------------ */
  651.             msgDiag.mediumDebug("MTOM Processor [BeforeSecurity]...");
  652.             try{
  653.                 if(mtomProcessor!=null && flowProperties!=null) {
  654.                     mtomProcessor.mtomBeforeSecurity(responseMessage, flowProperties.tipoMessaggio);
  655.                 }
  656.             }catch(Exception e){
  657.                 // L'errore viene registrato dentro il metodo mtomProcessor.mtomBeforeSecurity
  658.                 //msgDiag.logErroreGenerico(e,"MTOMProcessor(BeforeSec-"+mtomProcessor.getMTOMProcessorType()+")");
  659.            
  660.                 ejbUtils.rollbackMessage("Riscontrato errore durante la gestione MTOM(BeforeSec-"+mtomProcessor.getMTOMProcessorType()+"): "+e.getMessage(), esito);
  661.                 openspcoopstate.releaseResource();
  662.                 esito.setStatoInvocazioneErroreNonGestito(e);
  663.                 esito.setEsitoInvocazione(false);
  664.                 return esito;
  665.             }
  666.            
  667.            
  668.            
  669.            
  670.            
  671.            
  672.            


  673.             /* ------------  Gestione MessageSecurity ------------- */
  674.             SecurityInfo securityInfo = null;
  675.             if(inoltroSegnalazioneErrore == false && functionAsRouter==false){
  676.                 msgDiag.mediumDebug("Gestione MessageSecurity del messaggio da inoltrare...");
  677.                                
  678.                 // Imposto un context di Base
  679.                 MessageSecurityContext messageSecurityContext = null;
  680.                 // MessageSecuritySender    
  681.                 if(securityConfig!=null && securityConfig.getFlowParameters()!=null && securityConfig.getFlowParameters().size()>0){
  682.                     try{
  683.                         MessageSecurityContextParameters contextParameters = new MessageSecurityContextParameters();
  684.                         contextParameters.setUseActorDefaultIfNotDefined(this.propertiesReader.isGenerazioneActorDefault(implementazionePdDDestinatario));
  685.                         contextParameters.setActorDefault(this.propertiesReader.getActorDefault(implementazionePdDDestinatario));
  686.                         contextParameters.setLog(this.log);
  687.                         contextParameters.setFunctionAsClient(SecurityConstants.SECURITY_SERVER);
  688.                         contextParameters.setPrefixWsuId(this.propertiesReader.getPrefixWsuId());
  689.                         contextParameters.setRemoveAllWsuIdRef(this.propertiesReader.isRemoveAllWsuIdRef());
  690.                         contextParameters.setIdFruitore(soggettoMittente);
  691.                         contextParameters.setIdServizio(idServizio);
  692.                         contextParameters.setPddFruitore(registroServiziManager.getIdPortaDominio(soggettoMittente, null, requestInfo));
  693.                         contextParameters.setPddErogatore(registroServiziManager.getIdPortaDominio(idServizio.getSoggettoErogatore(), null, requestInfo));
  694.                         messageSecurityContext = new MessageSecurityFactory().getMessageSecurityContext(contextParameters);
  695.                         messageSecurityContext.setOutgoingProperties(securityConfig.getFlowParameters());
  696.                         DynamicMapBuilderUtils.injectDynamicMap(busta, requestInfo, pddContext, this.log);
  697.                         if(messageSecurityContext.processOutgoing(responseMessage,pddContext,
  698.                                 transactionNullable!=null ? transactionNullable.getTempiElaborazione() : null) == false){
  699.                             msgDiag.logErroreGenerico(messageSecurityContext.getMsgErrore(), "Costruzione header MessageSecurity");
  700.                             String motivazioneErrore = "Applicazione MessageSecurity non riuscita:"+messageSecurityContext.getMsgErrore();
  701.                             ejbUtils.rollbackMessage(motivazioneErrore, esito);
  702.                             openspcoopstate.releaseResource();
  703.                             esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO, motivazioneErrore);
  704.                             esito.setEsitoInvocazione(false);
  705.                             return esito;
  706.                         }
  707.                     }catch(Exception e){
  708.                         msgDiag.logErroreGenerico(e, "set MessageSecurityContext");
  709.                         ejbUtils.rollbackMessage("Applicazione MessageSecurity non riuscita:"+e.getMessage(), esito);
  710.                         openspcoopstate.releaseResource();
  711.                         esito.setStatoInvocazioneErroreNonGestito(e);
  712.                         esito.setEsitoInvocazione(false);
  713.                         return esito;
  714.                     }
  715.                 }

  716.                
  717.                 try{
  718.                     IDigestReader digestReader = null;
  719.                     if(messageSecurityContext != null) {
  720.                         digestReader = messageSecurityContext.getDigestReader(responseMessage!=null ? responseMessage.getFactory() : OpenSPCoop2MessageFactory.getDefaultMessageFactory());
  721.                     }
  722.                     if(digestReader!=null){
  723.                         securityInfo = validazioneSemantica.readSecurityInformation(digestReader, responseMessage);
  724.                     }
  725.                 }catch(Exception e){
  726.                     msgDiag.logErroreGenerico(e,"ErroreLetturaInformazioniSicurezza");
  727.                     ejbUtils.rollbackMessage("Lettura informazioni di sicurezza:"+e.getMessage(), esito);
  728.                     openspcoopstate.releaseResource();
  729.                     esito.setStatoInvocazioneErroreNonGestito(e);
  730.                     esito.setEsitoInvocazione(false);
  731.                     return esito;
  732.                 }
  733.                
  734.             }




  735.            
  736.            
  737.            
  738.            
  739.             /* ----------- MTOM Processor AfterSecurity ------------ */
  740.             msgDiag.mediumDebug("MTOM Processor [AfterSecurity]...");
  741.             try{
  742.                 if(mtomProcessor!=null) {
  743.                     mtomProcessor.mtomAfterSecurity(responseMessage, flowProperties!=null ? flowProperties.tipoMessaggio : RuoloMessaggio.RISPOSTA);
  744.                 }
  745.             }catch(Exception e){
  746.                 // L'errore viene registrato dentro il metodo mtomProcessor.mtomAfterSecurity
  747.                 //msgDiag.logErroreGenerico(e,"MTOMProcessor(AfterSec-"+mtomProcessor.getMTOMProcessorType()+")");
  748.            
  749.                 ejbUtils.rollbackMessage("Riscontrato errore durante la gestione MTOM(AfterSec-"+mtomProcessor.getMTOMProcessorType()+"): "+e.getMessage(), esito);
  750.                 openspcoopstate.releaseResource();
  751.                 esito.setStatoInvocazioneErroreNonGestito(e);
  752.                 esito.setEsitoInvocazione(false);
  753.                 return esito;
  754.             }
  755.            
  756.            
  757.            
  758.            
  759.            
  760.            

  761.             /* ------------  Imbustamento ------------- */  
  762.             msgDiag.mediumDebug("Imbustamento (after-security) ...");
  763.             if(inoltroRisposteMsg.isImbustamento()){
  764.                 try{
  765.                     if(functionAsRouter &&
  766.                             !( identitaPdD.getTipo().equals(busta.getTipoMittente()) && identitaPdD.getNome().equals(busta.getMittente()) )
  767.                     ){
  768.                         // Aggiungo trasmissione solo se la busta e' stata generata dalla porta di dominio destinataria della richiesta.
  769.                         // Se il mittente e' il router, logicamente la busta sara' un errore generato dal router
  770.                         msgDiag.highDebug("Tipo Messaggio Risposta prima dell'imbustamento (after-security) ["+responseMessage.getClass().getName()+"]");
  771.                         ProtocolMessage protocolMessage = imbustatore.addTrasmissione(responseMessage, tras, readQualifiedAttribute,
  772.                                 FaseImbustamento.DOPO_SICUREZZA_MESSAGGIO);
  773.                         if(protocolMessage!=null && !protocolMessage.isPhaseUnsupported()) {
  774.                             headerBusta = protocolMessage.getBustaRawContent();
  775.                             responseMessage = protocolMessage.getMessage(); // updated
  776.                         }
  777.                         msgDiag.highDebug("Tipo Messaggio Risposta dopo l'imbustamento (after-security) ["+responseMessage.getClass().getName()+"]");
  778.                     }
  779.                     else{
  780.                         Integrazione integrazione = new Integrazione();
  781.                         integrazione.setStateless(false);
  782.                         msgDiag.highDebug("Tipo Messaggio Risposta prima dell'imbustamento (after-security) ["+responseMessage.getClass().getName()+"]");
  783.                         ProtocolMessage protocolMessage = null;
  784.                         if(RuoloMessaggio.RICHIESTA.equals(ruoloMessaggio)) {
  785.                             protocolMessage = imbustatore.imbustamentoRichiesta(responseMessage,pddContext,
  786.                                     busta,
  787.                                     integrazione,gestioneManifest,scartaBody,proprietaManifestAttachments,
  788.                                     FaseImbustamento.PRIMA_SICUREZZA_MESSAGGIO);
  789.                         }
  790.                         else {
  791.                             protocolMessage = imbustatore.imbustamentoRisposta(responseMessage,pddContext,
  792.                                     busta,null,
  793.                                     integrazione,gestioneManifest,scartaBody,proprietaManifestAttachments,
  794.                                     FaseImbustamento.DOPO_SICUREZZA_MESSAGGIO);
  795.                         }
  796.                         if(protocolMessage!=null && !protocolMessage.isPhaseUnsupported()) {
  797.                             headerBusta = protocolMessage.getBustaRawContent();
  798.                             responseMessage = protocolMessage.getMessage(); // updated
  799.                         }
  800.                         msgDiag.highDebug("Tipo Messaggio Risposta dopo l'imbustamento (after-security) ["+responseMessage.getClass().getName()+"]");
  801.                     }
  802.                 }catch(Exception e){
  803.                     if(functionAsRouter)
  804.                         msgDiag.logErroreGenerico(e, "imbustatore.after-security.addTrasmissione");
  805.                     else
  806.                         msgDiag.logErroreGenerico(e, "imbustatore.after-security.imbustamento");
  807.                     ejbUtils.rollbackMessage("Imbustamento non riuscito (after-security).", esito);
  808.                     openspcoopstate.releaseResource();  
  809.                     esito.setStatoInvocazioneErroreNonGestito(e);
  810.                     esito.setEsitoInvocazione(false);
  811.                     return esito;
  812.                 }
  813.             }
  814.            
  815.            
  816.            
  817.            
  818.            
  819.            
  820.             /* ---------------- OutResponseHandler ----------------------*/
  821.            
  822.            
  823.             OutResponseContext outResponseContext = new OutResponseContext(this.log,protocolFactory,openspcoopstate.getStatoRichiesta());
  824.        
  825.             EsitoTransazione esitoHandler = null;
  826.             if(inoltroSegnalazioneErrore==false){
  827.                
  828.                 // Informazioni sul messaggio
  829.                 outResponseContext.setMessaggio(responseMessage);
  830.                
  831.                 // Contesto
  832.                 ProtocolContext protocolContext = new ProtocolContext();
  833.                 protocolContext.setIdRichiesta(idMessageRequest);
  834.                 protocolContext.setFruitore(soggettoMittente);
  835.                 if(busta!=null){
  836.                     protocolContext.setIndirizzoFruitore(busta.getIndirizzoMittente());
  837.                 }
  838.                 protocolContext.setErogatore(soggettoDestinatario);
  839.                 if(busta!=null){
  840.                     protocolContext.setIndirizzoErogatore(busta.getIndirizzoDestinatario());
  841.                 }
  842.                 if(busta!=null){
  843.                     protocolContext.setTipoServizio(busta.getTipoServizio());
  844.                     protocolContext.setServizio(busta.getServizio());
  845.                     protocolContext.setVersioneServizio(busta.getVersioneServizio());
  846.                     protocolContext.setAzione(busta.getAzione());
  847.                     protocolContext.setProfiloCollaborazione(busta.getProfiloDiCollaborazione(),busta.getProfiloDiCollaborazioneValue());
  848.                     protocolContext.setCollaborazione(busta.getCollaborazione());
  849.                     protocolContext.setIdRisposta(busta.getID());
  850.                 }
  851.                 protocolContext.setDominio(msgDiag.getDominio());
  852.                 outResponseContext.setProtocollo(protocolContext);
  853.                
  854.                 // Integrazione
  855.                 IntegrationContext integrationContext = new IntegrationContext();
  856.                 integrationContext.setIdCorrelazioneApplicativa(inoltroRisposteMsg.getIdCorrelazioneApplicativa());
  857.                 integrationContext.setServizioApplicativoFruitore(inoltroRisposteMsg.getServizioApplicativoFruitore());
  858.                 integrationContext.setGestioneStateless(false);
  859.                 outResponseContext.setIntegrazione(integrationContext);
  860.                
  861.                 // Altre informazioni
  862.                 outResponseContext.setDataElaborazioneMessaggio(DateManager.getDate());
  863.                 outResponseContext.setPddContext(pddContext);
  864.                 outResponseContext.setTipoPorta(tipoPorta);
  865.                 outResponseContext.setIdModulo(this.idModulo);
  866.                
  867.                 // Invocazione Handler
  868.                 try{
  869.                     GestoreHandlers.outResponse(outResponseContext, msgDiag, this.log);
  870.                 }catch(Exception e){
  871.                     if(e instanceof HandlerException){
  872.                         HandlerException he = (HandlerException) e;
  873.                         if(he.isEmettiDiagnostico()){
  874.                             msgDiag.logErroreGenerico(e, ((HandlerException)e).getIdentitaHandler());
  875.                         }
  876.                         ejbUtils.rollbackMessage(((HandlerException)e).getIdentitaHandler()+" error: "+e.getMessage(), esito);
  877.                     }else{
  878.                         msgDiag.logErroreGenerico(e, "OutResponseHandler");
  879.                         ejbUtils.rollbackMessage("OutResponseHandler error: "+e.getMessage(), esito);
  880.                     }
  881.                     openspcoopstate.releaseResource();
  882.                     esito.setStatoInvocazioneErroreNonGestito(e);
  883.                     esito.setEsitoInvocazione(false);
  884.                     return esito;
  885.                 }
  886.            
  887.                 // Prendo messaggio rielaborato
  888.                 responseMessage = outResponseContext.getMessaggio();
  889.                 if(responseMessage!=null){
  890.                     esitoHandler = protocolFactory.createEsitoBuilder().getEsito(null,
  891.                             200, requestInfo.getProtocolServiceBinding(),
  892.                             responseMessage, null,
  893.                             pddContext);            
  894.                    
  895.                 }
  896.             }
  897.            
  898.            
  899.            
  900.            
  901.            
  902.            
  903.            
  904.            





  905.             /* -------------------
  906.        Rilascio Risorse (Le riprendero' dopo aver ottenuto la risposta, se necessario)
  907.        Le informazioni nel DB sono state utilizzate fino a questo punto solo in lettura.
  908.        Eventuali spedizioni JMS sono state effettuate e le risorse gia' rilasciate (non arrivero a questo punto)
  909.        -----------------------*/
  910.             msgDiag.mediumDebug("Rilascio connessione al database...");
  911.             openspcoopstate.releaseResource();


  912.            
  913.            
  914.            
  915.            
  916.            
  917.            


  918.             /* ------------------- Spedizione Messaggio Soap -----------------------*/
  919.             msgDiag.mediumDebug("Impostazione messaggio del connettore...");

  920.             //  Connettore per consegna
  921.             String tipoConnector = connettore.getTipo();
  922.             msgDiag.addKeyword(CostantiPdD.KEY_TIPO_CONNETTORE, tipoConnector);
  923.             org.openspcoop2.core.config.Property [] cps = null;
  924.             if(connettore.getPropertyList().size()>0){
  925.                 cps = connettore.getPropertyList().toArray(new org.openspcoop2.core.config.Property[connettore.getPropertyList().size()]);
  926.             }
  927.             ConnettoreMsg connettoreMsg = new ConnettoreMsg(tipoConnector,responseMessage,cps);
  928.             connettoreMsg.setBusta(busta);
  929.             connettoreMsg.setIdModulo(InoltroRisposte.ID_MODULO);
  930.             connettoreMsg.setProtocolFactory(protocolFactory);
  931.             connettoreMsg.setMsgDiagnostico(msgDiag);
  932.             connettoreMsg.setState(openspcoopstate.getStatoRichiesta());
  933.             connettoreMsg.initPolicyGestioneToken(configurazionePdDManager, requestInfo);
  934.            
  935.             // Risposte del connettore
  936.             int codiceRitornato = -1;
  937.             OpenSPCoop2Message responseHttpReply = null;

  938.             // Stato consegna tramite connettore
  939.             boolean errorConsegna = false;
  940.             boolean riconsegna = false;
  941.             java.sql.Timestamp dataRiconsegna = null;
  942.             String motivoErroreConsegna = null;
  943.             boolean invokerNonSupportato = false;
  944.             SOAPFault soapFaultConnectionReply = null;
  945.             ProblemRFC7807 restProblemConnectionReply = null;
  946.             OpenSPCoop2MessageFactory faultConnectionReplyMessageFactory = null;
  947.             Exception eccezioneProcessamentoConnettore = null;

  948.             // Carico connettore richiesto
  949.             String connectorClass = null;
  950.             @SuppressWarnings("unused")
  951.             Exception eInvokerNonSupportato = null;
  952.             if(invokerNonSupportato==false){
  953.                 try{
  954.                     connectorSender = (IConnettore) this.pluginLoader.newConnettore(tipoConnector);
  955.                 }
  956.                 catch(Exception e){
  957.                     msgDiag.logErroreGenerico(e,"Inizializzazione Connettore"); // l'errore contiene gia tutte le informazioni
  958.                     invokerNonSupportato = true;
  959.                     eInvokerNonSupportato = e;
  960.                 }
  961.                 if(connectorSender!=null) {
  962.                     try {
  963.                         connectorClass = connectorSender.getClass().getName();
  964.                         AbstractCore.init(connectorSender, pddContext, protocolFactory);
  965.                     }catch(Exception e){
  966.                         msgDiag.logErroreGenerico(e,"IConnettore.newInstance(tipo:"+tipoConnector+" class:"+connectorClass+")");
  967.                         invokerNonSupportato = true;
  968.                         eInvokerNonSupportato = e;
  969.                     }
  970.                 }
  971.                 if( (invokerNonSupportato == false) && (connectorSender == null)){
  972.                     msgDiag.logErroreGenerico("ConnectorSender is null","IConnettore.newInstance(tipo:"+tipoConnector+" class:"+connectorClass+")");
  973.                     invokerNonSupportato = true;
  974.                 }
  975.             }

  976.             // Imposto tipo di richiesta
  977.             HttpRequestMethod httpRequestMethod = null;
  978.             if(connectorSender!=null){
  979.                 try{
  980.                     if(connectorSender instanceof ConnettoreBaseHTTP){
  981.                         ConnettoreBaseHTTP baseHttp = (ConnettoreBaseHTTP) connectorSender;
  982.                         baseHttp.setHttpMethod(responseMessage);
  983.                        
  984.                         if(ServiceBinding.REST.equals(responseMessage.getServiceBinding())){
  985.                             httpRequestMethod = baseHttp.getHttpMethod();
  986.                         }
  987.                     }
  988.                 }catch(Exception e){
  989.                     msgDiag.logErroreGenerico(e,"ConnettoreBaseHTTP.setHttpMethod(tipo:"+tipoConnector+" class:"+connectorClass+")");
  990.                     invokerNonSupportato = true;
  991.                     eInvokerNonSupportato = e;
  992.                 }
  993.             }
  994.            
  995.             // Location
  996.             location = ConnettoreUtils.getAndReplaceLocationWithBustaValues(connectorSender, connettoreMsg, busta, pddContext, protocolFactory, this.log);
  997.             if(location!=null){
  998.                 String locationWithUrl = ConnettoreUtils.buildLocationWithURLBasedParameter(this.log, responseMessage, connettoreMsg.getTipoConnettore(), connettoreMsg.getPropertiesUrlBased(), location,
  999.                         protocolFactory, this.idModulo);
  1000.                 locationWithUrl = ConnettoreUtils.addProxyInfoToLocationForHTTPConnector(connettoreMsg.getTipoConnettore(), connettoreMsg.getConnectorProperties(), locationWithUrl);
  1001.                 msgDiag.addKeyword(CostantiPdD.KEY_LOCATION, ConnettoreUtils.formatLocation(httpRequestMethod, locationWithUrl));
  1002.                
  1003.                 pddContext.addObject(CostantiPdD.CONNETTORE_REQUEST_METHOD, httpRequestMethod);
  1004.                 pddContext.addObject(CostantiPdD.CONNETTORE_REQUEST_URL, locationWithUrl);
  1005.             }
  1006.             else{
  1007.                 msgDiag.addKeyword(CostantiPdD.KEY_LOCATION, "N.D.");
  1008.             }

  1009.             // timeout di default
  1010.             if(connettoreMsg.getConnectorProperties()==null){
  1011.                 java.util.Map<String,String> propCon = new java.util.HashMap<>();
  1012.                 connettoreMsg.setConnectorProperties(propCon);
  1013.             }
  1014.             if(connettoreMsg.getConnectorProperties().get(CostantiConnettori.CONNETTORE_CONNECTION_TIMEOUT)==null ||
  1015.                     connettoreMsg.getConnectorProperties().get(CostantiConnettori.CONNETTORE_READ_CONNECTION_TIMEOUT)==null){
  1016.                 DatiTempiRisposta datiTempiRisposta = ConnettoreUtilities.readDatiGlobaliTimeout(configurazionePdDManager, TipoPdD.DELEGATA, requestInfo, this.propertiesReader);
  1017.                 if(connettoreMsg.getConnectorProperties().get(CostantiConnettori.CONNETTORE_CONNECTION_TIMEOUT)==null){
  1018.                     connettoreMsg.getConnectorProperties().put(CostantiConnettori.CONNETTORE_CONNECTION_TIMEOUT,
  1019.                             "" + ((datiTempiRisposta!=null && datiTempiRisposta.getConnectionTimeout()!=null) ? datiTempiRisposta.getConnectionTimeout().intValue() : this.propertiesReader.getConnectionTimeout_inoltroBuste()));
  1020.                     connettoreMsg.getConnectorProperties().put(CostantiConnettori.CONNETTORE_CONNECTION_TIMEOUT_GLOBALE, "true" );
  1021.                 }
  1022.                 if(connettoreMsg.getConnectorProperties().get(CostantiConnettori.CONNETTORE_READ_CONNECTION_TIMEOUT)==null){
  1023.                     connettoreMsg.getConnectorProperties().put(CostantiConnettori.CONNETTORE_READ_CONNECTION_TIMEOUT,
  1024.                             "" + ((datiTempiRisposta!=null && datiTempiRisposta.getReadConnectionTimeout()!=null) ? datiTempiRisposta.getReadConnectionTimeout().intValue() : this.propertiesReader.getReadConnectionTimeout_inoltroBuste()));
  1025.                     connettoreMsg.getConnectorProperties().put(CostantiConnettori.CONNETTORE_READ_CONNECTION_TIMEOUT_GLOBALE, "true" );
  1026.                 }
  1027.             }
  1028.            
  1029.             // User-Agent e X-* header
  1030.             UtilitiesIntegrazione httpUtilities = UtilitiesIntegrazione.getInstancePAResponse(this.log);
  1031.             if(connettoreMsg.getPropertiesTrasporto()==null){
  1032.                 Map<String, List<String>>  trasporto = new HashMap<> ();
  1033.                 connettoreMsg.setPropertiesTrasporto(trasporto);
  1034.             }
  1035.             httpUtilities.setInfoProductTransportProperties(connettoreMsg.getPropertiesTrasporto());


  1036.             // Informazioni connettore in uscita
  1037.             InfoConnettoreUscita infoConnettoreUscita = new InfoConnettoreUscita();
  1038.             infoConnettoreUscita.setLocation(location);
  1039.             infoConnettoreUscita.setProperties(connettoreMsg.getConnectorProperties());
  1040.             infoConnettoreUscita.setHeaders(connettoreMsg.getPropertiesTrasporto());
  1041.             infoConnettoreUscita.setParameters(connettoreMsg.getPropertiesUrlBased());
  1042.             infoConnettoreUscita.setSbustamentoSoap(connettoreMsg.isSbustamentoSOAP());
  1043.             infoConnettoreUscita.setSbustamentoInformazioniProtocollo(connettoreMsg.isSbustamentoInformazioniProtocollo());
  1044.             infoConnettoreUscita.setTipoAutenticazione(connettoreMsg.getAutenticazione());
  1045.             infoConnettoreUscita.setCredenziali(connettoreMsg.getCredenziali());
  1046.             infoConnettoreUscita.setTipoConnettore(connettoreMsg.getTipoConnettore());
  1047.            
  1048.             //  Utilizzo Connettore
  1049.             if(invokerNonSupportato==false){
  1050.                 msgDiag.logPersonalizzato("inoltroInCorso");
  1051.                 // utilizzo connettore
  1052.                 errorConsegna = !connectorSender.send(null, connettoreMsg);
  1053.                 motivoErroreConsegna = connectorSender.getErrore();
  1054.                 eccezioneProcessamentoConnettore = connectorSender.getEccezioneProcessamento();
  1055.                 if(errorConsegna && motivoErroreConsegna==null){
  1056.                     motivoErroreConsegna = "Errore durante la consegna";
  1057.                 }
  1058.                 //  interpretazione esito consegna
  1059.                 GestioneErrore gestioneConsegnaConnettore = configurazionePdDManager.getGestioneErroreConnettoreComponenteCooperazione(protocolFactory, responseMessage.getServiceBinding());
  1060.                 GestoreErroreConnettore  gestoreErrore = new GestoreErroreConnettore();
  1061.                 errorConsegna = !gestoreErrore.verificaConsegna(gestioneConsegnaConnettore,motivoErroreConsegna,eccezioneProcessamentoConnettore,connectorSender);
  1062.                 if(errorConsegna){
  1063.                     motivoErroreConsegna = gestoreErrore.getErrore();
  1064.                     riconsegna = gestoreErrore.isRiconsegna();
  1065.                     dataRiconsegna = gestoreErrore.getDataRispedizione();
  1066.                 }
  1067.                 // raccolta risultati del connettore
  1068.                 soapFaultConnectionReply = gestoreErrore.getFault();
  1069.                 restProblemConnectionReply = gestoreErrore.getProblem();
  1070.                 faultConnectionReplyMessageFactory = connectorSender.getResponse()!=null ? connectorSender.getResponse().getFactory() : OpenSPCoop2MessageFactory.getDefaultMessageFactory();
  1071.                 codiceRitornato = connectorSender.getCodiceTrasporto();
  1072.                 responseHttpReply = connectorSender.getResponse();
  1073.                 Map<String, List<String>>  headerTrasportoReply = connectorSender.getHeaderTrasporto();
  1074.                 // gestione connessione connettore
  1075.                 // Sono nella casistica di messaggio preso in carico.
  1076.                 // Non si deve chiudere immediatamente la connessione, poiche' nel resto del modulo, il messaggio puo' ancora essere utilizzato (es. dump)
  1077.                 /*
  1078.                 try{
  1079.                     connectorSender.disconnect();
  1080.                 }catch(Exception e){
  1081.                     msgDiag.logDisconnectError(e, location);
  1082.                 }
  1083.                 */

  1084.                 msgDiag.addKeyword(CostantiPdD.KEY_CODICE_CONSEGNA, codiceRitornato+"");
  1085.                 if(motivoErroreConsegna!=null)
  1086.                     msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_CONSEGNA, motivoErroreConsegna);
  1087.                
  1088.                 // Il Connettore potrebbe aggiungere informazioni alla location.
  1089.                 String tmpLocation = connectorSender.getLocation();
  1090.                 if(tmpLocation!=null){
  1091.                    
  1092.                     // salvo la request url originale, se la risposta non ĆØ letta dalla cache
  1093.                     boolean responseCached = false;
  1094.                     if(pddContext.containsKey(ConnettoreBase.RESPONSE_FROM_CACHE)) {
  1095.                         responseCached = (Boolean) pddContext.getObject(ConnettoreBase.RESPONSE_FROM_CACHE);
  1096.                     }
  1097.                     if(!responseCached) {
  1098.                         pddContext.addObject(CostantiPdD.CONNETTORE_REQUEST_METHOD, httpRequestMethod);
  1099.                         pddContext.addObject(CostantiPdD.CONNETTORE_REQUEST_URL, tmpLocation);
  1100.                     }
  1101.                    
  1102.                     // aggiorno
  1103.                     location = tmpLocation;
  1104.                     if(responseCached) {
  1105.                         msgDiag.addKeyword(CostantiPdD.KEY_LOCATION, location);
  1106.                     }
  1107.                     else {
  1108.                         msgDiag.addKeyword(CostantiPdD.KEY_LOCATION, ConnettoreUtils.formatLocation(httpRequestMethod, location));
  1109.                     }
  1110.                 }
  1111.                
  1112.                 //  dump applicativo
  1113.                 if(responseHttpReply!=null ){
  1114.                     DumpConfigurazione dumpConfig = configurazionePdDManager.getDumpConfigurazione(pa);
  1115.                     Dump dumpApplicativo = new Dump(identitaPdD,InoltroRisposte.ID_MODULO,idMessageRequest,
  1116.                             soggettoMittente,idServizio,tipoPorta,msgDiag.getPorta(),pddContext,
  1117.                             openspcoopstate.getStatoRichiesta(),openspcoopstate.getStatoRisposta(),
  1118.                             dumpConfig);
  1119.                     dumpApplicativo.dumpRispostaIngresso(responseHttpReply, infoConnettoreUscita, headerTrasportoReply);
  1120.                 }
  1121.             }

  1122.            
  1123.            
  1124.            
  1125.            
  1126.            
  1127.            
  1128.            
  1129.            
  1130.             /* ------------  Re-ottengo Connessione al DB -------------- */
  1131.             msgDiag.mediumDebug("Richiesta connessione al database per la gestione della risposta...");
  1132.             openspcoopstate.updateResource(idTransazione);







  1133.             /* ------------  Tracciamento Richiesta e Messaggio Diagnostico ------------- */
  1134.             IValidatoreErrori validatoreErrori = protocolFactory.createValidatoreErrori(openspcoopstate.getStatoRichiesta());
  1135.             if(invokerNonSupportato==false){ //&& errorConsegna==false){

  1136.                 // Tracciamento effettuato sempre
  1137.                 msgDiag.mediumDebug("Tracciamento della busta...");
  1138.                 EsitoElaborazioneMessaggioTracciato esitoTraccia = EsitoElaborazioneMessaggioTracciato.getEsitoElaborazioneMessaggioInviato();
  1139.                 if(inoltroSegnalazioneErrore){
  1140.                     tracciamento.registraRichiesta(responseMessage,securityInfo,headerBusta,busta,esitoTraccia,
  1141.                             Tracciamento.createLocationString(false, location),
  1142.                             inoltroRisposteMsg.getIdCorrelazioneApplicativa());
  1143.                 }
  1144.                 else{
  1145.                     tracciamento.registraRisposta(responseMessage,securityInfo,headerBusta,busta,esitoTraccia,
  1146.                             Tracciamento.createLocationString(false, location),
  1147.                             inoltroRisposteMsg.getIdCorrelazioneApplicativa(),inoltroRisposteMsg.getIdCorrelazioneApplicativaRisposta());
  1148.                 }

  1149.                 if(errorConsegna){
  1150.                     msgDiag.logPersonalizzato("inoltroConErrore");
  1151.                 }else{
  1152.                     String tipoMsg = "Messaggio Protocollo";
  1153.                     ProprietaValidazioneErrori pValidazioneErrori = new ProprietaValidazioneErrori();
  1154.                     pValidazioneErrori.setIgnoraEccezioniNonGravi(protocolManager.isIgnoraEccezioniNonGravi());
  1155.                     pValidazioneErrori.setVersioneProtocollo(versioneProtocollo);
  1156.                     if(validatoreErrori.isBustaErrore(busta,responseMessage,pValidazioneErrori))
  1157.                         tipoMsg = tipoMsg + " Errore";

  1158.                     if(configurazionePdDManager.isUtilizzoIndirizzoTelematico() && busta.getIndirizzoDestinatario()!=null){
  1159.                         msgDiag.addKeyword(CostantiPdD.KEY_LOCATION, ("indirizzoTelematico["+busta.getIndirizzoDestinatario()+"]"));
  1160.                         msgDiag.logPersonalizzato("inoltroEffettuato");
  1161.                     }else{
  1162.                         msgDiag.logPersonalizzato("inoltroEffettuato");
  1163.                     }
  1164.                 }
  1165.             }









  1166.        




  1167.             /* ------------- Analisi di una risposta ritornata ------------*/
  1168.             boolean presenzaRispostaProtocolConnectionReply = false;
  1169.            
  1170.             if(responseHttpReply != null ){
  1171.                 msgDiag.mediumDebug("Analisi della risposta (validazione sintattica)...");
  1172.                 // ValidazioneSintattica: serve a leggere il messaggio
  1173.                 ProprietaValidazione property = new ProprietaValidazione();
  1174.                 property.setValidazioneConSchema(configurazionePdDManager.isLivelloValidazioneRigido(implementazionePdDDestinatario));
  1175.                 property.setValidazioneProfiloCollaborazione(configurazionePdDManager.isValidazioneProfiloCollaborazione(implementazionePdDDestinatario));
  1176.                 property.setValidazioneManifestAttachments(configurazionePdDManager.isValidazioneManifestAttachments(implementazionePdDDestinatario));
  1177.                 validatoreProtocolConnectionReply = new Validatore(responseHttpReply,pddContext,property,
  1178.                         openspcoopstate.getStatoRisposta(),readQualifiedAttribute, protocolFactory);
  1179.                 presenzaRispostaProtocolConnectionReply  = validatoreProtocolConnectionReply.validazioneSintattica();
  1180.                 if(presenzaRispostaProtocolConnectionReply){
  1181.                     // Gestisco i log come fossero una risposta, come se fossi nel modulo InoltroBuste
  1182.                     msgDiag.addKeywords(validatoreProtocolConnectionReply.getBusta(), false);
  1183.                 }
  1184.                 else{
  1185.                     if(validatoreProtocolConnectionReply.getErrore()!=null){
  1186.                         this.log.debug("Messaggio non riconosciuto come busta ("+traduttore.toString(validatoreProtocolConnectionReply.getErrore().getCodiceErrore())
  1187.                                 +"): "+validatoreProtocolConnectionReply.getErrore().getDescrizione(protocolFactory));
  1188.                     }
  1189.                 }
  1190.             }













  1191.             /* ------------------------- Gestione Errori Consegna ---------------------------- */      
  1192.             msgDiag.mediumDebug("Gestione errore consegna della risposta...");
  1193.             if(invokerNonSupportato){
  1194.                 String motivazioneErrore = "Connettore non supportato [tipo:"+tipoConnector+" class:"+connectorClass+"]";
  1195.                 ejbUtils.rollbackMessage(motivazioneErrore, esito);
  1196.                 openspcoopstate.releaseResource();
  1197.                 esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO, motivazioneErrore);
  1198.                 esito.setEsitoInvocazione(false);
  1199.                 return esito;
  1200.             }
  1201.             else if(errorConsegna && presenzaRispostaProtocolConnectionReply==false){
  1202.                 //  Effettuo log dell'eventuale fault
  1203.                 if(soapFaultConnectionReply!=null){
  1204.                     msgDiag.addKeyword(CostantiPdD.KEY_SOAP_FAULT, SoapUtils.safe_toString(faultConnectionReplyMessageFactory, soapFaultConnectionReply, this.log));
  1205.                     msgDiag.logPersonalizzato("ricezioneSoapFault");
  1206.                 }
  1207.                 else if(restProblemConnectionReply!=null){
  1208.                     msgDiag.addKeyword(CostantiPdD.KEY_REST_PROBLEM, restProblemConnectionReply.getRaw());
  1209.                     msgDiag.logPersonalizzato("ricezioneRestProblem");
  1210.                 }
  1211.                 String motivazioneErrore = "Errore duranta la spedizione della busta: "+motivoErroreConsegna;
  1212.                 if(riconsegna){
  1213.                     ejbUtils.rollbackMessage(motivazioneErrore,dataRiconsegna, esito);
  1214.                     esito.setEsitoInvocazione(false);
  1215.                 }else{
  1216.                     if(inoltroSegnalazioneErrore)
  1217.                         ejbUtils.releaseOutboxMessage(false);
  1218.                     else
  1219.                         ejbUtils.releaseInboxMessage(false);
  1220.                     esito.setEsitoInvocazione(true);
  1221.                 }
  1222.                 openspcoopstate.releaseResource();
  1223.                 esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO, motivazioneErrore);
  1224.                 return esito;
  1225.             }




  1226.             /* ---------------- Gestione Risposta  (operazioni comuni per tutti i profili) ------------------- */
  1227.             boolean isMessaggioErroreProtocolloConnectionReply = false;
  1228.             Busta bustaConnectionReply = null;

  1229.             if(presenzaRispostaProtocolConnectionReply){
  1230.                 // Gestione Specifica per Buste
  1231.                 bustaConnectionReply = validatoreProtocolConnectionReply.getBusta();
  1232.                 isMessaggioErroreProtocolloConnectionReply = validatoreProtocolConnectionReply.isErroreProtocollo();

  1233.                 // Registrazione Msg
  1234.                 if(isMessaggioErroreProtocolloConnectionReply){
  1235.                     msgDiag.logPersonalizzato("ricezioneMessaggioErrore");
  1236.                 }else{
  1237.                     msgDiag.logPersonalizzato("ricezioneMessaggio");
  1238.                 }

  1239.                 // Estrazione header busta
  1240.                 msgDiag.mediumDebug("Sbustamento della risposta...");
  1241.                 BustaRawContent<?> headerProtocolloRispostaConnectionReply = null;
  1242.                 try{
  1243.                     boolean gestioneManifestRispostaHttp = false;
  1244.                     if(functionAsRouter==false)
  1245.                         gestioneManifestRispostaHttp = configurazionePdDManager.isGestioneManifestAttachments();
  1246.                     org.openspcoop2.protocol.engine.builder.Sbustamento sbustatore =
  1247.                             new org.openspcoop2.protocol.engine.builder.Sbustamento(protocolFactory,openspcoopstate.getStatoRichiesta());
  1248.                     ProtocolMessage protocolMessage = sbustatore.sbustamento(responseHttpReply,pddContext,
  1249.                             busta,
  1250.                             RuoloMessaggio.RISPOSTA,gestioneManifestRispostaHttp,proprietaManifestAttachments,
  1251.                             FaseSbustamento.POST_CONSEGNA_RISPOSTA_NEW_CONNECTION, requestInfo);
  1252.                     if(protocolMessage!=null) {
  1253.                         headerProtocolloRispostaConnectionReply = protocolMessage.getBustaRawContent();
  1254.                         responseHttpReply = protocolMessage.getMessage(); // updated
  1255.                     }
  1256.                 }catch(Exception e){
  1257.                     EsitoElaborazioneMessaggioTracciato esitoTraccia = EsitoElaborazioneMessaggioTracciato.getEsitoElaborazioneConErrore("Sbustamento busta nella connection Reply non riuscita: "+e.getMessage());
  1258.                     tracciamento.registraRisposta(responseHttpReply,null,
  1259.                             validatoreProtocolConnectionReply.getHeaderProtocollo(),bustaConnectionReply,esitoTraccia,
  1260.                             Tracciamento.createLocationString(true, location),
  1261.                             inoltroRisposteMsg.getIdCorrelazioneApplicativa(),inoltroRisposteMsg.getIdCorrelazioneApplicativaRisposta()); // non ancora registrata
  1262.                     msgDiag.logErroreGenerico(e,"sbustatore.sbustamento("+bustaConnectionReply.getID()+")");
  1263.                     ejbUtils.rollbackMessage("Sbustamento busta nella connection Reply non riuscita.", esito);
  1264.                     openspcoopstate.releaseResource();
  1265.                     esito.setStatoInvocazioneErroreNonGestito(e);
  1266.                     esito.setEsitoInvocazione(false);
  1267.                     return esito;
  1268.                 }

  1269.                 // Tracciamento Risposta
  1270.                 msgDiag.mediumDebug("Tracciamento della risposta...");
  1271.                 EsitoElaborazioneMessaggioTracciato esitoTraccia = EsitoElaborazioneMessaggioTracciato.getEsitoElaborazioneMessaggioRicevuto();
  1272.                 tracciamento.registraRisposta(responseHttpReply,null,
  1273.                         headerProtocolloRispostaConnectionReply,bustaConnectionReply,esitoTraccia,
  1274.                         Tracciamento.createLocationString(true, location),
  1275.                         inoltroRisposteMsg.getIdCorrelazioneApplicativa(),inoltroRisposteMsg.getIdCorrelazioneApplicativaRisposta());

  1276.                 // Salvo il messaggio di risposta e re-inoltro l'errore
  1277.                 if(functionAsRouter){  
  1278.                     msgDiag.mediumDebug("Registrazione messaggio nel Repository Messaggi/Buste...");
  1279.                     msgConnectionReply = new GestoreMessaggi(openspcoopstate, false, bustaConnectionReply.getID(),Costanti.OUTBOX,msgDiag, pddContext);
  1280.                     msgConnectionReply.setOneWayVersione11(oneWayVersione11);
  1281.                     try{
  1282.                         repositoryConnectionReply = new RepositoryBuste(openspcoopstate.getStatoRisposta(), false,protocolFactory);
  1283.                        
  1284.                         if( msgConnectionReply.existsMessage_noCache() ){
  1285.                             // Se il proprietario attuale e' GestoreMessaggi, forzo l'eliminazione e continuo a processare il messaggio.
  1286.                             String proprietarioMessaggio = msgConnectionReply.getProprietario(InoltroRisposte.ID_MODULO);
  1287.                             if(TimerGestoreMessaggi.ID_MODULO.equals(proprietarioMessaggio)){
  1288.                                 msgDiag.addKeyword(CostantiPdD.KEY_ID_MESSAGGIO_RISPOSTA, bustaConnectionReply.getID());
  1289.                                 msgDiag.logPersonalizzato_prefix("(http reply) ","ricezioneSoapMessage.msgGiaPresente");
  1290.                                 String msg = "(http reply)" + msgDiag.getMessaggio_replaceKeywords("ricezioneSoapMessage.msgGiaPresente");
  1291.                                 if(this.propertiesReader.isMsgGiaInProcessamentoUseLock()) {
  1292.                                     msgConnectionReply._deleteMessageWithLock(msg,this.propertiesReader.getMsgGiaInProcessamentoAttesaAttiva(),
  1293.                                             this.propertiesReader.getMsgGiaInProcessamentoCheckInterval());
  1294.                                 }
  1295.                                 else {
  1296.                                     msgConnectionReply.deleteMessageByNow();
  1297.                                 }
  1298.                             }else{
  1299.                                 throw new Exception("Altra copia della Busta ricevuta come risposta nella http reply con id["+bustaConnectionReply.getID()+"] in elaborazione dal modulo "+proprietarioMessaggio);
  1300.                             }
  1301.                         }

  1302.                         msgConnectionReply.registraMessaggio(responseHttpReply,inoltroRisposteMsg.getIdCorrelazioneApplicativa(),
  1303.                                 inoltroRisposteMsg.getIdCorrelazioneApplicativaRisposta());
  1304.                         msgConnectionReply.aggiornaProprietarioMessaggio(InoltroRisposte.ID_MODULO);
  1305.                         msgConnectionReply.aggiornaRiferimentoMessaggio(busta.getID());

  1306.                         repositoryConnectionReply.registraBustaIntoOutBox(busta, this.propertiesReader.getRepositoryIntervalloScadenzaMessaggi());
  1307.                         Integrazione infoIntegrazione = new Integrazione();
  1308.                         repositoryConnectionReply.aggiornaInfoIntegrazioneIntoOutBox(bustaConnectionReply.getID(),infoIntegrazione);

  1309.                     }catch(Exception e){
  1310.                         msgDiag.logErroreGenerico(e,"RegistrazioneRisposta("+bustaConnectionReply.getID()+")");
  1311.                         ejbUtils.rollbackMessage("Salvataggio messaggio nella connection Reply non riuscita.", esito);
  1312.                         openspcoopstate.releaseResource();
  1313.                         esito.setStatoInvocazioneErroreNonGestito(e);
  1314.                         esito.setEsitoInvocazione(false);
  1315.                         return esito;
  1316.                     }
  1317.                     msgDiag.mediumDebug("Ridirezione messaggio a InoltroRisposte...");
  1318.                     try{
  1319.                         ejbUtils.sendToInoltroRisposte(bustaConnectionReply,true,null,msgConnectionReply,null,null,null,true);
  1320.                     }catch(Exception e){
  1321.                         msgDiag.logErroreGenerico(e,"GenericLib.nodeSender.send(InoltroRisposte ID:"+bustaConnectionReply.getID()+")");
  1322.                         ejbUtils.rollbackMessage("Inoltro messaggio ricevuto nella connection Reply non riuscito.", esito);
  1323.                         openspcoopstate.releaseResource();
  1324.                         esito.setStatoInvocazioneErroreNonGestito(e);
  1325.                         esito.setEsitoInvocazione(false);
  1326.                         return esito;
  1327.                     }

  1328.                 }              
  1329.             }
  1330.             else if(responseHttpReply != null ){
  1331.                 // potenziale Fault (inserito dopo il codice soprastante, per fare decriptare il body al MessageSecurity se presente)
  1332.                 if(soapFaultConnectionReply!=null){
  1333.                     msgDiag.addKeyword(CostantiPdD.KEY_SOAP_FAULT, SoapUtils.safe_toString(faultConnectionReplyMessageFactory, soapFaultConnectionReply, this.log));
  1334.                     msgDiag.logPersonalizzato("ricezioneSoapFault");
  1335.                 }
  1336.                 else if(restProblemConnectionReply!=null){
  1337.                     msgDiag.addKeyword(CostantiPdD.KEY_REST_PROBLEM, restProblemConnectionReply.getRaw());
  1338.                     msgDiag.logPersonalizzato("ricezioneRestProblem");
  1339.                 }
  1340.             }


























  1341.             /* ---------- Gestione Transazione Modulo ---------------- */

  1342.             // Aggiorno proprietario
  1343.             msgDiag.mediumDebug("Aggiorno proprietario messaggio ...");
  1344.             msgResponse.aggiornaProprietarioMessaggio(TimerGestoreMessaggi.ID_MODULO);

  1345.             /* -------- Elimino accesso daPdD --------- */
  1346.             msgDiag.mediumDebug("Elimino utilizzo busta dalla PdD ...");
  1347.             repositoryBuste = new RepositoryBuste(openspcoopstate.getStatoRisposta(), false, protocolFactory);
  1348.             if(oneWayVersione11)
  1349.                 repositoryBuste.eliminaBustaStatelessFromOutBox(busta.getID());
  1350.             else
  1351.                 repositoryBuste.eliminaUtilizzoPdDFromOutBox(busta.getID());

  1352.             // messaggio finale
  1353.             msgDiag.addKeyword(CostantiPdD.KEY_TIPO_CONNETTORE, tipoConnector);
  1354.             msgDiag.logPersonalizzato("gestioneConsegnaTerminata");
  1355.            
  1356.             // Commit JDBC
  1357.             msgDiag.mediumDebug("Commit delle operazioni per la gestione della busta...");
  1358.             openspcoopstate.commit();

  1359.             // Aggiornamento cache Messaggio
  1360.             if(msgResponse!=null)
  1361.                 msgResponse.addMessaggiIntoCache_readFromTable(InoltroRisposte.ID_MODULO, "busta da inoltrare");
  1362.             if(msgConnectionReply!=null)
  1363.                 msgConnectionReply.addMessaggiIntoCache_readFromTable(InoltroRisposte.ID_MODULO, "connection http reply");

  1364.             //  Aggiornamento cache proprietario messaggio
  1365.             if(msgResponse!=null)
  1366.                 msgResponse.addProprietariIntoCache_readFromTable(InoltroRisposte.ID_MODULO, "busta da inoltrare",idMessageRequest,functionAsRouter);
  1367.             if(msgConnectionReply!=null)
  1368.                 msgConnectionReply.addProprietariIntoCache_readFromTable(InoltroRisposte.ID_MODULO, "connection http reply",idMessageResponse,functionAsRouter);

  1369.             // Rilascio connessione al DB
  1370.             msgDiag.mediumDebug("Rilascio connessione al database...");
  1371.             openspcoopstate.releaseResource(); // Rilascio Connessione DB

  1372.            
  1373.            
  1374.            
  1375.            
  1376.            
  1377.            
  1378.            
  1379.             /* --------- PostOutResponse --------------- */
  1380.             // Viene fatta qua poiche' ci interessa segnalare la fine della spedizione
  1381.             PostOutResponseContext postOutResponseContext = new PostOutResponseContext(this.log,protocolFactory);
  1382.             postOutResponseContext.setDataElaborazioneMessaggio(DateManager.getDate());
  1383.             if(responseMessage!=null){
  1384.                 postOutResponseContext.setInputResponseMessageSize(responseMessage.getIncomingMessageContentLength());
  1385.                 postOutResponseContext.setOutputResponseMessageSize(responseMessage.getOutgoingMessageContentLength());
  1386.             }
  1387.             postOutResponseContext.setProtocollo(outResponseContext.getProtocollo());
  1388.             postOutResponseContext.setEsito(esitoHandler);
  1389.             postOutResponseContext.setPddContext(pddContext);
  1390.             postOutResponseContext.setIntegrazione(outResponseContext.getIntegrazione());
  1391.             postOutResponseContext.setMessaggio(responseMessage);
  1392.             postOutResponseContext.setTipoPorta(outResponseContext.getTipoPorta());
  1393.             // Invoco handler
  1394.             GestoreHandlers.postOutResponse(postOutResponseContext, msgDiag, this.log);
  1395.            
  1396.            
  1397.            
  1398.            

  1399.             msgDiag.mediumDebug("Lavoro Terminato.");
  1400.             esito.setEsitoInvocazione(true);    
  1401.             esito.setStatoInvocazione(EsitoLib.OK, null);
  1402.             return esito;

  1403.         }catch(Throwable e){
  1404.             this.log.error("ErroreGenerale",e);
  1405.             msgDiag.logErroreGenerico(e, "Generale");

  1406.             ejbUtils.rollbackMessage("ErroreGenerale:"+e.getMessage(), esito);
  1407.             esito.setStatoInvocazioneErroreNonGestito(e);
  1408.             esito.setEsitoInvocazione(false);
  1409.            
  1410.             openspcoopstate.releaseResource();
  1411.            
  1412.             return esito;
  1413.         }
  1414.         finally{
  1415.             try{
  1416.                 if(connectorSender!=null)
  1417.                     connectorSender.disconnect();
  1418.             }catch(Exception e){
  1419.                 try{
  1420.                     if(msgDiag!=null)
  1421.                         msgDiag.logDisconnectError(e, location);
  1422.                 }catch(Exception eDisconnect){
  1423.                     this.log.error("Errore durante la chiusura delle connessione: "+eDisconnect.getMessage(),e);
  1424.                 }
  1425.             }
  1426.             // *** GB ***
  1427.             if(validatoreProtocolConnectionReply!=null){
  1428.                 if(validatoreProtocolConnectionReply.getValidatoreSintattico()!=null){
  1429.                     validatoreProtocolConnectionReply.getValidatoreSintattico().setHeaderSOAP(null);
  1430.                 }
  1431.                 validatoreProtocolConnectionReply.setValidatoreSintattico(null);
  1432.             }
  1433.             validatoreProtocolConnectionReply = null;
  1434.             // *** GB ***
  1435.         }

  1436.     }



  1437.     /**
  1438.      * Ritorna le Proprieta' Message-Security relative alla spedizione della busta
  1439.      *
  1440.      * @return Proprieta' Message-Security relative alla spedizione della busta
  1441.      */
  1442.     private FlowProperties  getFlowProperties(Busta bustaRisposta,
  1443.             ConfigurazionePdDManager configurazionePdDManager, IState state,
  1444.             MsgDiagnostico msgDiag,
  1445.             org.openspcoop2.protocol.sdk.IProtocolFactory<?> protocolFactory,
  1446.             PortaApplicativa paFind,
  1447.             RequestInfo requestInfo)throws DriverConfigurazioneException{

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

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

  1450.         // RispostaOneWay responseFlow della porta applicativa

  1451.         // RispostaSincrona responseFlow della porta applicativa

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

  1454.         // RicevutaRichiestaAsincronaAsimmetrica responseFlow della porta applicativa
  1455.         // RicevutaRispostaAsincronaAsimmetrica (conversioneServizio) responseFlow della porta applicativa

  1456.         FlowProperties flowProperties = new FlowProperties();
  1457.         flowProperties.tipoMessaggio = RuoloMessaggio.RISPOSTA;
  1458.         ProfiloDiCollaborazione profiloCollaborazione = null;

  1459.         try{

  1460.             // Messaggi AD HOC senza profilo: RISCONTRO
  1461.             if(bustaRisposta.getProfiloDiCollaborazione()==null&& bustaRisposta.sizeListaRiscontri()>0){
  1462.                 if(bustaRisposta.getTipoServizioRichiedenteBustaDiServizio()!=null &&
  1463.                         bustaRisposta.getServizioRichiedenteBustaDiServizio()!=null){
  1464.                     PortaApplicativa pa = paFind;
  1465.                     if(pa==null){
  1466.                         IDServizio idServizioPA = IDServizioFactory.getInstance().getIDServizioFromValues(bustaRisposta.getTipoServizioRichiedenteBustaDiServizio(),bustaRisposta.getServizioRichiedenteBustaDiServizio(),
  1467.                                 bustaRisposta.getTipoMittente(),bustaRisposta.getMittente(),
  1468.                                 bustaRisposta.getVersioneServizioRichiedenteBustaDiServizio());
  1469.                         idServizioPA.setAzione(bustaRisposta.getAzioneRichiedenteBustaDiServizio());
  1470.                         pa = getPortaApplicativa(configurazionePdDManager,
  1471.                                 idServizioPA);
  1472.                     }
  1473.                     flowProperties.messageSecurity = configurazionePdDManager.getMessageSecurityForSender(pa);
  1474.                     flowProperties.mtom = configurazionePdDManager.getMTOMProcessorForSender(pa);
  1475.                 }
  1476.             }
  1477.             // Messaggi con profilo OneWay e Sincrono
  1478.             else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(bustaRisposta.getProfiloDiCollaborazione()) ||
  1479.                     org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(bustaRisposta.getProfiloDiCollaborazione())
  1480.             ) {
  1481.                 PortaApplicativa pa = paFind;
  1482.                 if(pa==null){
  1483.                     IDServizio idServizioPA = IDServizioFactory.getInstance().getIDServizioFromValues(bustaRisposta.getTipoServizio(),bustaRisposta.getServizio(),
  1484.                             bustaRisposta.getTipoMittente(),bustaRisposta.getMittente(),
  1485.                             bustaRisposta.getVersioneServizio());
  1486.                     idServizioPA.setAzione(bustaRisposta.getAzione());
  1487.                     pa = getPortaApplicativa(configurazionePdDManager, idServizioPA);
  1488.                 }
  1489.                 flowProperties.messageSecurity = configurazionePdDManager.getMessageSecurityForSender(pa);
  1490.                 flowProperties.mtom = configurazionePdDManager.getMTOMProcessorForSender(pa);
  1491.             }

  1492.             // Profilo Asincrono Simmetrico
  1493.             else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(bustaRisposta.getProfiloDiCollaborazione())) {  

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

  1495.                 //  Ricevuta alla richiesta.
  1496.                 if(profiloCollaborazione.asincrono_isRicevutaRichiesta(bustaRisposta.getRiferimentoMessaggio())){

  1497.                     PortaApplicativa pa = paFind;
  1498.                     if(pa==null){
  1499.                         IDServizio idServizioPA = IDServizioFactory.getInstance().getIDServizioFromValues(bustaRisposta.getTipoServizio(),bustaRisposta.getServizio(),
  1500.                                 bustaRisposta.getTipoMittente(),bustaRisposta.getMittente(),
  1501.                                 bustaRisposta.getVersioneServizio());
  1502.                         idServizioPA.setAzione(bustaRisposta.getAzione());
  1503.                         pa = getPortaApplicativa(configurazionePdDManager, idServizioPA);
  1504.                     }
  1505.                     flowProperties.messageSecurity = configurazionePdDManager.getMessageSecurityForSender(pa);
  1506.                     flowProperties.mtom = configurazionePdDManager.getMTOMProcessorForSender(pa);

  1507.                 }

  1508.                 //  Ricevuta alla risposta.
  1509.                 else if(profiloCollaborazione.asincrono_isRicevutaRisposta(bustaRisposta.getRiferimentoMessaggio())){

  1510.                     RepositoryBuste repository = new RepositoryBuste(state, false,protocolFactory);
  1511.                     Integrazione integrazione = repository.getInfoIntegrazioneFromOutBox(bustaRisposta.getRiferimentoMsgBustaRichiedenteServizio());
  1512.                     IDPortaDelegata idPD = new IDPortaDelegata();
  1513.                     idPD.setNome(integrazione.getNomePorta());
  1514.                     PortaDelegata pd = configurazionePdDManager.getPortaDelegataSafeMethod(idPD, requestInfo);
  1515.                     flowProperties.messageSecurity = configurazionePdDManager.getMessageSecurityForSender(pd);
  1516.                     flowProperties.mtom = configurazionePdDManager.getMTOMProcessorForSender(pd);

  1517.                 }

  1518.             }

  1519.             //  Profilo Asincrono Asimmetrico
  1520.             else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(bustaRisposta.getProfiloDiCollaborazione())) {  

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

  1522.                 //  Ricevuta alla richiesta.
  1523.                 if(profiloCollaborazione.asincrono_isRicevutaRichiesta(bustaRisposta.getRiferimentoMessaggio())){

  1524.                     PortaApplicativa pa = paFind;
  1525.                     if(pa==null){
  1526.                         IDServizio idServizioPA = IDServizioFactory.getInstance().getIDServizioFromValues(bustaRisposta.getTipoServizio(),bustaRisposta.getServizio(),
  1527.                                 bustaRisposta.getTipoMittente(),bustaRisposta.getMittente(),
  1528.                                 bustaRisposta.getVersioneServizio());
  1529.                         idServizioPA.setAzione(bustaRisposta.getAzione());
  1530.                         pa = getPortaApplicativa(configurazionePdDManager, idServizioPA);
  1531.                     }
  1532.                     flowProperties.messageSecurity = configurazionePdDManager.getMessageSecurityForSender(pa);
  1533.                     flowProperties.mtom = configurazionePdDManager.getMTOMProcessorForSender(pa);

  1534.                 }

  1535.                 //  Ricevuta alla risposta.
  1536.                 else if(profiloCollaborazione.asincrono_isRicevutaRisposta(bustaRisposta.getRiferimentoMessaggio())){

  1537.                     PortaApplicativa pa = paFind;
  1538.                     if(pa==null){
  1539.                         // ConversioneServizio.
  1540.                         IDServizio idServizioOriginale = profiloCollaborazione.asincronoAsimmetrico_getDatiConsegnaRisposta(bustaRisposta.getRiferimentoMsgBustaRichiedenteServizio());
  1541.                         IDServizio idServizioPA = IDServizioFactory.getInstance().getIDServizioFromValues(idServizioOriginale.getTipo(),idServizioOriginale.getNome(),
  1542.                                 bustaRisposta.getTipoMittente(),bustaRisposta.getMittente(),
  1543.                                 idServizioOriginale.getVersione());
  1544.                         idServizioPA.setAzione(idServizioOriginale.getAzione());
  1545.                        
  1546.                         pa = getPortaApplicativa(configurazionePdDManager, idServizioPA);
  1547.                     }
  1548.                     flowProperties.messageSecurity = configurazionePdDManager.getMessageSecurityForSender(pa);
  1549.                     flowProperties.mtom = configurazionePdDManager.getMTOMProcessorForSender(pa);

  1550.                 }

  1551.             }

  1552.         }catch(Exception e){
  1553.             msgDiag.logErroreGenerico(e,"LetturaDatiMessageSecurity");
  1554.             this.log.error("Lettura dati MessageSecurity per la spedizione del messaggio di risposta non riuscita",e);
  1555.         }finally{
  1556.             if(profiloCollaborazione!=null)
  1557.                 if (state instanceof StatefulMessage )
  1558.                     ((StatefulMessage)state).closePreparedStatement();
  1559.         }
  1560.        
  1561.         return flowProperties;

  1562.     }
  1563.    
  1564.     private PortaApplicativa getPortaApplicativa(ConfigurazionePdDManager configurazionePdDReader, IDServizio idServizio) throws Exception{
  1565.         List<PortaApplicativa> listPa = configurazionePdDReader.getPorteApplicative(idServizio, false);
  1566.         if(listPa.size()<=0){
  1567.             throw new Exception("Non esiste alcuna porta applicativa indirizzabile tramite il servizio ["+idServizio+"]");
  1568.         }
  1569.         else{
  1570.             if(listPa.size()>1)
  1571.                 throw new Exception("Esiste più di una porta applicativa indirizzabile tramite il servizio ["+idServizio+"]");
  1572.             return listPa.get(0);
  1573.         }
  1574.     }
  1575. }