ConsegnaContenutiApplicativi.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.io.ByteArrayInputStream;
  22. import java.sql.Timestamp;
  23. import java.util.ArrayList;
  24. import java.util.Date;
  25. import java.util.Enumeration;
  26. import java.util.HashMap;
  27. import java.util.Iterator;
  28. import java.util.List;
  29. import java.util.Map;

  30. import javax.xml.soap.SOAPBody;
  31. import javax.xml.soap.SOAPFault;

  32. import org.apache.commons.io.output.NullOutputStream;
  33. import org.openspcoop2.core.config.CorrelazioneApplicativaRisposta;
  34. import org.openspcoop2.core.config.DumpConfigurazione;
  35. import org.openspcoop2.core.config.GestioneErrore;
  36. import org.openspcoop2.core.config.PortaApplicativa;
  37. import org.openspcoop2.core.config.PortaApplicativaServizioApplicativo;
  38. import org.openspcoop2.core.config.PortaDelegata;
  39. import org.openspcoop2.core.config.Proprieta;
  40. import org.openspcoop2.core.config.ResponseCachingConfigurazione;
  41. import org.openspcoop2.core.config.ServizioApplicativo;
  42. import org.openspcoop2.core.config.Trasformazioni;
  43. import org.openspcoop2.core.config.ValidazioneContenutiApplicativi;
  44. import org.openspcoop2.core.config.constants.CostantiConfigurazione;
  45. import org.openspcoop2.core.config.constants.ProprietaProtocolloValore;
  46. import org.openspcoop2.core.config.constants.StatoFunzionalita;
  47. import org.openspcoop2.core.config.constants.TipoBehaviour;
  48. import org.openspcoop2.core.constants.CostantiConnettori;
  49. import org.openspcoop2.core.constants.TipoPdD;
  50. import org.openspcoop2.core.id.IDAccordo;
  51. import org.openspcoop2.core.id.IDPortaApplicativa;
  52. import org.openspcoop2.core.id.IDPortaDelegata;
  53. import org.openspcoop2.core.id.IDServizio;
  54. import org.openspcoop2.core.id.IDServizioApplicativo;
  55. import org.openspcoop2.core.id.IDSoggetto;
  56. import org.openspcoop2.core.registry.driver.IDAccordoFactory;
  57. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  58. import org.openspcoop2.core.transazioni.TransazioneApplicativoServer;
  59. import org.openspcoop2.message.OpenSPCoop2Message;
  60. import org.openspcoop2.message.OpenSPCoop2MessageFactory;
  61. import org.openspcoop2.message.OpenSPCoop2RestJsonMessage;
  62. import org.openspcoop2.message.OpenSPCoop2RestXmlMessage;
  63. import org.openspcoop2.message.OpenSPCoop2SoapMessage;
  64. import org.openspcoop2.message.constants.MessageRole;
  65. import org.openspcoop2.message.constants.MessageType;
  66. import org.openspcoop2.message.constants.ServiceBinding;
  67. import org.openspcoop2.message.exception.ParseException;
  68. import org.openspcoop2.message.soap.SoapUtils;
  69. import org.openspcoop2.message.soap.TunnelSoapUtils;
  70. import org.openspcoop2.message.soap.mtom.MtomXomReference;
  71. import org.openspcoop2.message.utils.MessageUtilities;
  72. import org.openspcoop2.monitor.sdk.transaction.FaseTracciamento;
  73. import org.openspcoop2.pdd.config.ClassNameProperties;
  74. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  75. import org.openspcoop2.pdd.config.ForwardProxy;
  76. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  77. import org.openspcoop2.pdd.config.RichiestaApplicativa;
  78. import org.openspcoop2.pdd.config.RichiestaDelegata;
  79. import org.openspcoop2.pdd.config.dynamic.PddPluginLoader;
  80. import org.openspcoop2.pdd.core.AbstractCore;
  81. import org.openspcoop2.pdd.core.CostantiPdD;
  82. import org.openspcoop2.pdd.core.EJBUtils;
  83. import org.openspcoop2.pdd.core.EJBUtilsException;
  84. import org.openspcoop2.pdd.core.GestoreCorrelazioneApplicativa;
  85. import org.openspcoop2.pdd.core.GestoreCorrelazioneApplicativaConfig;
  86. import org.openspcoop2.pdd.core.GestoreMessaggi;
  87. import org.openspcoop2.pdd.core.IntegrationContext;
  88. import org.openspcoop2.pdd.core.LocalForwardEngine;
  89. import org.openspcoop2.pdd.core.LocalForwardException;
  90. import org.openspcoop2.pdd.core.LocalForwardParameter;
  91. import org.openspcoop2.pdd.core.PdDContext;
  92. import org.openspcoop2.pdd.core.ProtocolContext;
  93. import org.openspcoop2.pdd.core.ValidatoreMessaggiApplicativi;
  94. import org.openspcoop2.pdd.core.ValidatoreMessaggiApplicativiException;
  95. import org.openspcoop2.pdd.core.ValidatoreMessaggiApplicativiRest;
  96. import org.openspcoop2.pdd.core.behaviour.BehaviourForwardToConfiguration;
  97. import org.openspcoop2.pdd.core.behaviour.BehaviourLoadBalancer;
  98. import org.openspcoop2.pdd.core.behaviour.built_in.multi_deliver.ConfigurazioneGestioneConsegnaNotifiche;
  99. import org.openspcoop2.pdd.core.behaviour.built_in.multi_deliver.MessaggioDaNotificare;
  100. import org.openspcoop2.pdd.core.connettori.ConnettoreBase;
  101. import org.openspcoop2.pdd.core.connettori.ConnettoreBaseHTTP;
  102. import org.openspcoop2.pdd.core.connettori.ConnettoreException;
  103. import org.openspcoop2.pdd.core.connettori.ConnettoreMsg;
  104. import org.openspcoop2.pdd.core.connettori.ConnettoreUtils;
  105. import org.openspcoop2.pdd.core.connettori.GestoreErroreConnettore;
  106. import org.openspcoop2.pdd.core.connettori.IConnettore;
  107. import org.openspcoop2.pdd.core.connettori.InfoConnettoreUscita;
  108. import org.openspcoop2.pdd.core.connettori.RepositoryConnettori;
  109. import org.openspcoop2.pdd.core.controllo_traffico.ConnettoreUtilities;
  110. import org.openspcoop2.pdd.core.controllo_traffico.DatiTempiRisposta;
  111. import org.openspcoop2.pdd.core.handlers.GestoreHandlers;
  112. import org.openspcoop2.pdd.core.handlers.HandlerException;
  113. import org.openspcoop2.pdd.core.handlers.InResponseContext;
  114. import org.openspcoop2.pdd.core.handlers.OutRequestContext;
  115. import org.openspcoop2.pdd.core.integrazione.HeaderIntegrazione;
  116. import org.openspcoop2.pdd.core.integrazione.IGestoreIntegrazionePA;
  117. import org.openspcoop2.pdd.core.integrazione.IGestoreIntegrazionePASoap;
  118. import org.openspcoop2.pdd.core.integrazione.InResponsePAMessage;
  119. import org.openspcoop2.pdd.core.integrazione.OutRequestPAMessage;
  120. import org.openspcoop2.pdd.core.state.IOpenSPCoopState;
  121. import org.openspcoop2.pdd.core.state.OpenSPCoopStateDBManager;
  122. import org.openspcoop2.pdd.core.state.OpenSPCoopStateException;
  123. import org.openspcoop2.pdd.core.state.OpenSPCoopStateful;
  124. import org.openspcoop2.pdd.core.state.OpenSPCoopStateless;
  125. import org.openspcoop2.pdd.core.token.TokenForward;
  126. import org.openspcoop2.pdd.core.transazioni.GestoreConsegnaMultipla;
  127. import org.openspcoop2.pdd.core.transazioni.Transaction;
  128. import org.openspcoop2.pdd.core.transazioni.TransactionContext;
  129. import org.openspcoop2.pdd.core.trasformazioni.GestoreTrasformazioni;
  130. import org.openspcoop2.pdd.core.trasformazioni.GestoreTrasformazioniException;
  131. import org.openspcoop2.pdd.core.trasformazioni.GestoreTrasformazioniUtilities;
  132. import org.openspcoop2.pdd.logger.DiagnosticInputStream;
  133. import org.openspcoop2.pdd.logger.Dump;
  134. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  135. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  136. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  137. import org.openspcoop2.pdd.logger.transazioni.InformazioniTransazione;
  138. import org.openspcoop2.pdd.logger.transazioni.TracciamentoManager;
  139. import org.openspcoop2.pdd.services.DirectVMProtocolInfo;
  140. import org.openspcoop2.pdd.services.ServicesUtils;
  141. import org.openspcoop2.pdd.services.error.RicezioneBusteExternalErrorGenerator;
  142. import org.openspcoop2.pdd.timers.TimerGestoreMessaggi;
  143. import org.openspcoop2.protocol.basic.builder.EsitoBuilder;
  144. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  145. import org.openspcoop2.protocol.engine.constants.Costanti;
  146. import org.openspcoop2.protocol.engine.driver.ConsegnaInOrdine;
  147. import org.openspcoop2.protocol.engine.validator.ValidazioneSintattica;
  148. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  149. import org.openspcoop2.protocol.sdk.Busta;
  150. import org.openspcoop2.protocol.sdk.Context;
  151. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  152. import org.openspcoop2.protocol.sdk.ProtocolException;
  153. import org.openspcoop2.protocol.sdk.Riscontro;
  154. import org.openspcoop2.protocol.sdk.builder.ProprietaManifestAttachments;
  155. import org.openspcoop2.protocol.sdk.config.IProtocolVersionManager;
  156. import org.openspcoop2.protocol.sdk.constants.CodiceErroreIntegrazione;
  157. import org.openspcoop2.protocol.sdk.constants.ErroreIntegrazione;
  158. import org.openspcoop2.protocol.sdk.constants.ErroriIntegrazione;
  159. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  160. import org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione;
  161. import org.openspcoop2.protocol.sdk.constants.RuoloMessaggio;
  162. import org.openspcoop2.protocol.sdk.constants.TipoOraRegistrazione;
  163. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  164. import org.openspcoop2.protocol.utils.EsitiProperties;
  165. import org.openspcoop2.utils.LimitExceededIOException;
  166. import org.openspcoop2.utils.LimitedInputStream;
  167. import org.openspcoop2.utils.MapKey;
  168. import org.openspcoop2.utils.TimeoutIOException;
  169. import org.openspcoop2.utils.TimeoutInputStream;
  170. import org.openspcoop2.utils.Utilities;
  171. import org.openspcoop2.utils.date.DateManager;
  172. import org.openspcoop2.utils.io.Base64Utilities;
  173. import org.openspcoop2.utils.io.notifier.NotifierInputStreamParams;
  174. import org.openspcoop2.utils.rest.problem.JsonDeserializer;
  175. import org.openspcoop2.utils.rest.problem.ProblemConstants;
  176. import org.openspcoop2.utils.rest.problem.ProblemRFC7807;
  177. import org.openspcoop2.utils.rest.problem.XmlDeserializer;
  178. import org.openspcoop2.utils.transport.TransportRequestContext;
  179. import org.openspcoop2.utils.transport.TransportResponseContext;
  180. import org.openspcoop2.utils.transport.TransportUtils;
  181. import org.openspcoop2.utils.transport.http.HttpRequestMethod;
  182. import org.slf4j.Logger;
  183. import org.w3c.dom.Node;

  184. /**
  185.  * Contiene la libreria ConsegnaContenutiApplicativi
  186.  *
  187.  * @author Poli Andrea (apoli@link.it)
  188.  * @author Tronci Fabio (tronci@link.it)
  189.  * @author Tommaso Burlon (tommaso.burlon@link.it)
  190.  * @author $Author$
  191.  * @version $Rev$, $Date$
  192.  *
  193.  */
  194. public class ConsegnaContenutiApplicativi extends GenericLib {

  195.     public static final String ID_MODULO = "ConsegnaContenutiApplicativi";

  196.     public ConsegnaContenutiApplicativi(Logger log) throws GenericLibException {
  197.         super(ConsegnaContenutiApplicativi.ID_MODULO, log);
  198.         inizializza();
  199.     }

  200.     @Override
  201.     protected synchronized void inizializza() throws GenericLibException {
  202.         super.inizializza();
  203.         ConsegnaContenutiApplicativi.initializeService(ClassNameProperties.getInstance(), this.propertiesReader);
  204.     }


  205.     /** IGestoreIntegrazionePA: lista di gestori, ordinati per priorita' minore */
  206.     public static String[] defaultGestoriIntegrazionePA = null;
  207.     private static java.util.concurrent.ConcurrentHashMap<String, String[]> defaultPerProtocolloGestoreIntegrazionePA = null;
  208.    
  209.     /** Indicazione se sono state inizializzate le variabili del servizio */
  210.     public static boolean initializeService = false;

  211.     /**
  212.      * Inizializzatore del servizio ConsegnaContenutiApplicativi
  213.      *
  214.      * @throws Exception
  215.      */
  216.     public static synchronized void initializeService(ClassNameProperties className,OpenSPCoop2Properties propertiesReader) {

  217.         if(ConsegnaContenutiApplicativi.initializeService)
  218.             return;

  219.         boolean error = false;
  220.         Logger logCore = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
  221.         PddPluginLoader pluginLoader = PddPluginLoader.getInstance();
  222.        
  223.         // Inizializzo IGestoreIntegrazionePA list
  224.         ConsegnaContenutiApplicativi.defaultGestoriIntegrazionePA = propertiesReader.getTipoIntegrazionePA();
  225.         for(int i=0; i<ConsegnaContenutiApplicativi.defaultGestoriIntegrazionePA.length; i++){
  226.             try{
  227.                 IGestoreIntegrazionePA gestore = pluginLoader.newIntegrazionePortaApplicativa(ConsegnaContenutiApplicativi.defaultGestoriIntegrazionePA[i]);
  228.                 gestore.toString();
  229.                 logCore.info("Inizializzazione gestore dati di integrazione per le erogazioni di tipo "+
  230.                         ConsegnaContenutiApplicativi.defaultGestoriIntegrazionePA[i]+" effettuata.");
  231.             }catch(Exception e){
  232.                 logCore.error(e.getMessage(),e);
  233.                 error = true;
  234.             }
  235.         }
  236.        
  237.         // Inizializzo IGestoreIntegrazionePA per protocollo
  238.         ConsegnaContenutiApplicativi.defaultPerProtocolloGestoreIntegrazionePA = new java.util.concurrent.ConcurrentHashMap<String, String[]>();
  239.         try{
  240.             Enumeration<String> enumProtocols = ProtocolFactoryManager.getInstance().getProtocolNames();
  241.             while (enumProtocols.hasMoreElements()) {
  242.                 String protocol = (String) enumProtocols.nextElement();
  243.                 String [] tipiIntegrazionePA = propertiesReader.getTipoIntegrazionePA(protocol);
  244.                 if(tipiIntegrazionePA!=null && tipiIntegrazionePA.length>0){
  245.                     List<String> tipiIntegrazionePerProtocollo = new ArrayList<>();
  246.                     for (int i = 0; i < tipiIntegrazionePA.length; i++) {
  247.                         try {
  248.                             IGestoreIntegrazionePA gestore =  pluginLoader.newIntegrazionePortaApplicativa(tipiIntegrazionePA[i]);
  249.                             gestore.toString();
  250.                             tipiIntegrazionePerProtocollo.add(tipiIntegrazionePA[i]);
  251.                             logCore.info("Inizializzazione gestore dati di integrazione (protocollo: "+protocol+") per le erogazioni di tipo "+
  252.                                     tipiIntegrazionePA[i]+" effettuata.");
  253.                         } catch (Exception e) {
  254.                             logCore.error(e.getMessage(),e);
  255.                             error = true;
  256.                         }
  257.                     }
  258.                     if(tipiIntegrazionePerProtocollo.size()>0){
  259.                         ConsegnaContenutiApplicativi.defaultPerProtocolloGestoreIntegrazionePA.put(protocol, tipiIntegrazionePerProtocollo.toArray(new String[1]));
  260.                     }
  261.                 }
  262.             }
  263.         }catch(Exception e){
  264.             logCore.error(
  265.                     "Riscontrato errore durante l'inizializzazione dei tipi di integrazione per protocollo: "+e.getMessage(),e);
  266.             error = true;
  267.         }
  268.        
  269.        

  270.         ConsegnaContenutiApplicativi.initializeService = !error;
  271.     }




  272.     /**
  273.      * Attivato,  quando viene ricevuto sulla coda associata al mdb (coda RequestIN_Soap)
  274.      * un messaggio JMS. Questo metodo implementa la logica del modulo ConsegnaContenutiApplicativi
  275.      * dell'infrastruttura OpenSPCoop.
  276.      *
  277.      */
  278.     @Override
  279.     public EsitoLib _onMessage(IOpenSPCoopState openspcoopstate,
  280.             RegistroServiziManager registroServiziManager,ConfigurazionePdDManager configurazionePdDManager,
  281.             MsgDiagnostico msgDiag) throws OpenSPCoopStateException {
  282.        
  283.         ConsegnaContenutiApplicativiMessage consegnaContenutiApplicativiMsg = (ConsegnaContenutiApplicativiMessage) openspcoopstate.getMessageLib();
  284.        
  285.         if(consegnaContenutiApplicativiMsg==null) {
  286.             throw new OpenSPCoopStateException("ConsegnaContenutiApplicativiMessage is null");
  287.         }
  288.        
  289.         IDPortaApplicativa idApplicativa = null;
  290.         if(consegnaContenutiApplicativiMsg.getRichiestaApplicativa()!=null) {
  291.             idApplicativa = consegnaContenutiApplicativiMsg.getRichiestaApplicativa().getIdPortaApplicativa();
  292.         }
  293.        
  294.         OpenSPCoopStateDBManager dbManagerSource = OpenSPCoopStateDBManager.runtime;
  295.        
  296.         // Costruisco eventuale oggetto TransazioneServerApplicativo
  297.         TransazioneApplicativoServer transazioneApplicativoServer = null;
  298.         ConsegnaContenutiApplicativiBehaviourMessage behaviourConsegna = consegnaContenutiApplicativiMsg.getBehaviour();
  299.         Date oraRegistrazione = null;
  300.         if(behaviourConsegna!=null && behaviourConsegna.getIdTransazioneApplicativoServer()!=null) {
  301.             transazioneApplicativoServer = new TransazioneApplicativoServer();
  302.             transazioneApplicativoServer.setIdTransazione(behaviourConsegna.getIdTransazioneApplicativoServer().getIdTransazione());
  303.             transazioneApplicativoServer.setServizioApplicativoErogatore(behaviourConsegna.getIdTransazioneApplicativoServer().getServizioApplicativoErogatore());
  304.             transazioneApplicativoServer.setConnettoreNome(behaviourConsegna.getIdTransazioneApplicativoServer().getConnettoreNome());
  305.             if(behaviourConsegna.getOraRegistrazioneTransazioneApplicativoServer()!=null) {
  306.                 transazioneApplicativoServer.setDataRegistrazione(behaviourConsegna.getOraRegistrazioneTransazioneApplicativoServer());
  307.                 oraRegistrazione = behaviourConsegna.getOraRegistrazioneTransazioneApplicativoServer();
  308.             }
  309.             else {
  310.                 transazioneApplicativoServer.setDataRegistrazione(DateManager.getDate());
  311.             }
  312.             String protocol = (String) consegnaContenutiApplicativiMsg.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME);
  313.             transazioneApplicativoServer.setProtocollo(protocol);
  314.             transazioneApplicativoServer.setDataAccettazioneRichiesta(DateManager.getDate());
  315.             transazioneApplicativoServer.setIdentificativoMessaggio(consegnaContenutiApplicativiMsg.getBusta().getID());
  316.             transazioneApplicativoServer.setConsegnaTrasparente(true);
  317.            
  318.             msgDiag.setTransazioneApplicativoServer(transazioneApplicativoServer, idApplicativa);
  319.            
  320.             dbManagerSource = OpenSPCoopStateDBManager.consegnePreseInCarico;
  321.         }
  322.         BehaviourLoadBalancer loadBalancer = null;
  323.         if(consegnaContenutiApplicativiMsg!=null && consegnaContenutiApplicativiMsg.getLoadBalancer()!=null) {
  324.             loadBalancer = consegnaContenutiApplicativiMsg.getLoadBalancer();
  325.         }
  326.        
  327.         EsitoLib esitoLib = null;
  328.         try {
  329.             if(loadBalancer!=null) {
  330.                 try {
  331.                     loadBalancer.getLoadBalancerPool().addActiveConnection(loadBalancer.getConnectorName());
  332.                 }catch(Throwable t) {
  333.                     String prefix = "";
  334.                     if(transazioneApplicativoServer!=null) {
  335.                         prefix = "["+transazioneApplicativoServer.getIdTransazione()+"]["+transazioneApplicativoServer.getServizioApplicativoErogatore()+"] " ;
  336.                     }
  337.                     this.log.error(prefix+"Errore durante il salvataggio delle informazioni di load balancer: "+t.getMessage(),t);
  338.                 }
  339.             }
  340.             esitoLib = this.engine_onMessage(openspcoopstate, dbManagerSource,
  341.                     registroServiziManager, configurazionePdDManager, msgDiag, transazioneApplicativoServer, oraRegistrazione);
  342.         }finally {
  343.             if(loadBalancer!=null) {
  344.                 try {
  345.                     loadBalancer.getLoadBalancerPool().removeActiveConnection(loadBalancer.getConnectorName());
  346.                 }catch(Throwable t) {
  347.                     String prefix = "";
  348.                     if(transazioneApplicativoServer!=null) {
  349.                         prefix = "["+transazioneApplicativoServer.getIdTransazione()+"]["+transazioneApplicativoServer.getServizioApplicativoErogatore()+"] " ;
  350.                     }
  351.                     this.log.error(prefix+"Errore durante il salvataggio delle informazioni di load balancer: "+t.getMessage(),t);
  352.                 }
  353.                 try {
  354.                     boolean erroreUtilizzoConnettore = false;
  355.                     if(consegnaContenutiApplicativiMsg.getPddContext()!=null){
  356.                         Object o = consegnaContenutiApplicativiMsg.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.ERRORE_UTILIZZO_CONNETTORE);
  357.                         if(o!=null && (o instanceof Boolean)){
  358.                             erroreUtilizzoConnettore = (Boolean) o;
  359.                         }
  360.                     }
  361.                     if(erroreUtilizzoConnettore) {
  362.                         loadBalancer.getLoadBalancerPool().registerConnectionError(loadBalancer.getConnectorName());
  363.                     }
  364.                 }catch(Throwable t) {
  365.                     String prefix = "";
  366.                     if(transazioneApplicativoServer!=null) {
  367.                         prefix = "["+transazioneApplicativoServer.getIdTransazione()+"]["+transazioneApplicativoServer.getServizioApplicativoErogatore()+"] " ;
  368.                     }
  369.                     this.log.error(prefix+"Errore durante il salvataggio delle informazioni di load balancer (register error connection): "+t.getMessage(),t);
  370.                 }
  371.             }
  372.         }
  373.                
  374.         if(transazioneApplicativoServer!=null) {
  375.            
  376.             if(EsitoLib.OK != esitoLib.getStatoInvocazione()) {
  377.                 if(esitoLib.getMotivazioneErroreNonGestito()!=null && !"".equals(esitoLib.getMotivazioneErroreNonGestito())) {
  378.                     transazioneApplicativoServer.setUltimoErrore(esitoLib.getMotivazioneErroreNonGestito());
  379.                 }
  380.                 else if(esitoLib.getErroreNonGestito()!=null) {
  381.                     Throwable e = Utilities.getInnerNotEmptyMessageException(esitoLib.getErroreNonGestito());
  382.                     if(e!=null) {
  383.                         transazioneApplicativoServer.setUltimoErrore(e.getMessage());
  384.                     }
  385.                     else {
  386.                         transazioneApplicativoServer.setUltimoErrore(esitoLib.getErroreNonGestito().toString());
  387.                     }
  388.                 }
  389.                 else {
  390.                     transazioneApplicativoServer.setUltimoErrore("Errore Generico durante il processamento del messaggio");
  391.                 }
  392.             }
  393.            
  394.             if(consegnaContenutiApplicativiMsg!=null && consegnaContenutiApplicativiMsg.getPddContext()!=null) {
  395.                 Object o = consegnaContenutiApplicativiMsg.getPddContext().get(DiagnosticInputStream.DIAGNOSTIC_INPUT_STREAM_RESPONSE_COMPLETE_DATE);
  396.                 if(o==null) {
  397.                     o = consegnaContenutiApplicativiMsg.getPddContext().get(DiagnosticInputStream.DIAGNOSTIC_INPUT_STREAM_RESPONSE_ERROR_DATE);
  398.                 }
  399.                 if(o!=null && o instanceof Date) {
  400.                     Date d = (Date) o;
  401.                     transazioneApplicativoServer.setDataIngressoRispostaStream(d);
  402.                 }
  403.             }
  404.            
  405.             try {
  406.                 RequestInfo requestInfo = null;
  407.                 Context context = null;
  408.                 if(consegnaContenutiApplicativiMsg!=null) {
  409.                     context = consegnaContenutiApplicativiMsg.getPddContext();
  410.                     if(context!=null && context.containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
  411.                         requestInfo = (RequestInfo) context.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  412.                     }
  413.                 }
  414.                 GestoreConsegnaMultipla.getInstance().safeUpdateConsegna(transazioneApplicativoServer, idApplicativa, openspcoopstate, requestInfo, context);
  415.             }catch(Throwable t) {
  416.                 this.log.error("["+transazioneApplicativoServer.getIdTransazione()+"]["+transazioneApplicativoServer.getServizioApplicativoErogatore()+"] Errore durante il salvataggio delle informazioni relative al servizio applicativo: "+t.getMessage(),t);
  417.             }
  418.         }
  419.        
  420.         return esitoLib;
  421.     }
  422.    
  423.     private EsitoLib engine_onMessage(IOpenSPCoopState openspcoopstate, OpenSPCoopStateDBManager dbManagerSource,
  424.             RegistroServiziManager registroServiziManager,ConfigurazionePdDManager configurazionePdDManager,
  425.             MsgDiagnostico msgDiag,
  426.             TransazioneApplicativoServer transazioneApplicativoServer,
  427.             Date oraRegistrazione) throws OpenSPCoopStateException {

  428.         Date dataConsegna = DateManager.getDate();
  429.        
  430.         EsitoLib esito = new EsitoLib();
  431.        
  432.         if(openspcoopstate==null) {
  433.             if(msgDiag!=null) {
  434.                 msgDiag.logErroreGenerico("openspcoopstate is null", "openspcoopstate.checkNull");
  435.             }
  436.             else {
  437.                 this.log.error("openspcoopstate is null");
  438.             }
  439.             esito.setEsitoInvocazione(false);
  440.             return esito;
  441.         }
  442.        
  443.         ConsegnaContenutiApplicativiMessage consegnaContenutiApplicativiMsg = (ConsegnaContenutiApplicativiMessage) openspcoopstate.getMessageLib();
  444.        
  445.         ConsegnaContenutiApplicativiBehaviourMessage behaviourConsegna = consegnaContenutiApplicativiMsg.getBehaviour();
  446.         String idMessaggioPreBehaviour = null;
  447.         BehaviourForwardToConfiguration behaviourForwardToConfiguration = null;
  448.         GestioneErrore gestioneErroreBehaviour = null;
  449.         if(behaviourConsegna!=null) {
  450.             idMessaggioPreBehaviour = behaviourConsegna.getIdMessaggioPreBehaviour();
  451.             behaviourForwardToConfiguration = behaviourConsegna.getBehaviourForwardToConfiguration();
  452.             gestioneErroreBehaviour = behaviourConsegna.getGestioneErrore();
  453.         }
  454.        
  455.         if(msgDiag==null) {
  456.             if(this.log!=null) {
  457.                 this.log.error("MsgDiagnostico is null");
  458.             }
  459.             openspcoopstate.releaseResource();
  460.             esito.setEsitoInvocazione(false);
  461.             return esito;
  462.         }
  463.        
  464.         /* PddContext */
  465.         PdDContext pddContext = consegnaContenutiApplicativiMsg.getPddContext();
  466.        
  467.         if(pddContext==null) {
  468.             msgDiag.logErroreGenerico("PddContext is null", "PdDContext.checkNull");
  469.             openspcoopstate.releaseResource();
  470.             esito.setEsitoInvocazione(false);
  471.             return esito;
  472.         }
  473.        
  474.         String idTransazione = PdDContext.getValue(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE, pddContext);
  475.                
  476.         RequestInfo requestInfo = (RequestInfo) pddContext.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  477.         boolean requestInfoForMemoryOptimization = false;
  478.         if(pddContext.containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO_IN_MEMORY)) {
  479.             requestInfoForMemoryOptimization = (Boolean) pddContext.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO_IN_MEMORY);
  480.         }
  481.        
  482.         /* Protocol Factory */
  483.         IProtocolFactory<?> protocolFactory = null;
  484.         try{
  485.             protocolFactory = this.protocolFactoryManager.getProtocolFactoryByName((String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME));
  486.         }catch(Exception e){
  487.             msgDiag.logErroreGenerico(e, "ProtocolFactory.instanziazione");
  488.             openspcoopstate.releaseResource();
  489.             esito.setEsitoInvocazione(false);
  490.             esito.setStatoInvocazioneErroreNonGestito(e);
  491.             return esito;
  492.         }
  493.        
  494.         // Transaction
  495.         Transaction transactionNullable = null;
  496.         try{
  497.             transactionNullable = TransactionContext.getTransaction(idTransazione);
  498.         }catch(Exception e){
  499.             // La transazione potrebbe essere stata eliminata nelle comunicazioni stateful
  500. //          msgDiag.logErroreGenerico(e, "getTransaction");
  501. //          openspcoopstate.releaseResource();
  502. //          esito.setEsitoInvocazione(false);
  503. //          esito.setStatoInvocazioneErroreNonGestito(e);
  504. //          return esito;
  505.         }
  506.        
  507.         msgDiag.setPddContext(pddContext, protocolFactory);
  508.         /* ID e tipo di implementazione PdD con cui interoperare */
  509.         String idMessaggioConsegna = openspcoopstate.getIDMessaggioSessione();
  510.         String implementazionePdDMittente = consegnaContenutiApplicativiMsg.getImplementazionePdDSoggettoMittente();
  511.         String implementazionePdDDestinatario = consegnaContenutiApplicativiMsg.getImplementazionePdDSoggettoDestinatario();

  512.         RichiestaApplicativa richiestaApplicativa = consegnaContenutiApplicativiMsg.getRichiestaApplicativa();
  513.         RichiestaDelegata richiestaDelegata = consegnaContenutiApplicativiMsg.getRichiestaDelegata();
  514.         Busta bustaRichiesta = consegnaContenutiApplicativiMsg.getBusta(); // in caso di richiesta delegata serve per il profilo asincrono

  515.         TipoPdD tipoPdD = TipoPdD.APPLICATIVA;
  516.         if(msgDiag.getPorta()==null) {
  517.             if(richiestaApplicativa!=null && richiestaApplicativa.getIdPortaApplicativa()!=null) {
  518.                 msgDiag.updatePorta(tipoPdD, richiestaApplicativa.getIdPortaApplicativa().getNome(), requestInfo);
  519.             }
  520.             else if(richiestaDelegata!=null && richiestaDelegata.getIdPortaDelegata()!=null) {
  521.                 msgDiag.updatePorta(TipoPdD.DELEGATA, richiestaDelegata.getIdPortaDelegata().getNome(), requestInfo);
  522.             }
  523.         }
  524.        
  525.         msgDiag.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI);
  526.         if(bustaRichiesta!=null){
  527.             msgDiag.addKeywords(bustaRichiesta, true);
  528.         }
  529.         String descrizioneBehaviour = "";
  530.         if(bustaRichiesta!=null){
  531.             descrizioneBehaviour = bustaRichiesta.removeProperty(CostantiPdD.KEY_DESCRIZIONE_BEHAVIOUR);
  532.             if(descrizioneBehaviour==null){
  533.                 descrizioneBehaviour = "";
  534.             }
  535.             if(!"".equals(descrizioneBehaviour)){
  536.                 descrizioneBehaviour =  " ("+descrizioneBehaviour+")";
  537.             }
  538.         }
  539.         msgDiag.addKeyword(CostantiPdD.KEY_DESCRIZIONE_BEHAVIOUR, descrizioneBehaviour);
  540.        
  541.         // VM ProtocolInfo (se siamo arrivati da un canale VM)
  542.         // Per il caso di LocalForward (se si mettera il tracciamento)
  543.         if(pddContext!=null && bustaRichiesta!=null)
  544.             DirectVMProtocolInfo.setInfoFromContext(pddContext, bustaRichiesta);
  545.        
  546.         // Dati per GestoreEventi
  547.         String servizio = null;
  548.         String tipoServizio = null;
  549.         String azione = null;
  550.         if(bustaRichiesta!=null){
  551.             servizio = bustaRichiesta.getServizio();
  552.             tipoServizio = bustaRichiesta.getTipoServizio();
  553.             azione = bustaRichiesta.getAzione(); // in caso di richiesta delegata serve per il profilo asincrono
  554.         }
  555.         String idModuloInAttesa = null; // in caso di richiesta delegata serve per il profilo asincrono
  556.         IDSoggetto identitaPdD = null;
  557.         IDSoggetto soggettoFruitore = null;
  558.         String servizioApplicativo = null;
  559.         String scenarioCooperazione = null;
  560.         IDServizio idServizio = null;
  561.         IDAccordo idAccordoServizio = null;
  562.         boolean isRicevutaAsincrona = false;
  563.         String [] tipiIntegrazione = null;
  564.         boolean allegaBody = false;
  565.         boolean scartaBody = false;
  566.         String servizioApplicativoFruitore = null;
  567.         String idCorrelazioneApplicativa = null;
  568.         String idCorrelazioneApplicativaRisposta = null;
  569.         boolean portaDiTipoStateless = false;
  570.         CorrelazioneApplicativaRisposta correlazioneApplicativaRisposta = null;
  571.         boolean gestioneManifest = false;
  572.         ProprietaManifestAttachments proprietaManifestAttachments = this.propertiesReader.getProprietaManifestAttachments(implementazionePdDMittente);
  573.         Trasformazioni trasformazioni = null;

  574.         IDSoggetto soggettoErogatoreServizioHeaderIntegrazione = null;
  575.         IDSoggetto soggettoFruitoreHeaderIntegrazione = null;
  576.         String profiloGestione = null;
  577.        
  578.         DumpConfigurazione dumpConfig = null;
  579.        
  580.         boolean localForward = false;
  581.        
  582.         ResponseCachingConfigurazione responseCachingConfig = null;
  583.        
  584.         IntegrationContext integrationContext = null;
  585.         ProtocolContext protocolContext = null;
  586.        
  587.         if(richiestaApplicativa!=null){
  588.             identitaPdD = richiestaApplicativa.getDominio();
  589.             soggettoFruitore = richiestaApplicativa.getSoggettoFruitore();
  590.             servizioApplicativo = richiestaApplicativa.getServizioApplicativo();
  591.             idModuloInAttesa = richiestaApplicativa.getIdModuloInAttesa();
  592.             scenarioCooperazione = richiestaApplicativa.getScenario();
  593.             isRicevutaAsincrona = richiestaApplicativa.isRicevutaAsincrona();
  594.             idServizio = richiestaApplicativa.getIDServizio();
  595.             if(bustaRichiesta!=null){
  596.                 if(idServizio.getSoggettoErogatore()!=null){
  597.                     if(idServizio.getSoggettoErogatore().getCodicePorta()==null){
  598.                         idServizio.getSoggettoErogatore().setCodicePorta(bustaRichiesta.getIdentificativoPortaDestinatario());
  599.                     }
  600.                 }
  601.             }
  602.             if(azione!=null && !"".equals(azione) && idServizio!=null &&
  603.                     (idServizio.getAzione()==null || "".equals(idServizio.getAzione()))) {
  604.                 idServizio.setAzione(azione);
  605.             }
  606.             idAccordoServizio = richiestaApplicativa.getIdAccordo();
  607.             if(idServizio!=null) {
  608.                 soggettoErogatoreServizioHeaderIntegrazione = idServizio.getSoggettoErogatore();
  609.             }
  610.             profiloGestione = richiestaApplicativa.getProfiloGestione();
  611.             servizioApplicativoFruitore = richiestaApplicativa.getIdentitaServizioApplicativoFruitore();
  612.             idCorrelazioneApplicativa = richiestaApplicativa.getIdCorrelazioneApplicativa();

  613.             localForward = richiestaApplicativa.isLocalForward();
  614.            
  615.             integrationContext = richiestaApplicativa.getIntegrazione();
  616.             protocolContext = richiestaApplicativa.getProtocol();
  617.            
  618.         }else{
  619.             identitaPdD = richiestaDelegata.getDominio();
  620.             soggettoFruitore = richiestaDelegata.getIdSoggettoFruitore();
  621.             servizioApplicativo = richiestaDelegata.getServizioApplicativo();
  622.             idModuloInAttesa = richiestaDelegata.getIdModuloInAttesa();
  623.             scenarioCooperazione = richiestaDelegata.getScenario();
  624.             isRicevutaAsincrona = richiestaDelegata.isRicevutaAsincrona();
  625.             idServizio = richiestaDelegata.getIdServizio();
  626.             if(bustaRichiesta!=null){
  627.                 if(idServizio!=null && idServizio.getSoggettoErogatore()!=null){
  628.                     if(idServizio.getSoggettoErogatore().getCodicePorta()==null){
  629.                         idServizio.getSoggettoErogatore().setCodicePorta(bustaRichiesta.getIdentificativoPortaDestinatario());
  630.                     }
  631.                 }
  632.             }
  633.             if(azione!=null && !"".equals(azione) && idServizio!=null &&
  634.                     (idServizio.getAzione()==null || "".equals(idServizio.getAzione()))) {
  635.                 idServizio.setAzione(azione);
  636.             }
  637.             idAccordoServizio = richiestaDelegata.getIdAccordo();
  638.             if ( bustaRichiesta!=null && Costanti.SCENARIO_ASINCRONO_SIMMETRICO_CONSEGNA_RISPOSTA.equals(scenarioCooperazione) ){
  639.                 soggettoErogatoreServizioHeaderIntegrazione = new IDSoggetto(bustaRichiesta.getTipoDestinatario(),bustaRichiesta.getDestinatario());
  640.                 soggettoFruitoreHeaderIntegrazione = new IDSoggetto(bustaRichiesta.getTipoMittente(),bustaRichiesta.getMittente(), bustaRichiesta.getIdentificativoPortaMittente());
  641.             }else{
  642.                 soggettoErogatoreServizioHeaderIntegrazione = idServizio.getSoggettoErogatore();
  643.             }
  644.             profiloGestione = richiestaDelegata.getProfiloGestione();
  645.             servizioApplicativoFruitore = richiestaDelegata.getServizioApplicativo();
  646.             idCorrelazioneApplicativa = richiestaDelegata.getIdCorrelazioneApplicativa();
  647.            
  648.             integrationContext = richiestaDelegata.getIntegrazione();
  649.             protocolContext = richiestaDelegata.getProtocol();
  650.         }
  651.        
  652.         IDServizio servizioHeaderIntegrazione = null;
  653.         if(bustaRichiesta!=null){
  654.             // Per ricambiare il servizio in correlato per:
  655.             // - AsincronoAsimmetrico, richiestaStato
  656.             // - AsincronoSimmetrico, risposta
  657.             try{
  658.                 servizioHeaderIntegrazione = IDServizioFactory.getInstance().getIDServizioFromValues(bustaRichiesta.getTipoServizio(), bustaRichiesta.getServizio(),
  659.                         soggettoErogatoreServizioHeaderIntegrazione, bustaRichiesta.getVersioneServizio());
  660.                 servizioHeaderIntegrazione.setAzione(bustaRichiesta.getAzione());
  661.             }catch(Exception e){
  662.                 msgDiag.logErroreGenerico(e, "RichiestaApplicativa.getIDServizioFromValues");
  663.                 esito.setEsitoInvocazione(false);
  664.                 esito.setStatoInvocazioneErroreNonGestito(e);
  665.                 return esito;
  666.             }
  667.         }  
  668.        
  669.         IDServizioApplicativo servizioApplicativoToken = null;
  670.         if(pddContext!=null && pddContext.containsKey(org.openspcoop2.core.constants.Costanti.ID_APPLICATIVO_TOKEN)) {
  671.             servizioApplicativoToken = (IDServizioApplicativo) pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_APPLICATIVO_TOKEN);
  672.         }
  673.        
  674.         msgDiag.mediumDebug("Profilo di gestione ["+ConsegnaContenutiApplicativi.ID_MODULO+"] della busta: "+profiloGestione);
  675.         msgDiag.setDominio(identitaPdD);  // imposto anche il dominio nel msgDiag
  676.         msgDiag.setIdCorrelazioneApplicativa(idCorrelazioneApplicativa);
  677.         msgDiag.addKeyword(CostantiPdD.KEY_SA_EROGATORE, servizioApplicativo);
  678.         if(servizioApplicativoFruitore!=null){
  679.             msgDiag.addKeyword(CostantiPdD.KEY_SA_FRUITORE, servizioApplicativoFruitore);
  680.         }
  681.         boolean soggettoVirtuale = false;
  682.         try{
  683.             soggettoVirtuale = configurazionePdDManager.isSoggettoVirtuale( identitaPdD, requestInfo );
  684.         }catch(Exception e){
  685.             msgDiag.logErroreGenerico(e, "isSoggettoVirtuale("+identitaPdD+")");
  686.             esito.setEsitoInvocazione(false);
  687.             esito.setStatoInvocazioneErroreNonGestito(e);
  688.             return esito;
  689.         }
  690.        
  691.         // Aggiornamento Informazioni
  692.         msgDiag.setIdMessaggioRichiesta(idMessaggioConsegna);
  693.         if(idMessaggioPreBehaviour!=null){
  694.             msgDiag.setIdMessaggioRichiesta(idMessaggioPreBehaviour);
  695.             msgDiag.addKeyword(CostantiPdD.KEY_ID_MESSAGGIO_RICHIESTA, idMessaggioPreBehaviour);
  696.         }
  697.         if(soggettoFruitoreHeaderIntegrazione!=null)
  698.             msgDiag.setFruitore(soggettoFruitoreHeaderIntegrazione);
  699.         else
  700.             msgDiag.setFruitore(soggettoFruitore);
  701.         if(servizioHeaderIntegrazione!=null){
  702.             msgDiag.setServizio(servizioHeaderIntegrazione);
  703.         }else{
  704.             msgDiag.setServizio(idServizio);
  705.         }
  706.         if(transazioneApplicativoServer!=null) {
  707.             msgDiag.setServizioApplicativo(servizioApplicativo);
  708.         }

  709.         // Calcolo Profilo di Collaborazione
  710.         msgDiag.mediumDebug("Calcolo profilo di collaborazione...");
  711.         ProfiloDiCollaborazione profiloCollaborazione = EJBUtils.calcolaProfiloCollaborazione(scenarioCooperazione);


  712.         PortaApplicativa pa = null;
  713.         IDPortaApplicativa idPA = null;
  714.         PortaDelegata pd = null;
  715.         IDPortaDelegata idPD = null;
  716.         ServizioApplicativo sa = null;
  717.         if(richiestaApplicativa!=null){
  718.             idPA = richiestaApplicativa.getIdPortaApplicativa();
  719.             try{
  720.                 msgDiag.mediumDebug("getPortaApplicativa...");
  721.                 pa = configurazionePdDManager.getPortaApplicativa(idPA, requestInfo);
  722.             }catch(Exception e){
  723.                 msgDiag.logErroreGenerico(e, "RichiestaApplicativa.getPortaApplicativa");
  724.                 esito.setEsitoInvocazione(false);
  725.                 esito.setStatoInvocazioneErroreNonGestito(e);
  726.                 return esito;
  727.             }
  728.             try{
  729.                 msgDiag.mediumDebug("getServizioApplicativo(pa)...");
  730.                 IDServizioApplicativo idSA = new IDServizioApplicativo();
  731.                 idSA.setNome(richiestaApplicativa.getServizioApplicativo());
  732.                 idSA.setIdSoggettoProprietario(richiestaApplicativa.getIDServizio().getSoggettoErogatore());
  733.                 sa = configurazionePdDManager.getServizioApplicativo(idSA, requestInfo);
  734.             }catch(Exception e){
  735.                 msgDiag.logErroreGenerico(e, "RichiestaApplicativa.getServizioApplicativo");
  736.                 esito.setEsitoInvocazione(false);
  737.                 esito.setStatoInvocazioneErroreNonGestito(e);
  738.                 return esito;
  739.             }
  740.             if(pa!=null)
  741.                 correlazioneApplicativaRisposta = pa.getCorrelazioneApplicativaRisposta();
  742.         }else{
  743.             idPD = richiestaDelegata.getIdPortaDelegata();
  744.             try{
  745.                 msgDiag.mediumDebug("getPortaDelegata...");
  746.                 pd = configurazionePdDManager.getPortaDelegata(idPD, requestInfo);
  747.             }catch(Exception e){
  748.                 msgDiag.logErroreGenerico(e, "RichiestaDelegata.getPortaApplicativa");
  749.                 esito.setEsitoInvocazione(false);
  750.                 esito.setStatoInvocazioneErroreNonGestito(e);
  751.                 return esito;
  752.             }
  753.             try{
  754.                 msgDiag.mediumDebug("getServizioApplicativo(pd)...");
  755.                 IDServizioApplicativo idSA = new IDServizioApplicativo();
  756.                 idSA.setNome(richiestaDelegata.getServizioApplicativo());
  757.                 idSA.setIdSoggettoProprietario(richiestaDelegata.getIdSoggettoFruitore());
  758.                 sa = configurazionePdDManager.getServizioApplicativo(idSA, requestInfo);
  759.             }catch(Exception e){
  760.                 msgDiag.logErroreGenerico(e, "RichiestaDelegata.getServizioApplicativo");
  761.                 esito.setEsitoInvocazione(false);
  762.                 esito.setStatoInvocazioneErroreNonGestito(e);
  763.                 return esito;
  764.             }
  765.             if(pd!=null)
  766.                 correlazioneApplicativaRisposta = pd.getCorrelazioneApplicativaRisposta();
  767.         }


  768.         // Recupero informazioni behaviour
  769.         TipoBehaviour behaviourType = null;
  770.         boolean salvaRispostaPerNotifiche = false;
  771.         MessaggioDaNotificare tipiMessaggiNotificabili = null;
  772.         String identificativoMessaggioDoveSalvareLaRisposta = null;
  773.         MessaggioDaNotificare tipoMessaggioDaNotificare_notificaAsincrona = null;
  774.         boolean transactionContext_notificaAsincrona = false;
  775.         HttpRequestMethod metodoHttpDaNotificare_notificaAsincrona = null;
  776.         String nomeConnettoreMultiplo = null;
  777.         String nomeServizioApplicativoErogatoreConnettoreMultiplo = null;
  778.         String nomeConnettoreAPIImplementation = null;
  779.         String nomeServizioApplicativoErogatoreAPIImplementation = null;
  780.         try{
  781.             if(pa!=null && pa.getBehaviour()!=null) {
  782.                
  783.                 behaviourType = TipoBehaviour.toEnumConstant(pa.getBehaviour().getNome());
  784.                
  785.                 // NomeConnettore
  786.                 if(transazioneApplicativoServer!=null) {
  787.                     for (PortaApplicativaServizioApplicativo pasa : pa.getServizioApplicativoList()) {
  788.                         if(pasa!=null && pasa.getNome()!=null && pasa.getNome().equals(transazioneApplicativoServer.getServizioApplicativoErogatore())) {
  789.                             nomeServizioApplicativoErogatoreConnettoreMultiplo = transazioneApplicativoServer.getServizioApplicativoErogatore();
  790.                             nomeConnettoreMultiplo = pasa.getDatiConnettore()!= null ? pasa.getDatiConnettore().getNome() : null;
  791.                             if(nomeConnettoreMultiplo==null) {
  792.                                 nomeConnettoreMultiplo=CostantiConfigurazione.NOME_CONNETTORE_DEFAULT;
  793.                             }
  794.                             pddContext.addObject(org.openspcoop2.core.constants.Costanti.CONSEGNA_MULTIPLA_NOME_CONNETTORE, nomeConnettoreMultiplo);
  795.                             break;
  796.                         }
  797.                     }
  798.                 }
  799.                 else {
  800.                     for (PortaApplicativaServizioApplicativo pasa : pa.getServizioApplicativoList()) {
  801.                         if(pasa!=null && pasa.getNome()!=null && pasa.getNome().equals(servizioApplicativo)) {
  802.                             nomeServizioApplicativoErogatoreAPIImplementation = servizioApplicativo;
  803.                             nomeConnettoreAPIImplementation = pasa.getDatiConnettore()!= null ? pasa.getDatiConnettore().getNome() : null;
  804.                             if(nomeConnettoreAPIImplementation==null) {
  805.                                 nomeConnettoreAPIImplementation=CostantiConfigurazione.NOME_CONNETTORE_DEFAULT;
  806.                             }
  807.                             pddContext.addObject(org.openspcoop2.core.constants.Costanti.CONSEGNA_MULTIPLA_NOME_CONNETTORE_API, nomeConnettoreAPIImplementation);
  808.                             break;
  809.                         }
  810.                     }
  811.                 }
  812.                
  813.                 if(TipoBehaviour.CONSEGNA_CON_NOTIFICHE.equals(behaviourType)) {
  814.                     if(transazioneApplicativoServer==null) {
  815.                         List<String> serviziApplicativiAbilitatiForwardTo = readServiziApplicativiAbilitatiForwardTo(pddContext);
  816.                         if(serviziApplicativiAbilitatiForwardTo!=null && !serviziApplicativiAbilitatiForwardTo.isEmpty()) {
  817.                             tipiMessaggiNotificabili = org.openspcoop2.pdd.core.behaviour.built_in.multi_deliver.MultiDeliverUtils.readMessaggiNotificabili(pa, serviziApplicativiAbilitatiForwardTo);
  818.                             if(tipiMessaggiNotificabili!=null &&
  819.                                     (
  820.                                             MessaggioDaNotificare.RISPOSTA.equals(tipiMessaggiNotificabili)
  821.                                             ||
  822.                                             MessaggioDaNotificare.ENTRAMBI.equals(tipiMessaggiNotificabili)
  823.                                             )) {
  824.                                 salvaRispostaPerNotifiche = true;
  825.                                 identificativoMessaggioDoveSalvareLaRisposta = CostantiPdD.PREFIX_MESSAGGIO_CONNETTORE_MULTIPLO+0+CostantiPdD.SEPARATOR_MESSAGGIO_CONNETTORE_MULTIPLO+idMessaggioConsegna;
  826.                             }
  827.                            
  828.                             boolean injectTransactionContext = org.openspcoop2.pdd.core.behaviour.built_in.multi_deliver.MultiDeliverUtils.isSaveTransactionContext(pa, serviziApplicativiAbilitatiForwardTo);
  829.                             if(injectTransactionContext) {
  830.                                 if(identificativoMessaggioDoveSalvareLaRisposta==null) {
  831.                                     identificativoMessaggioDoveSalvareLaRisposta = CostantiPdD.PREFIX_MESSAGGIO_CONNETTORE_MULTIPLO+0+CostantiPdD.SEPARATOR_MESSAGGIO_CONNETTORE_MULTIPLO+idMessaggioConsegna;
  832.                                 }
  833.                                 pddContext.addObject(CostantiPdD.SALVA_CONTESTO_IDENTIFICATIVO_MESSAGGIO_NOTIFICA, identificativoMessaggioDoveSalvareLaRisposta);
  834.                             }
  835.                         }
  836.                     }
  837.                     else {
  838.                         for (PortaApplicativaServizioApplicativo pasa : pa.getServizioApplicativoList()) {
  839.                             if(pasa!=null && pasa.getNome()!=null && pasa.getNome().equals(transazioneApplicativoServer.getServizioApplicativoErogatore())) {
  840.                                 ConfigurazioneGestioneConsegnaNotifiche config = org.openspcoop2.pdd.core.behaviour.built_in.multi_deliver.MultiDeliverUtils.read(pasa);
  841.                                 if(config!=null) {
  842.                                     tipoMessaggioDaNotificare_notificaAsincrona = config.getMessaggioDaNotificare();
  843.                                     transactionContext_notificaAsincrona = config.isInjectTransactionSyncContext();
  844.                                     metodoHttpDaNotificare_notificaAsincrona = config.getHttpMethod();
  845.                                 }
  846.                                 if(tipoMessaggioDaNotificare_notificaAsincrona==null) {
  847.                                     tipoMessaggioDaNotificare_notificaAsincrona = MessaggioDaNotificare.RICHIESTA;
  848.                                 }
  849.                                 if(metodoHttpDaNotificare_notificaAsincrona==null &&
  850.                                         (
  851.                                                 MessaggioDaNotificare.RISPOSTA.equals(tipoMessaggioDaNotificare_notificaAsincrona) ||
  852.                                                 MessaggioDaNotificare.ENTRAMBI.equals(tipoMessaggioDaNotificare_notificaAsincrona)
  853.                                         )
  854.                                     ) {
  855.                                     metodoHttpDaNotificare_notificaAsincrona = HttpRequestMethod.POST;
  856.                                 }
  857.                                 break;
  858.                             }
  859.                         }
  860.                     }
  861.                 }
  862.             }
  863.         }catch(Exception e){
  864.             msgDiag.logErroreGenerico(e, "ConfigurazioneBehaviour");
  865.             esito.setEsitoInvocazione(false);
  866.             esito.setStatoInvocazioneErroreNonGestito(e);
  867.             return esito;
  868.         }

  869.         // Recupero anche pd in caso di local forward
  870.         if(localForward && pd==null){
  871.             try{
  872.                 msgDiag.mediumDebug("getPortaDelegata...");
  873.                 pd = configurazionePdDManager.getPortaDelegata(richiestaDelegata.getIdPortaDelegata(), requestInfo);
  874.             }catch(Exception e){
  875.                 msgDiag.logErroreGenerico(e, "RichiestaDelegata.getPortaApplicativa");
  876.                 esito.setEsitoInvocazione(false);
  877.                 esito.setStatoInvocazioneErroreNonGestito(e);
  878.                 return esito;
  879.             }
  880.         }
  881.        


  882.         // La lettura dalla configurazione deve essere dopo il transaction manager
  883.         if(richiestaApplicativa!=null && !localForward){
  884.             try{
  885.                 msgDiag.mediumDebug("isAllegaBody(pa)...");
  886.                 allegaBody = configurazionePdDManager.isAllegaBody(pa);
  887.             }catch(Exception e){
  888.                 msgDiag.logErroreGenerico(e, "RichiestaApplicativa.isAllegaBody");
  889.                 esito.setEsitoInvocazione(false);
  890.                 esito.setStatoInvocazioneErroreNonGestito(e);
  891.                 return esito;
  892.             }  
  893.             try{
  894.                 msgDiag.mediumDebug("isScartaBody(pa)...");
  895.                 scartaBody = configurazionePdDManager.isScartaBody(pa);
  896.             }catch(Exception e){
  897.                 msgDiag.logErroreGenerico(e, "RichiestaApplicativa.isScartaBody");
  898.                 esito.setEsitoInvocazione(false);
  899.                 esito.setStatoInvocazioneErroreNonGestito(e);
  900.                 return esito;
  901.             }  
  902.             try{
  903.                 msgDiag.mediumDebug("getTipiIntegrazione(pa)...");
  904.                 tipiIntegrazione = configurazionePdDManager.getTipiIntegrazione(pa);
  905.             }catch(Exception e){
  906.                 msgDiag.logErroreGenerico(e, "RichiestaApplicativa.getTipiIntegrazione");
  907.                 esito.setEsitoInvocazione(false);
  908.                 esito.setStatoInvocazioneErroreNonGestito(e);
  909.                 return esito;
  910.             }
  911.             try{
  912.                 msgDiag.mediumDebug("isModalitaStateless(pa)...");
  913.                 portaDiTipoStateless = configurazionePdDManager.isModalitaStateless(pa, profiloCollaborazione);
  914.             }catch(Exception e){
  915.                 msgDiag.logErroreGenerico(e, "RichiestaApplicativa.isModalitaStateless("+profiloCollaborazione+")");
  916.                 esito.setEsitoInvocazione(false);
  917.                 esito.setStatoInvocazioneErroreNonGestito(e);
  918.                 return esito;
  919.             }
  920.             try{
  921.                 msgDiag.mediumDebug("isGestioneManifestAttachments(pa)...");
  922.                 gestioneManifest = configurazionePdDManager.isGestioneManifestAttachments(pa,protocolFactory);
  923.             }catch(Exception e){
  924.                 msgDiag.logErroreGenerico(e, "isGestioneManifestAttachments(pa)");
  925.                 esito.setEsitoInvocazione(false);
  926.                 esito.setStatoInvocazioneErroreNonGestito(e);
  927.                 return esito;
  928.             }
  929.             try{
  930.                 msgDiag.mediumDebug("readDumpConfig(pa)...");
  931.                 dumpConfig = configurazionePdDManager.getDumpConfigurazione(pa);
  932.             }catch(Exception e){
  933.                 msgDiag.logErroreGenerico(e, "readDumpConfig(pa)");
  934.                 esito.setEsitoInvocazione(false);
  935.                 esito.setStatoInvocazioneErroreNonGestito(e);
  936.                 return esito;
  937.             }
  938.             try{
  939.                 msgDiag.mediumDebug("readResponseCachingConfig(pa)...");
  940.                 responseCachingConfig = configurazionePdDManager.getConfigurazioneResponseCaching(pa);
  941.             }catch(Exception e){
  942.                 msgDiag.logErroreGenerico(e, "readResponseCachingConfig(pa)");
  943.                 esito.setEsitoInvocazione(false);
  944.                 esito.setStatoInvocazioneErroreNonGestito(e);
  945.                 return esito;
  946.             }
  947.             try{
  948.                 msgDiag.mediumDebug("readTrasformazioni(pa)...");
  949.                 trasformazioni = configurazionePdDManager.getTrasformazioni(pa);
  950.             }catch(Exception e){
  951.                 msgDiag.logErroreGenerico(e, "readTrasformazioni(pa)");
  952.                 esito.setEsitoInvocazione(false);
  953.                 esito.setStatoInvocazioneErroreNonGestito(e);
  954.                 return esito;
  955.             }
  956.            
  957.         }else{
  958.             try{
  959.                 msgDiag.mediumDebug("isAllegaBody(pd)...");
  960.                 allegaBody = configurazionePdDManager.isAllegaBody(pd);
  961.             }catch(Exception e){
  962.                 msgDiag.logErroreGenerico(e, "RichiestaDelegata.isAllegaBody");
  963.                 esito.setEsitoInvocazione(false);
  964.                 esito.setStatoInvocazioneErroreNonGestito(e);
  965.                 return esito;
  966.             }  
  967.             try{
  968.                 msgDiag.mediumDebug("isScartaBody(pd)...");
  969.                 scartaBody = configurazionePdDManager.isScartaBody(pd);
  970.             }catch(Exception e){
  971.                 msgDiag.logErroreGenerico(e, "RichiestaDelegata.isScartaBody");
  972.                 esito.setEsitoInvocazione(false);
  973.                 esito.setStatoInvocazioneErroreNonGestito(e);
  974.                 return esito;
  975.             }  
  976.             try{
  977.                 msgDiag.mediumDebug("getTipiIntegrazione(pd)...");
  978.                 tipiIntegrazione = configurazionePdDManager.getTipiIntegrazione(pd);
  979.             }catch(Exception e){
  980.                 msgDiag.logErroreGenerico(e, "RichiestaDelegata.getTipiIntegrazione");
  981.                 esito.setEsitoInvocazione(false);
  982.                 esito.setStatoInvocazioneErroreNonGestito(e);
  983.                 return esito;
  984.             }
  985.             try{
  986.                 msgDiag.mediumDebug("isModalitaStateless(pd)...");
  987.                 portaDiTipoStateless = configurazionePdDManager.isModalitaStateless(pd, profiloCollaborazione);
  988.             }catch(Exception e){
  989.                 msgDiag.logErroreGenerico(e, "RichiestaDelegata.isModalitaStateless("+profiloCollaborazione+")");
  990.                 esito.setEsitoInvocazione(false);
  991.                 esito.setStatoInvocazioneErroreNonGestito(e);
  992.                 return esito;
  993.             }
  994.             try{
  995.                 msgDiag.mediumDebug("isGestioneManifestAttachments(pd)...");
  996.                 gestioneManifest = configurazionePdDManager.isGestioneManifestAttachments(pd,protocolFactory);
  997.             }catch(Exception e){
  998.                 msgDiag.logErroreGenerico(e, "isGestioneManifestAttachments(pd)");
  999.                 esito.setEsitoInvocazione(false);
  1000.                 esito.setStatoInvocazioneErroreNonGestito(e);
  1001.                 return esito;
  1002.             }
  1003.             try{
  1004.                 msgDiag.mediumDebug("readDumpConfig(pd)...");
  1005.                 dumpConfig = configurazionePdDManager.getDumpConfigurazione(pd);
  1006.             }catch(Exception e){
  1007.                 msgDiag.logErroreGenerico(e, "readDumpConfig(pd)");
  1008.                 esito.setEsitoInvocazione(false);
  1009.                 esito.setStatoInvocazioneErroreNonGestito(e);
  1010.                 return esito;
  1011.             }
  1012.             try{
  1013.                 msgDiag.mediumDebug("readResponseCachingConfig(pd)...");
  1014.                 responseCachingConfig = configurazionePdDManager.getConfigurazioneResponseCaching(pd);
  1015.             }catch(Exception e){
  1016.                 msgDiag.logErroreGenerico(e, "readResponseCachingConfig(pd)");
  1017.                 esito.setEsitoInvocazione(false);
  1018.                 esito.setStatoInvocazioneErroreNonGestito(e);
  1019.                 return esito;
  1020.             }
  1021.             try{
  1022.                 msgDiag.mediumDebug("readTrasformazioni(pd)...");
  1023.                 trasformazioni = configurazionePdDManager.getTrasformazioni(pd);
  1024.             }catch(Exception e){
  1025.                 msgDiag.logErroreGenerico(e, "readTrasformazioni(pd)");
  1026.                 esito.setEsitoInvocazione(false);
  1027.                 esito.setStatoInvocazioneErroreNonGestito(e);
  1028.                 return esito;
  1029.             }
  1030.         }

  1031.         if(idMessaggioPreBehaviour!=null) {
  1032.             portaDiTipoStateless = false;
  1033.         }
  1034.         else if(soggettoVirtuale) {
  1035.             portaDiTipoStateless = false;
  1036.         }
  1037.         pddContext.addObject(org.openspcoop2.core.constants.Costanti.STATELESS, portaDiTipoStateless+"");


  1038.        
  1039.         LocalForwardEngine localForwardEngine = null;
  1040.         LocalForwardParameter localForwardParameter = null;
  1041.         try{
  1042.            
  1043.             if(localForward){
  1044.                
  1045.                 localForwardParameter = new LocalForwardParameter();
  1046.                 localForwardParameter.setLog(this.log);
  1047.                 localForwardParameter.setConfigurazionePdDReader(configurazionePdDManager);
  1048.                 localForwardParameter.setIdCorrelazioneApplicativa(idCorrelazioneApplicativa);
  1049.                 localForwardParameter.setIdentitaPdD(identitaPdD);
  1050.                 localForwardParameter.setIdModulo(this.idModulo);
  1051.                 localForwardParameter.setIdRequest(idMessaggioConsegna);
  1052.                 localForwardParameter.setImplementazionePdDDestinatario(implementazionePdDDestinatario);
  1053.                 localForwardParameter.setImplementazionePdDMittente(implementazionePdDMittente);
  1054.                 localForwardParameter.setIdPdDMittente(registroServiziManager.getIdPortaDominio(soggettoFruitore, null, requestInfo));
  1055.                 localForwardParameter.setIdPdDDestinatario(registroServiziManager.getIdPortaDominio(idServizio.getSoggettoErogatore(), null, requestInfo));
  1056.                 localForwardParameter.setMsgDiag(msgDiag);
  1057.                 localForwardParameter.setOpenspcoopstate(openspcoopstate);
  1058.                 localForwardParameter.setPddContext(pddContext);
  1059.                 localForwardParameter.setProtocolFactory(protocolFactory);
  1060.                 localForwardParameter.setRichiestaDelegata(richiestaDelegata);
  1061.                 localForwardParameter.setRichiestaApplicativa(richiestaApplicativa);
  1062.                 localForwardParameter.setStateless(portaDiTipoStateless);
  1063.                 localForwardParameter.setBusta(bustaRichiesta);
  1064.                
  1065.                 localForwardEngine = new LocalForwardEngine(localForwardParameter);
  1066.             }
  1067.            
  1068.         }catch(Exception e){
  1069.             msgDiag.logErroreGenerico(e, "LocalForwardEngine.init");
  1070.             esito.setEsitoInvocazione(false);
  1071.             esito.setStatoInvocazioneErroreNonGestito(e);
  1072.             return esito;
  1073.         }
  1074.        
  1075.        
  1076.        


  1077.         /* ------------------ Connessione al DB  --------------- */
  1078.         msgDiag.mediumDebug("Richiesta connessione al database per la gestione della richiesta...");
  1079.         openspcoopstate.initResource(identitaPdD, ConsegnaContenutiApplicativi.ID_MODULO,idTransazione,dbManagerSource);
  1080.         registroServiziManager.refreshState(openspcoopstate.getStatoRichiesta(),openspcoopstate.getStatoRisposta());
  1081.         configurazionePdDManager = configurazionePdDManager.refreshState(registroServiziManager);
  1082.         msgDiag.updateState(configurazionePdDManager);
  1083.        


  1084.         /* ----------- Analisi tipo di Consegna Contenuti Applicativi:
  1085.            OneWay (InvocazioneServizio) in modalita asincrona:
  1086.            - Non serve aspettare una risposta applicativa
  1087.            - Non serve generare una risposta (eventuale busta con riscontri e' gia' stata inviata)
  1088.            OneWay (InvocazioneServizio) in modalita sincrona:
  1089.            - Bisogna aspettare una risposta applicativa sincrona
  1090.            - Bisogna solo sbloccare RicezioneBuste non appena ricevuto http 200.
  1091.            Sincrono (InvocazioneServizio):
  1092.            - Bisogna aspettare una risposta applicativa sincrona
  1093.            - Bisogna quindi generare un busta della risposta sincrona
  1094.            AsincronoSimmetrico (InvocazioneServizio):
  1095.            - Non serve aspettare una risposta applicativa se la ricevuta applicativa e' disabilitata
  1096.              altrimenti deve essere aspettata.
  1097.            - Non serve generare una risposta (la ricevuta e' gia' stata inviata) se la ricevuta applicativa e' disabilitata
  1098.              altrimenti bisogna generare un busta contenente la ricevuta
  1099.           AsincronoSimmetrico (ConsegnaRisposta):
  1100.            - Non serve aspettare una risposta applicativa se la ricevuta applicativa e' disabilitata
  1101.              altrimenti deve essere aspettata.
  1102.            - Non serve generare una risposta (la ricevuta e' gia' stata inviata) se la ricevuta applicativa e' disabilitata
  1103.              altrimenti bisogna generare un busta contenente la ricevuta
  1104.            AsincronoAsimmetrico (InvocazioneServizio):
  1105.            - Non serve aspettare una risposta applicativa (sara' poi richiesta con il polling) se la ricevuta applicativa e' disabilitata
  1106.              altrimenti deve essere aspettata.
  1107.            - Non serve generare una risposta (la ricevuta e' gia' stata inviata) se la ricevuta applicativa e' disabilitata
  1108.              altrimenti bisogna generare un busta contenente la ricevuta
  1109.            AsincronoAsimmetrico (Polling):
  1110.            - Bisogna aspettare una risposta applicativa 'sincrona' comunque
  1111.            - Bisogna quindi generare un busta della risposta contenente il risultato del polling
  1112.            ConsegnaContenutiApplicativi:
  1113.            - Non serve aspettare una risposta applicativa
  1114.            - Non serve generare una risposta (e' la parte finale di consegna gia' della risposta)
  1115.            ------------- */
  1116.         boolean existsModuloInAttesaRispostaApplicativa = false;
  1117.         if(idMessaggioPreBehaviour!=null){
  1118.             existsModuloInAttesaRispostaApplicativa = false;
  1119.         }
  1120.         else if(Costanti.SCENARIO_SINCRONO_INVOCAZIONE_SERVIZIO.equals(scenarioCooperazione) ){
  1121.             existsModuloInAttesaRispostaApplicativa = true;
  1122.         }
  1123.         else if(Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_POLLING.equals(scenarioCooperazione)){
  1124.             existsModuloInAttesaRispostaApplicativa = true;
  1125.         }
  1126.         else if (Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_INVOCAZIONE_SERVIZIO.equals(scenarioCooperazione) ||
  1127.                 Costanti.SCENARIO_ASINCRONO_SIMMETRICO_INVOCAZIONE_SERVIZIO.equals(scenarioCooperazione) ||
  1128.                 Costanti.SCENARIO_ASINCRONO_SIMMETRICO_CONSEGNA_RISPOSTA.equals(scenarioCooperazione)){
  1129.             existsModuloInAttesaRispostaApplicativa = portaDiTipoStateless || isRicevutaAsincrona;
  1130.         }
  1131.         else if( (richiestaApplicativa!=null) && Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(richiestaApplicativa.getScenario()) ){
  1132.             existsModuloInAttesaRispostaApplicativa = portaDiTipoStateless;
  1133.         }



  1134.         /* ------------------ Inizializzazione Contesto di gestione della Richiesta --------------- */
  1135.         msgDiag.mediumDebug("Inizializzo contesto per la gestione...");
  1136.         // EJBUtils (per eventuali errori)
  1137.         EJBUtils ejbUtils = null;
  1138.         try{
  1139.             String idMessaggioGestoreMessaggiRichiesta = idMessaggioConsegna;
  1140.             if(idMessaggioPreBehaviour!=null){
  1141.                 idMessaggioGestoreMessaggiRichiesta = bustaRichiesta.getID();
  1142.             }
  1143.             ejbUtils = new EJBUtils(identitaPdD,tipoPdD,ConsegnaContenutiApplicativi.ID_MODULO,idMessaggioConsegna,
  1144.                     idMessaggioGestoreMessaggiRichiesta,Costanti.INBOX,openspcoopstate,msgDiag,false,
  1145.                     consegnaContenutiApplicativiMsg.getImplementazionePdDSoggettoMittente(),
  1146.                     consegnaContenutiApplicativiMsg.getImplementazionePdDSoggettoDestinatario(),
  1147.                     profiloGestione,pddContext
  1148.             );
  1149.             ejbUtils.setServizioApplicativoErogatore(servizioApplicativo);
  1150.         }catch(Exception e){
  1151.             msgDiag.logErroreGenerico(e, "EJBUtils.new");
  1152.             openspcoopstate.releaseResource();
  1153.             esito.setEsitoInvocazione(false);
  1154.             esito.setStatoInvocazioneErroreNonGestito(e);

  1155.             return esito;
  1156.         }
  1157.        
  1158.         // GestoriMessaggio
  1159.         msgDiag.mediumDebug("Inizializzo contesto per la gestione (GestoreMessaggio)...");
  1160.         String idMessaggioGestoreMessaggiRichiesta = idMessaggioConsegna;
  1161.         if(idMessaggioPreBehaviour!=null){
  1162.             idMessaggioGestoreMessaggiRichiesta = bustaRichiesta.getID();
  1163.         }
  1164.         GestoreMessaggi msgRequest = new GestoreMessaggi(openspcoopstate, true, idMessaggioGestoreMessaggiRichiesta,Costanti.INBOX,msgDiag,pddContext);
  1165.         OpenSPCoop2Message consegnaMessagePrimaTrasformazione = null;
  1166.         OpenSPCoop2Message consegnaResponseMessagePrimaTrasformazione = null;
  1167.         Context notificaTransactionContext = null;
  1168.         GestoreMessaggi msgResponse = null;
  1169.         msgRequest.setPortaDiTipoStateless(portaDiTipoStateless);
  1170.        
  1171.         // RequestInfo
  1172.         if(
  1173.                 (requestInfo==null)
  1174.                 ||
  1175.                 (requestInfoForMemoryOptimization)
  1176.                 ||
  1177.                 (idTransazione==null)
  1178.             ) {
  1179.             // devo leggerlo dal messaggio
  1180.             try {
  1181.                 RequestInfo _requestInfoForMemoryOptimization = null;
  1182.                 if(requestInfoForMemoryOptimization) {
  1183.                     _requestInfoForMemoryOptimization = requestInfo;
  1184.                 }

  1185.                 if(transactionContext_notificaAsincrona) {
  1186.                     notificaTransactionContext = msgRequest.getSyncTransactionContext();
  1187.                     if(notificaTransactionContext!=null && !notificaTransactionContext.isEmpty()) {
  1188.                         pddContext.put(CostantiPdD.CONTESTO_RICHIESTA_MESSAGGIO_NOTIFICA, notificaTransactionContext);
  1189.                     }
  1190.                 }
  1191.                
  1192.                 if(tipoMessaggioDaNotificare_notificaAsincrona!=null) {
  1193.                     switch (tipoMessaggioDaNotificare_notificaAsincrona) {
  1194.                     case RICHIESTA:
  1195.                         consegnaMessagePrimaTrasformazione = msgRequest.getMessage();
  1196.                         break;
  1197.                     case RISPOSTA:
  1198.                         consegnaMessagePrimaTrasformazione = msgRequest.getResponseMessage(true, true); //se deve essere consegnata solamente la risposta, questa deve esistere
  1199.                         break;
  1200.                     case ENTRAMBI:
  1201.                         consegnaMessagePrimaTrasformazione = msgRequest.getMessage();
  1202.                         consegnaResponseMessagePrimaTrasformazione = msgRequest.getResponseMessage(false, false); // secondo parametro false perchè la risposta può non esserci (es. vuota o errore di connessione) ma è stato indicato di inviare una notifica
  1203.                         break;
  1204.                     }
  1205.                 }
  1206.                 else {
  1207.                     consegnaMessagePrimaTrasformazione = msgRequest.getMessage();
  1208.                 }
  1209.                 //Devo farlo dopo aver applicato la trasformazione
  1210.                 //correctForwardPathNotifiche(transazioneApplicativoServer, consegnaMessagePrimaTrasformazione, protocolFactory);
  1211.                 if(
  1212.                         (requestInfo==null)
  1213.                         ||
  1214.                         (requestInfoForMemoryOptimization)
  1215.                     ) {
  1216.                     Object o = consegnaMessagePrimaTrasformazione!=null ?
  1217.                             consegnaMessagePrimaTrasformazione.getContextProperty(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)
  1218.                             :
  1219.                             null;
  1220.                     if(o==null) {
  1221.                         throw new Exception("RequestInfo non presente nel contesto");
  1222.                     }
  1223.                     requestInfo = (RequestInfo) o;
  1224.                     pddContext.addObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO,requestInfo);
  1225.                 }
  1226.                 if(idTransazione==null) {
  1227.                     Object o = consegnaMessagePrimaTrasformazione.getContextProperty(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  1228.                     if(o==null) {
  1229.                         throw new Exception("IdTransazione non presente nel contesto");
  1230.                     }
  1231.                     idTransazione = (String) o;
  1232.                     pddContext.addObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE,idTransazione);
  1233.                 }
  1234.                
  1235.                 if(requestInfoForMemoryOptimization && _requestInfoForMemoryOptimization!=null) {
  1236.                     requestInfo.setRequestConfig(_requestInfoForMemoryOptimization.getRequestConfig());
  1237.                     requestInfo.setRequestThreadContext(_requestInfoForMemoryOptimization.getRequestThreadContext());
  1238.                     msgDiag.updateRequestInfo(requestInfo);
  1239.                 }
  1240.                
  1241.             }catch(Exception e) {
  1242.                 msgDiag.logErroreGenerico(e, "LetturaMessaggioErrore (Recupero Dati)");
  1243.                 openspcoopstate.releaseResource();
  1244.                 esito.setEsitoInvocazione(false);
  1245.                 esito.setStatoInvocazioneErroreNonGestito(e);
  1246.                 return esito;
  1247.             }
  1248.         }
  1249.        
  1250.         RicezioneBusteExternalErrorGenerator generatoreErrorePA = null;
  1251.         try{
  1252.             generatoreErrorePA = new RicezioneBusteExternalErrorGenerator(this.log,
  1253.                     this.idModulo, requestInfo, openspcoopstate.getStatoRichiesta());
  1254.             generatoreErrorePA.updateInformazioniCooperazione(soggettoFruitore, idServizio);
  1255.             generatoreErrorePA.updateInformazioniCooperazione(servizioApplicativoFruitore);
  1256.             generatoreErrorePA.updateTipoPdD(TipoPdD.APPLICATIVA);
  1257.             ejbUtils.setGeneratoreErrorePortaApplicativa(generatoreErrorePA);
  1258.         }catch(Exception e){
  1259.             msgDiag.logErroreGenerico(e, "RicezioneBusteExternalErrorGenerator.instanziazione");
  1260.             openspcoopstate.releaseResource();
  1261.             esito.setEsitoInvocazione(false);
  1262.             esito.setStatoInvocazioneErroreNonGestito(e);
  1263.             return esito;
  1264.         }

  1265.         // Oneway versione 11
  1266.         boolean oneWayVersione11 = consegnaContenutiApplicativiMsg.isOneWayVersione11();
  1267.         ejbUtils.setOneWayVersione11(oneWayVersione11);
  1268.         if(idMessaggioPreBehaviour!=null){
  1269.             ejbUtils.setOneWayVersione11(true); // per forzare l'update su db  
  1270.         }
  1271.         msgRequest.setOneWayVersione11(oneWayVersione11);







  1272.         OpenSPCoop2Message responseMessage = null;
  1273.        

  1274.         try{
  1275.             if(msgRequest.isRiconsegnaMessaggio(servizioApplicativo) == false){
  1276.                 openspcoopstate.releaseResource();
  1277.                 // Per i profili 'sincroni' dove vi e' un modulo in attesa non puo' sussistere una riconsegna del messaggio.
  1278.                 if(existsModuloInAttesaRispostaApplicativa==false){
  1279.                     msgDiag.logPersonalizzato("riconsegnaMessaggioPrematura");
  1280.                     esito.setEsitoInvocazione(false);
  1281.                     esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,msgDiag.getMessaggio_replaceKeywords("riconsegnaMessaggioPrematura"));
  1282.                 }else{
  1283.                     String message = null;
  1284.                     String posizione = null;
  1285.                     if( (richiestaApplicativa!=null) && Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(richiestaApplicativa.getScenario())){
  1286.                         message = "Messaggio eliminato durante il controllo di ri-consegna ("+servizioApplicativo+","+scenarioCooperazione+")";
  1287.                         posizione = "msgRequest.isRiconsegnaMessaggio("+servizioApplicativo+","+scenarioCooperazione+")";
  1288.                     }else{
  1289.                         message = "Messaggio eliminato durante il controllo di ri-consegna ("+servizioApplicativo+","+scenarioCooperazione+",STATELESS)";
  1290.                         posizione = "msgRequest.isRiconsegnaMessaggio("+servizioApplicativo+","+scenarioCooperazione+",STATELESS)";
  1291.                     }
  1292.                     msgDiag.logErroreGenerico(message,posizione);
  1293.                     esito.setEsitoInvocazione(true);
  1294.                     esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,message);
  1295.                 }
  1296.                 this.log.info(ConsegnaContenutiApplicativi.ID_MODULO + "Riconsegna messaggio prematura");

  1297.                 return esito;
  1298.             }
  1299.         }catch(Exception e){
  1300.             msgDiag.logErroreGenerico(e, "msgRequest.isRiconsegnaMessaggio("+servizioApplicativo+")");
  1301.             ejbUtils.rollbackMessage("Errore verifica riconsegna messaggio", servizioApplicativo, esito);
  1302.             openspcoopstate.releaseResource();
  1303.             esito.setEsitoInvocazione(false);
  1304.             esito.setStatoInvocazioneErroreNonGestito(e);

  1305.             return esito;
  1306.         }

  1307.         // Funzionalita'
  1308.         ConsegnaInOrdine ordineConsegna = null;

  1309.         // Consegna da effettuare
  1310.         msgDiag.mediumDebug("Inizializzo contesto per la gestione (Consegna)...");
  1311.         ConnettoreMsg connettoreMsg = null;
  1312.         boolean consegnaPerRiferimento = false;
  1313.         boolean rispostaPerRiferimento = false;
  1314.         boolean integrationManager = false;
  1315.         ValidazioneContenutiApplicativi validazioneContenutoApplicativoApplicativo = null;
  1316.         List<Proprieta> proprietaPorta = null;
  1317.         if(Costanti.SCENARIO_CONSEGNA_CONTENUTI_APPLICATIVI.equals(scenarioCooperazione) ||
  1318.                 Costanti.SCENARIO_ASINCRONO_SIMMETRICO_CONSEGNA_RISPOSTA.equals(scenarioCooperazione) ){
  1319.             try{
  1320.                 msgDiag.mediumDebug("Inizializzo contesto per la gestione (getConsegnaRispostaAsincrona) [ConsegnaContenuti/AsincronoSimmetricoRisposta]...");
  1321.                 connettoreMsg = configurazionePdDManager.getConsegnaRispostaAsincrona(sa,richiestaDelegata, requestInfo);
  1322.                 if(Costanti.SCENARIO_CONSEGNA_CONTENUTI_APPLICATIVI.equals(scenarioCooperazione)){
  1323.                     connettoreMsg.setCheckPresenzaHeaderPrimaSbustamento(true);
  1324.                 }
  1325.                 if(connettoreMsg!=null){
  1326.                     connettoreMsg.initPolicyGestioneToken(configurazionePdDManager, requestInfo);
  1327.                 }
  1328.                 msgDiag.mediumDebug("Inizializzo contesto per la gestione (consegnaRispostaAsincronaConGetMessage) [ConsegnaContenuti/AsincronoSimmetricoRisposta]...");
  1329.                 integrationManager = configurazionePdDManager.consegnaRispostaAsincronaConGetMessage(sa);
  1330.                 msgDiag.mediumDebug("Inizializzo contesto per la gestione (getTipoValidazioneContenutoApplicativo) [ConsegnaContenuti/AsincronoSimmetricoRisposta]...");
  1331.                 validazioneContenutoApplicativoApplicativo = configurazionePdDManager.getTipoValidazioneContenutoApplicativo(pd,implementazionePdDMittente, false);
  1332.                 proprietaPorta = pd.getProprietaList();
  1333.                 msgDiag.mediumDebug("Inizializzo contesto per la gestione (consegnaRispostaAsincronaPerRiferimento) [ConsegnaContenuti/AsincronoSimmetricoRisposta]...");
  1334.                 consegnaPerRiferimento = configurazionePdDManager.consegnaRispostaAsincronaPerRiferimento(sa);
  1335.                 msgDiag.mediumDebug("Inizializzo contesto per la gestione (consegnaRispostaAsincronaRispostaPerRiferimento) [ConsegnaContenuti/AsincronoSimmetricoRisposta]...");
  1336.                 rispostaPerRiferimento = configurazionePdDManager.consegnaRispostaAsincronaRispostaPerRiferimento(sa);
  1337.             }catch(Exception e){
  1338.                 msgDiag.logErroreGenerico(e, "ConsegnaAsincrona.getDatiConsegna(sa:"+servizioApplicativo+")");
  1339.                 ejbUtils.rollbackMessage("[ConsegnaAsincrona] Connettore per consegna applicativa non definito:"+e.getMessage(),servizioApplicativo, esito);
  1340.                 esito.setEsitoInvocazione(false);
  1341.                 esito.setStatoInvocazioneErroreNonGestito(e);
  1342.                 return esito;
  1343.             }


  1344.         }
  1345.         else if(Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_POLLING.equals(scenarioCooperazione)){
  1346.             try{
  1347.                 msgDiag.mediumDebug("Inizializzo contesto per la gestione (getConsegnaRispostaAsincrona) [AsincronoAsimmetricoPolling]...");
  1348.                 connettoreMsg = configurazionePdDManager.getConsegnaRispostaAsincrona(sa,richiestaApplicativa, requestInfo);
  1349.                 if(connettoreMsg!=null){
  1350.                     connettoreMsg.initPolicyGestioneToken(configurazionePdDManager, requestInfo);
  1351.                 }
  1352.                 msgDiag.mediumDebug("Inizializzo contesto per la gestione (consegnaRispostaAsincronaConGetMessage) [ConsegnaContenuti/AsincronoSimmetricoRisposta]...");
  1353.                 integrationManager = configurazionePdDManager.consegnaRispostaAsincronaConGetMessage(sa);
  1354.                 msgDiag.mediumDebug("Inizializzo contesto per la gestione (getTipoValidazioneContenutoApplicativo) [AsincronoAsimmetricoPolling]...");
  1355.                 validazioneContenutoApplicativoApplicativo = configurazionePdDManager.getTipoValidazioneContenutoApplicativo(pa,implementazionePdDMittente, false);
  1356.                 proprietaPorta = pa.getProprietaList();
  1357.                 msgDiag.mediumDebug("Inizializzo contesto per la gestione (consegnaRispostaAsincronaPerRiferimento) [AsincronoAsimmetricoPolling]...");
  1358.                 consegnaPerRiferimento = configurazionePdDManager.consegnaRispostaAsincronaPerRiferimento(sa);
  1359.                 msgDiag.mediumDebug("Inizializzo contesto per la gestione (consegnaRispostaAsincronaRispostaPerRiferimento) [AsincronoAsimmetricoPolling]...");
  1360.                 rispostaPerRiferimento = configurazionePdDManager.consegnaRispostaAsincronaRispostaPerRiferimento(sa);
  1361.             }catch(Exception e){
  1362.                 msgDiag.logErroreGenerico(e, "AsincronoSimmetricoPolling.getDatiConsegna(sa:"+servizioApplicativo+")");
  1363.                 ejbUtils.rollbackMessage("[AsincronoSimmetricoPolling] Connettore per consegna applicativa non definito:"+e.getMessage(),servizioApplicativo, esito);
  1364.                 esito.setEsitoInvocazione(false);
  1365.                 esito.setStatoInvocazioneErroreNonGestito(e);
  1366.                 return esito;
  1367.             }
  1368.         }else{
  1369.             try{
  1370.                 msgDiag.mediumDebug("Inizializzo contesto per la gestione (getInvocazioneServizio)...");
  1371.                 connettoreMsg = configurazionePdDManager.getInvocazioneServizio(sa,richiestaApplicativa, requestInfo);
  1372.                 if(connettoreMsg!=null){
  1373.                     connettoreMsg.initPolicyGestioneToken(configurazionePdDManager, requestInfo);
  1374.                 }
  1375.                 msgDiag.mediumDebug("Inizializzo contesto per la gestione (consegnaRispostaAsincronaConGetMessage) [ConsegnaContenuti/AsincronoSimmetricoRisposta]...");
  1376.                 integrationManager = configurazionePdDManager.invocazioneServizioConGetMessage(sa);
  1377.                 msgDiag.mediumDebug("Inizializzo contesto per la gestione (getTipoValidazioneContenutoApplicativo)...");
  1378.                 validazioneContenutoApplicativoApplicativo = configurazionePdDManager.getTipoValidazioneContenutoApplicativo(pa,implementazionePdDMittente, false);
  1379.                 proprietaPorta = pa.getProprietaList();
  1380.                 msgDiag.mediumDebug("Inizializzo contesto per la gestione (invocazioneServizioPerRiferimento)...");
  1381.                 consegnaPerRiferimento = configurazionePdDManager.invocazioneServizioPerRiferimento(sa);
  1382.                 msgDiag.mediumDebug("Inizializzo contesto per la gestione (invocazioneServizioRispostaPerRiferimento)...");
  1383.                 rispostaPerRiferimento = configurazionePdDManager.invocazioneServizioRispostaPerRiferimento(sa);
  1384.             }catch(Exception e){
  1385.                 msgDiag.logErroreGenerico(e, "InvocazioneServizio.getDatiConsegna(sa:"+servizioApplicativo+")");
  1386.                 ejbUtils.rollbackMessage("Connettore per consegna applicativa non definito:"+e.getMessage(),servizioApplicativo, esito);
  1387.                 esito.setEsitoInvocazione(false);
  1388.                 esito.setStatoInvocazioneErroreNonGestito(e);
  1389.                 return esito;
  1390.             }

  1391.         }
  1392.         msgDiag.mediumDebug("Check parametri...");
  1393.         if(connettoreMsg==null){
  1394.             msgDiag.logErroreGenerico("Connettore non definito nella configurazione (is null)", "getDatiConsegna(sa:"+servizioApplicativo+")");
  1395.             ejbUtils.rollbackMessage("Connettore per consegna applicativa non definito per il sa ["+servizioApplicativo+"]",servizioApplicativo, esito);
  1396.             esito.setEsitoInvocazione(false);
  1397.             esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO, "Connettore per consegna applicativa non definito per il sa ["+servizioApplicativo+"]");
  1398.             return esito;
  1399.         }
  1400.         connettoreMsg.setProtocolFactory(protocolFactory);
  1401.         connettoreMsg.setGestioneManifest(gestioneManifest);
  1402.         connettoreMsg.setProprietaManifestAttachments(proprietaManifestAttachments);
  1403.         connettoreMsg.setLocalForward(localForward);
  1404.         if(transazioneApplicativoServer!=null) {
  1405.             transazioneApplicativoServer.setConsegnaIntegrationManager(integrationManager);
  1406.             connettoreMsg.setTransazioneApplicativoServer(transazioneApplicativoServer);
  1407.             connettoreMsg.setIdPortaApplicativa(idPA);
  1408.             connettoreMsg.setDataConsegnaTransazioneApplicativoServer(dataConsegna);
  1409.         }
  1410.         ForwardProxy forwardProxy = null;
  1411.         if(configurazionePdDManager.isForwardProxyEnabled(requestInfo)) {
  1412.             try {
  1413.                 forwardProxy = configurazionePdDManager.getForwardProxyConfigErogazione(identitaPdD, idServizio, null, requestInfo);
  1414.             }catch(Exception e) {
  1415.                 msgDiag.logErroreGenerico(e, "Configurazione ForwardProxy (sa:"+servizioApplicativo+")");
  1416.                 ejbUtils.rollbackMessage("Configurazione del connettore errata per la funzionalità govway-proxy; sa ["+servizioApplicativo+"]",servizioApplicativo, esito);
  1417.                 esito.setEsitoInvocazione(false);
  1418.                 esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO, "Configurazione del connettore errata per la funzionalità govway-proxy; sa ["+servizioApplicativo+"]");
  1419.                 return esito;
  1420.             }
  1421.         }
  1422.         connettoreMsg.setForwardProxy(forwardProxy);
  1423.         connettoreMsg.setIdAccordo(idAccordoServizio);

  1424.         // Identificativo di una risposta.
  1425.         String idMessageResponse = null;
  1426.         if(existsModuloInAttesaRispostaApplicativa){
  1427.             msgDiag.mediumDebug("Creazione id risposta...");
  1428.             try{
  1429.                 org.openspcoop2.protocol.engine.builder.Imbustamento imbustatore =
  1430.                         new org.openspcoop2.protocol.engine.builder.Imbustamento(this.log,protocolFactory,openspcoopstate.getStatoRichiesta());
  1431.                 idMessageResponse =
  1432.                     imbustatore.buildID(identitaPdD,
  1433.                             (String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE),
  1434.                             this.propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  1435.                             this.propertiesReader.getGestioneSerializableDBCheckInterval(),
  1436.                             RuoloMessaggio.RISPOSTA);
  1437.             }catch(Exception e){
  1438.                 msgDiag.logErroreGenerico(e, "imbustatore.buildID(idMessageResponse)");
  1439.                 //if(existsModuloInAttesaRispostaApplicativa) {
  1440.                 try{
  1441.                     this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  1442.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1443.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_507_COSTRUZIONE_IDENTIFICATIVO),
  1444.                             idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  1445.                             (consegnaMessagePrimaTrasformazione!=null ? consegnaMessagePrimaTrasformazione.getParseException() : null),
  1446.                             pddContext);
  1447.                     esito.setEsitoInvocazione(true);
  1448.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO, "imbustatore.buildID(idMessageResponse)");
  1449.                 }catch(Exception sendError){
  1450.                     ejbUtils.rollbackMessage("Creazione id di risposta (sendRispostaApplicativa) fallita", esito);
  1451.                     esito.setStatoInvocazioneErroreNonGestito(sendError);
  1452.                     esito.setEsitoInvocazione(false);
  1453.                 }
  1454.                 //}else{
  1455.                 //  ejbUtils.rollbackMessage("Creazione id di risposta fallita", esito);
  1456.                 //  esito.setStatoInvocazioneErroreNonGestito(e);
  1457.                 //  esito.setEsitoInvocazione(false);
  1458.                 //}
  1459.                 openspcoopstate.releaseResource();

  1460.                 return esito;
  1461.             }

  1462.             // Aggiornamento Informazioni
  1463.             msgDiag.setIdMessaggioRisposta(idMessageResponse);
  1464.             msgDiag.addKeyword(CostantiPdD.KEY_ID_MESSAGGIO_RISPOSTA, idMessageResponse);

  1465.         }


  1466.         msgDiag.mediumDebug("Inizializzo contesto per la gestione (Risposta)...");

  1467.         //  Modalita' gestione risposta (Sincrona/Fault/Ricevute...)
  1468.         // Per i profili diversi dal sincrono e' possibile impostare dove far ritornare l'errore
  1469.         boolean newConnectionForResponse = false;
  1470.         if(Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(scenarioCooperazione)){
  1471.             if( (consegnaContenutiApplicativiMsg.isStateless()==false) &&  (!existsModuloInAttesaRispostaApplicativa) ){
  1472.                 newConnectionForResponse = configurazionePdDManager.newConnectionForResponse();
  1473.             }
  1474.         }else if( (ProfiloDiCollaborazione.SINCRONO.equals(bustaRichiesta.getProfiloDiCollaborazione())==false) &&
  1475.                 (consegnaContenutiApplicativiMsg.isStateless()==false) ){
  1476.             newConnectionForResponse = configurazionePdDManager.newConnectionForResponse();
  1477.         }
  1478.         ejbUtils.setReplyOnNewConnection(newConnectionForResponse);


  1479.         // Gestione indirizzo telematico
  1480.         boolean gestioneIndirizzoTelematico = false;
  1481.         if(consegnaContenutiApplicativiMsg.isStateless()==false){
  1482.             gestioneIndirizzoTelematico = configurazionePdDManager.isUtilizzoIndirizzoTelematico();
  1483.         }
  1484.         ejbUtils.setUtilizzoIndirizzoTelematico(gestioneIndirizzoTelematico);

  1485.         IProtocolVersionManager protocolManager = null;
  1486.         boolean isBlockedTransaction_responseMessageWithTransportCodeError = false;
  1487.         try{
  1488.             protocolManager = protocolFactory.createProtocolVersionManager(profiloGestione);
  1489.             isBlockedTransaction_responseMessageWithTransportCodeError =
  1490.                     protocolManager.isBlockedTransaction_responseMessageWithTransportCodeError();
  1491.         }catch(Exception e){
  1492.             msgDiag.logErroreGenerico(e, "ProtocolFactory.createProtocolManager("+profiloGestione+")");
  1493.             ejbUtils.rollbackMessage("ProtocolFactory.createProtocolManager("+profiloGestione+"):"+e.getMessage(),servizioApplicativo, esito);
  1494.             esito.setEsitoInvocazione(false);
  1495.             esito.setStatoInvocazioneErroreNonGestito(e);
  1496.             return esito;
  1497.         }
  1498.         boolean consegnaInOrdine = false;
  1499.         // Sequenza: deve essere abilitata la consegna affidabile + la collaborazione e infine la consegna in ordine e non deve essere richiesto il profilo linee guida 1.0
  1500.         Busta bustaIndicazioneConsegnaInOrdine = null;
  1501.         if(Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(scenarioCooperazione)){
  1502.            
  1503.             if(bustaRichiesta!=null) {
  1504.                 bustaIndicazioneConsegnaInOrdine = bustaRichiesta.newInstance();
  1505.             }
  1506.             else {
  1507.                 bustaIndicazioneConsegnaInOrdine = new Busta(protocolFactory.getProtocol());
  1508.             }
  1509.             bustaIndicazioneConsegnaInOrdine.setProfiloDiCollaborazione(profiloCollaborazione);
  1510.            
  1511.             switch (protocolManager.getConsegnaInOrdine(bustaIndicazioneConsegnaInOrdine)) {
  1512.             case ABILITATA:
  1513.                 consegnaInOrdine = true;
  1514.                 break;
  1515.             case DISABILITATA:
  1516.                 consegnaInOrdine = false;
  1517.                 break;
  1518.             default:
  1519.                 boolean gestioneConsegnaInOrdineAbilitata =  this.propertiesReader.isGestioneRiscontri(implementazionePdDMittente) &&
  1520.                 this.propertiesReader.isGestioneElementoCollaborazione(implementazionePdDMittente) &&
  1521.                 this.propertiesReader.isGestioneConsegnaInOrdine(implementazionePdDMittente);  
  1522.                 consegnaInOrdine = gestioneConsegnaInOrdineAbilitata &&
  1523.                         bustaRichiesta!=null && bustaRichiesta.getSequenza()!=-1;
  1524.                 break;
  1525.             }
  1526.         }


  1527.        

  1528.         // Punto di inizio per la transazione.
  1529.         IConnettore connectorSenderForDisconnect = null;
  1530.         String location = "";
  1531.         OpenSPCoop2Message consegnaMessageTrasformato = null;
  1532.         long responseContentLength = -1;
  1533.         boolean useResponseForParseException = false;
  1534.         try{        


  1535.             /* ---------------- Check per consegna in ordine ----------------*/
  1536.             if(consegnaInOrdine){
  1537.                 if(oneWayVersione11 || openspcoopstate instanceof OpenSPCoopStateful){
  1538.                     msgDiag.mediumDebug("Controllo consegna in ordine...");
  1539.                     try{
  1540.                         ordineConsegna = new ConsegnaInOrdine(openspcoopstate.getStatoRichiesta(),protocolFactory);
  1541.                         if(ordineConsegna.isConsegnaInOrdine(bustaRichiesta,
  1542.                                 this.propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  1543.                                 this.propertiesReader.getGestioneSerializableDBCheckInterval()) == false){
  1544.                             // congelamento busta
  1545.                             msgDiag.addKeyword(CostantiPdD.KEY_SEQUENZA_ATTESA, ordineConsegna.getSequenzaAttesa()+"");
  1546.                             if(ordineConsegna.getSequenzaAttesa()>bustaRichiesta.getSequenza()){
  1547.                                 msgDiag.logPersonalizzato("consegnaInOrdine.messaggioGiaConsegnato");
  1548.                                 ejbUtils.releaseInboxMessage(true);
  1549.                                 esito.setEsitoInvocazione(true);
  1550.                                 esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,
  1551.                                         msgDiag.getMessaggio_replaceKeywords("consegnaInOrdine.messaggioGiaConsegnato"));
  1552.                             }else{
  1553.                                 msgDiag.logPersonalizzato("consegnaInOrdine.messaggioFuoriOrdine");
  1554.                                 ejbUtils.rollbackMessage(msgDiag.getMessaggio_replaceKeywords("consegnaInOrdine.messaggioFuoriOrdine"), servizioApplicativo, esito);
  1555.                                 esito.setEsitoInvocazione(false);
  1556.                                 esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,
  1557.                                         msgDiag.getMessaggio_replaceKeywords("consegnaInOrdine.messaggioFuoriOrdine"));
  1558.                             }
  1559.                             openspcoopstate.releaseResource();
  1560.                             return esito;
  1561.                         }
  1562.                     }catch(Exception e){
  1563.                         this.log.error("Riscontrato errore durante la gestione della sequenza per la consegna in ordine",e);
  1564.                         msgDiag.logErroreGenerico(e, "GetioneSequenzaInOrdine");
  1565.                         ejbUtils.rollbackMessage("Errore verifica consegna in ordine: "+e.getMessage(), servizioApplicativo, esito);
  1566.                         openspcoopstate.releaseResource();
  1567.                         esito.setEsitoInvocazione(false);
  1568.                         esito.setStatoInvocazioneErroreNonGestito(e);
  1569.                         return esito;
  1570.                     }
  1571.                 }
  1572.             }





  1573.             /* ------------  Ricostruzione Messaggio Soap da spedire ------------- */
  1574.             msgDiag.mediumDebug("Ricostruzione SOAPEnvelope di richiesta/consegna...");
  1575.             try{
  1576.                 if(consegnaMessagePrimaTrasformazione==null) {
  1577.                     if(consegnaPerRiferimento==false){
  1578.                         if(tipoMessaggioDaNotificare_notificaAsincrona!=null) {
  1579.                             switch (tipoMessaggioDaNotificare_notificaAsincrona) {
  1580.                             case RICHIESTA:
  1581.                                 consegnaMessagePrimaTrasformazione = msgRequest.getMessage();
  1582.                                 break;
  1583.                             case RISPOSTA:
  1584.                                 consegnaMessagePrimaTrasformazione = msgRequest.getResponseMessage(true, true);  //se deve essere consegnata solamente la risposta, questa deve esistere
  1585.                                 break;
  1586.                             case ENTRAMBI:
  1587.                                 consegnaMessagePrimaTrasformazione = msgRequest.getMessage();
  1588.                                 consegnaResponseMessagePrimaTrasformazione = msgRequest.getResponseMessage(false, false); // secondo parametro false perchè la risposta può non esserci (es. vuota o errore di connessione) ma è stato indicato di inviare una notifica
  1589.                                 break;
  1590.                             }
  1591.                         }
  1592.                         else {
  1593.                             consegnaMessagePrimaTrasformazione = msgRequest.getMessage();
  1594.                         }
  1595.                         //Devo farlo dopo aver applicato la trasformazione
  1596.                         //correctForwardPathNotifiche(transazioneApplicativoServer, consegnaMessagePrimaTrasformazione, protocolFactory);
  1597.                     }else{
  1598.                         // consegnaMessage deve contenere il messaggio necessario all'invocazione del metodo pubblicaEvento
  1599.                         consegnaMessagePrimaTrasformazione =
  1600.                             msgRequest.buildRichiestaPubblicazioneMessaggio_RepositoryMessaggi(soggettoFruitore, tipoServizio,servizio,azione);
  1601.                     }
  1602.                 }
  1603.             }catch(Exception e){
  1604.                 msgDiag.logErroreGenerico(e, "msgRequest.getMessage()");

  1605.                 if(existsModuloInAttesaRispostaApplicativa) {
  1606.                    
  1607.                     this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  1608.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1609.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_509_READ_REQUEST_MSG),
  1610.                             idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  1611.                             (consegnaMessagePrimaTrasformazione!=null ? consegnaMessagePrimaTrasformazione.getParseException() : null),
  1612.                             pddContext);
  1613.                    
  1614.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO, "msgRequest.getMessage()");
  1615.                     esito.setEsitoInvocazione(true);
  1616.                 }else{
  1617.                     ejbUtils.rollbackMessage("Ricostruzione del messaggio Soap da Spedire non riuscita.",servizioApplicativo, esito);
  1618.                     esito.setStatoInvocazioneErroreNonGestito(e);
  1619.                     esito.setEsitoInvocazione(false);
  1620.                 }
  1621.                 openspcoopstate.releaseResource();

  1622.                 return esito;
  1623.             }



  1624.             /* -----  Header Integrazione ------ */
  1625.             String originalID = bustaRichiesta!=null ? bustaRichiesta.getID() : null;
  1626.             if(idMessaggioPreBehaviour!=null){
  1627.                 bustaRichiesta.setID(idMessaggioPreBehaviour);
  1628.             }
  1629.             msgDiag.mediumDebug("Gestione header di integrazione per la richiesta...");
  1630.             HeaderIntegrazione headerIntegrazione = new HeaderIntegrazione(idTransazione);
  1631.             if(soggettoFruitoreHeaderIntegrazione!=null){
  1632.                 headerIntegrazione.getBusta().setTipoMittente(soggettoFruitoreHeaderIntegrazione.getTipo());
  1633.                 headerIntegrazione.getBusta().setMittente(soggettoFruitoreHeaderIntegrazione.getNome());
  1634.             }else if(soggettoFruitore!=null){
  1635.                 headerIntegrazione.getBusta().setTipoMittente(soggettoFruitore.getTipo());
  1636.                 headerIntegrazione.getBusta().setMittente(soggettoFruitore.getNome());
  1637.             }
  1638.             if(servizioHeaderIntegrazione!=null){
  1639.                 headerIntegrazione.getBusta().setTipoDestinatario(servizioHeaderIntegrazione.getSoggettoErogatore().getTipo());
  1640.                 headerIntegrazione.getBusta().setDestinatario(servizioHeaderIntegrazione.getSoggettoErogatore().getNome());
  1641.                 headerIntegrazione.getBusta().setTipoServizio(servizioHeaderIntegrazione.getTipo());
  1642.                 headerIntegrazione.getBusta().setServizio(servizioHeaderIntegrazione.getNome());
  1643.                 headerIntegrazione.getBusta().setVersioneServizio(servizioHeaderIntegrazione.getVersione());
  1644.                 headerIntegrazione.getBusta().setAzione(servizioHeaderIntegrazione.getAzione());
  1645.             }else{
  1646.                 headerIntegrazione.getBusta().setTipoDestinatario(idServizio.getSoggettoErogatore().getTipo());
  1647.                 headerIntegrazione.getBusta().setDestinatario(idServizio.getSoggettoErogatore().getNome());
  1648.                 headerIntegrazione.getBusta().setTipoServizio(idServizio.getTipo());
  1649.                 headerIntegrazione.getBusta().setServizio(idServizio.getNome());
  1650.                 headerIntegrazione.getBusta().setVersioneServizio(idServizio.getVersione());
  1651.                 headerIntegrazione.getBusta().setAzione(idServizio.getAzione());
  1652.             }
  1653.             if(bustaRichiesta!=null) {
  1654.                 headerIntegrazione.getBusta().setID(bustaRichiesta.getID());
  1655.                 headerIntegrazione.getBusta().setRiferimentoMessaggio(bustaRichiesta.getRiferimentoMessaggio());
  1656.                 headerIntegrazione.getBusta().setIdCollaborazione(bustaRichiesta.getCollaborazione());
  1657.                 headerIntegrazione.getBusta().setProfiloDiCollaborazione(bustaRichiesta.getProfiloDiCollaborazione());
  1658.             }
  1659.             headerIntegrazione.setIdApplicativo(idCorrelazioneApplicativa);
  1660.             headerIntegrazione.setServizioApplicativo(servizioApplicativoFruitore);
  1661.             if(servizioApplicativoToken!=null) {
  1662.                 headerIntegrazione.setServizioApplicativoToken(servizioApplicativoToken.getNome());
  1663.                 if(servizioApplicativoToken.getIdSoggettoProprietario()!=null) {
  1664.                     headerIntegrazione.setTipoSoggettoProprietarioApplicativoToken(servizioApplicativoToken.getIdSoggettoProprietario().getTipo());
  1665.                     headerIntegrazione.setNomeSoggettoProprietarioApplicativoToken(servizioApplicativoToken.getIdSoggettoProprietario().getNome());
  1666.                 }
  1667.                 if(servizioApplicativoFruitore==null && richiestaApplicativa!=null && Costanti.MODIPA_PROTOCOL_NAME.equals(protocolFactory.getProtocol())) {
  1668.                     // inserisco come servizioApplicativoFruitore la stessa informazione del token. Sono lo stesso
  1669.                     headerIntegrazione.setServizioApplicativo(servizioApplicativoToken.getNome());
  1670.                 }
  1671.             }

  1672.             Map<String, List<String>> propertiesTrasporto = new HashMap<>();
  1673.             Map<String, List<String>> propertiesUrlBased = new HashMap<>();

  1674.             if(tipiIntegrazione==null){
  1675.                 if(ConsegnaContenutiApplicativi.defaultPerProtocolloGestoreIntegrazionePA.containsKey(protocolFactory.getProtocol())){
  1676.                     tipiIntegrazione = ConsegnaContenutiApplicativi.defaultPerProtocolloGestoreIntegrazionePA.get(protocolFactory.getProtocol());
  1677.                 }else{
  1678.                     tipiIntegrazione = ConsegnaContenutiApplicativi.defaultGestoriIntegrazionePA;
  1679.                 }
  1680.             }
  1681.            
  1682.             OutRequestPAMessage outRequestPAMessage = new OutRequestPAMessage();
  1683.             outRequestPAMessage.setBustaRichiesta(bustaRichiesta);
  1684.             outRequestPAMessage.setMessage(consegnaMessagePrimaTrasformazione);
  1685.             if(pa!=null)
  1686.                 outRequestPAMessage.setPortaApplicativa(pa);
  1687.             else
  1688.                 outRequestPAMessage.setPortaDelegata(pd);
  1689.             outRequestPAMessage.setHeaders(propertiesTrasporto);
  1690.             outRequestPAMessage.setParameters(propertiesUrlBased);
  1691.             if(servizioHeaderIntegrazione!=null){
  1692.                 outRequestPAMessage.setServizio(servizioHeaderIntegrazione);
  1693.             }else{
  1694.                 outRequestPAMessage.setServizio(idServizio);
  1695.             }
  1696.             if(soggettoFruitoreHeaderIntegrazione!=null){
  1697.                 outRequestPAMessage.setSoggettoMittente(soggettoFruitoreHeaderIntegrazione);
  1698.             }else{
  1699.                 outRequestPAMessage.setSoggettoMittente(soggettoFruitore);
  1700.             }
  1701.             for(int i=0; i<tipiIntegrazione.length;i++){
  1702.                 try{
  1703.                     IGestoreIntegrazionePA gestore = null;
  1704.                     try{
  1705.                         gestore = (IGestoreIntegrazionePA) this.pluginLoader.newIntegrazionePortaApplicativa(tipiIntegrazione[i]);
  1706.                     }catch(Exception e){
  1707.                         throw e;
  1708.                     }
  1709.                     if(gestore!=null){
  1710.                         String classType = null;
  1711.                         try {
  1712.                             classType = gestore.getClass().getName();
  1713.                             AbstractCore.init(gestore, pddContext, protocolFactory);
  1714.                         }catch(Exception e){
  1715.                             throw new Exception("Riscontrato errore durante l'inizializzazione della classe ["+classType+
  1716.                                     "] da utilizzare per la gestione dell'integrazione delle erogazione di tipo ["+tipiIntegrazione[i]+"]: "+e.getMessage());
  1717.                         }
  1718.                         if(gestore instanceof IGestoreIntegrazionePASoap){
  1719.                             if(this.propertiesReader.processHeaderIntegrazionePARequest(false)){
  1720.                                 if(this.propertiesReader.deleteHeaderIntegrazioneRequestPA()){
  1721.                                     gestore.setOutRequestHeader(headerIntegrazione,outRequestPAMessage);
  1722.                                 }
  1723.                                 else{
  1724.                                     // gia effettuato l'update dell'header in RicezioneBuste
  1725.                                 }
  1726.                             }else{
  1727.                                 gestore.setOutRequestHeader(headerIntegrazione,outRequestPAMessage);
  1728.                             }
  1729.                         }else{
  1730.                             gestore.setOutRequestHeader(headerIntegrazione,outRequestPAMessage);
  1731.                         }
  1732.                     }else{
  1733.                         throw new Exception("Gestore non inizializzato");
  1734.                     }

  1735.                 }catch(Exception e){
  1736.                     msgDiag.addKeyword(CostantiPdD.KEY_TIPO_HEADER_INTEGRAZIONE,tipiIntegrazione[i]);
  1737.                     msgDiag.addKeywordErroreProcessamento(e);
  1738.                     msgDiag.logPersonalizzato("headerIntegrazione.creazioneFallita");
  1739.                     this.log.error(msgDiag.getMessaggio_replaceKeywords("headerIntegrazione.creazioneFallita"), e);
  1740.                 }
  1741.             }






  1742.            
  1743.            
  1744.            
  1745.            
  1746.            
  1747.            
  1748.             /* ------------ Trasformazione Richiesta  -------------- */
  1749.            
  1750.             GestoreTrasformazioni gestoreTrasformazioni = null;
  1751.             consegnaMessageTrasformato = consegnaMessagePrimaTrasformazione;
  1752.             if(trasformazioni!=null) {
  1753.                 try {
  1754.                     if(richiestaApplicativa!=null && !localForward){
  1755.                         gestoreTrasformazioni = new GestoreTrasformazioni(this.log, msgDiag, idServizio, soggettoFruitore, servizioApplicativoFruitore,
  1756.                                 trasformazioni, transactionNullable, pddContext, requestInfo, tipoPdD,
  1757.                                 generatoreErrorePA,
  1758.                                 configurazionePdDManager,
  1759.                                 idPA);
  1760.                     }
  1761.                     else {
  1762.                         gestoreTrasformazioni = new GestoreTrasformazioni(this.log, msgDiag, idServizio, soggettoFruitore, servizioApplicativoFruitore,
  1763.                                 trasformazioni, transactionNullable, pddContext, requestInfo, tipoPdD,
  1764.                                 generatoreErrorePA,
  1765.                                 configurazionePdDManager,
  1766.                                 idPD);
  1767.                     }
  1768.                     if(transazioneApplicativoServer!=null) {
  1769.                         gestoreTrasformazioni.setNomeConnettore(nomeConnettoreMultiplo);
  1770.                         gestoreTrasformazioni.setNomeServizioApplicativoErogatore(nomeServizioApplicativoErogatoreConnettoreMultiplo);
  1771.                     }
  1772.                     else {
  1773.                         gestoreTrasformazioni.setNomeConnettore(nomeConnettoreAPIImplementation);
  1774.                         gestoreTrasformazioni.setNomeServizioApplicativoErogatore(nomeServizioApplicativoErogatoreAPIImplementation);
  1775.                     }
  1776.                     if(tipoMessaggioDaNotificare_notificaAsincrona!=null) {
  1777.                         consegnaMessageTrasformato = gestoreTrasformazioni.trasformazioneNotifica(consegnaMessagePrimaTrasformazione, bustaRichiesta,
  1778.                                 tipoMessaggioDaNotificare_notificaAsincrona, consegnaResponseMessagePrimaTrasformazione, notificaTransactionContext);
  1779.                         if(!gestoreTrasformazioni.isTrasformazioneContenutoRichiestaEffettuata() && consegnaResponseMessagePrimaTrasformazione!=null) {
  1780.                             // si entra in questo caso solo se è stato scelto ENTRAMBI e una trasformazione non ha modificato il messaggio
  1781.                             consegnaMessageTrasformato = GestoreTrasformazioniUtilities.buildRequestResponseArchive(this.log, consegnaMessagePrimaTrasformazione, consegnaResponseMessagePrimaTrasformazione,
  1782.                                     this.propertiesReader.getNotificaRichiestaRisposta_consegnaContenutiApplicativi_archiveType());
  1783.                         }
  1784.                     }
  1785.                     else {
  1786.                         consegnaMessageTrasformato = gestoreTrasformazioni.trasformazioneRichiesta(consegnaMessagePrimaTrasformazione, bustaRichiesta);
  1787.                     }
  1788.                 }
  1789.                 catch(GestoreTrasformazioniException e) {
  1790.                    
  1791.                     msgDiag.addKeywordErroreProcessamento(e);
  1792.                     msgDiag.logPersonalizzato( tipoMessaggioDaNotificare_notificaAsincrona!=null ? "trasformazione.processamentoNotificaInErrore" : "trasformazione.processamentoRichiestaInErrore");
  1793.                    
  1794.                     pddContext.addObject(org.openspcoop2.core.constants.Costanti.ERRORE_TRASFORMAZIONE_RICHIESTA, "true");
  1795.                    
  1796.                     ErroreIntegrazione erroreIntegrazione = gestoreTrasformazioni.getErrore();
  1797.                     if(erroreIntegrazione==null) {
  1798.                         erroreIntegrazione = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1799.                                 get5XX_ErroreProcessamento(e,CodiceErroreIntegrazione.CODICE_562_TRASFORMAZIONE);
  1800.                     }
  1801.                    
  1802.                     String msgErrore = e.getMessage();                  
  1803.                     if(existsModuloInAttesaRispostaApplicativa) {
  1804.                         IntegrationFunctionError integrationFunctionError = IntegrationFunctionError.TRANSFORMATION_RULE_REQUEST_FAILED;
  1805.                         if(e.getOp2IntegrationFunctionError()!=null) {
  1806.                             integrationFunctionError = e.getOp2IntegrationFunctionError();
  1807.                         }
  1808.                         ejbUtils.setIntegrationFunctionErrorPortaApplicativa(integrationFunctionError);
  1809.                         if(localForwardEngine!=null) {
  1810.                             localForwardEngine.setIntegrationFunctionError(integrationFunctionError);
  1811.                         }
  1812.                         if(e.getOpenSPCoop2ErrorMessage()!=null) {
  1813.                             this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  1814.                                     e.getOpenSPCoop2ErrorMessage(), msgErrore,
  1815.                                     idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore);
  1816.                         }
  1817.                         else {
  1818.                             this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  1819.                                     erroreIntegrazione,
  1820.                                     idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  1821.                                     (consegnaMessagePrimaTrasformazione!=null ? consegnaMessagePrimaTrasformazione.getParseException() : null),
  1822.                                     pddContext);
  1823.                         }
  1824.                         esito.setEsitoInvocazione(true);
  1825.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO, msgErrore);
  1826.                     }else{
  1827.                         ejbUtils.rollbackMessage(msgErrore,servizioApplicativo, esito);
  1828.                         esito.setEsitoInvocazione(false);
  1829.                         esito.setStatoInvocazioneErroreNonGestito(e);
  1830.                     }
  1831.                     openspcoopstate.releaseResource();
  1832.                     return esito;
  1833.                 }      
  1834.             }  
  1835.            
  1836.            
  1837.            
  1838.            
  1839.            
  1840.            
  1841.            
  1842.            
  1843.            
  1844.            
  1845.            





  1846.             /* ------------------- Definizione connettoreMsg -----------------------*/
  1847.                        
  1848.             // mapping in valori delle keyword delle proprieta di trasporto protocol-properties.
  1849.             msgDiag.mediumDebug("Impostazione messaggio del connettore...");
  1850.             mappingProtocolProperties(connettoreMsg.getPropertiesTrasporto(), propertiesTrasporto,
  1851.                     soggettoFruitoreHeaderIntegrazione, servizioHeaderIntegrazione, soggettoFruitore, idServizio, bustaRichiesta, idCorrelazioneApplicativa);
  1852.             mappingProtocolProperties(connettoreMsg.getPropertiesUrlBased(), propertiesUrlBased,
  1853.                     soggettoFruitoreHeaderIntegrazione, servizioHeaderIntegrazione, soggettoFruitore, idServizio, bustaRichiesta, idCorrelazioneApplicativa);

  1854.             // definizione connettore
  1855.             connettoreMsg.setRequestMessage(consegnaMessageTrasformato);
  1856.             connettoreMsg.setIdModulo(ConsegnaContenutiApplicativi.ID_MODULO);
  1857.             connettoreMsg.setPropertiesTrasporto(propertiesTrasporto);
  1858.             connettoreMsg.setPropertiesUrlBased(propertiesUrlBased);
  1859.             connettoreMsg.setBusta(bustaRichiesta);
  1860.             connettoreMsg.setMsgDiagnostico(msgDiag);
  1861.             connettoreMsg.setState(openspcoopstate.getStatoRichiesta());
  1862.             if(consegnaMessagePrimaTrasformazione!=null && consegnaMessagePrimaTrasformazione.getTransportRequestContext()!=null) {
  1863.                 connettoreMsg.setUrlInvocazionePorta(consegnaMessagePrimaTrasformazione.getTransportRequestContext().getUrlInvocazione_formBased());
  1864.             }

  1865.             if(bustaRichiesta!=null) {
  1866.                 bustaRichiesta.setID(originalID);
  1867.             }









  1868.             /* ------------------- Preparo Spedizione -----------------------*/
  1869.             msgDiag.mediumDebug("Inizializzazione connettore per la spedizione...");
  1870.             //  Connettore per consegna
  1871.             String tipoConnector = connettoreMsg.getTipoConnettore();
  1872.             if (pddContext.getObject(CostantiPdD.KEY_OVERRIDE_CONNETTORE) != null) {
  1873.                 tipoConnector = pddContext.get(CostantiPdD.KEY_OVERRIDE_CONNETTORE).toString();
  1874.             }
  1875.            
  1876.             msgDiag.addKeyword(CostantiPdD.KEY_TIPO_CONNETTORE, tipoConnector);
  1877.             IConnettore connectorSender = null;

  1878.             // mapping per forward token
  1879.             TokenForward tokenForward = null;
  1880.             Object oTokenForward = consegnaMessageTrasformato.getContextProperty(org.openspcoop2.pdd.core.token.Costanti.MSG_CONTEXT_TOKEN_FORWARD);
  1881.             if(oTokenForward!=null) {
  1882.                 tokenForward = (TokenForward) oTokenForward;
  1883.             }
  1884.             if(tokenForward!=null) {
  1885.                 /**Vengono inviati header doppi se non iniziano con GovWay-
  1886.                 if(tokenForward.getTrasporto()!=null && tokenForward.getTrasporto().size()>0) {
  1887.                     propertiesTrasporto.putAll(tokenForward.getTrasporto());
  1888.                 }
  1889.                 if(tokenForward.getUrl()!=null && tokenForward.getUrl().size()>0) {
  1890.                     propertiesUrlBased.putAll(tokenForward.getUrl());
  1891.                 }*/
  1892.                 tokenForward.add(consegnaMessageTrasformato);
  1893.             }
  1894.            
  1895.             // Risposte del connettore
  1896.             int codiceRitornato = -1;
  1897.             TransportResponseContext transportResponseContext = null;

  1898.             // Stato consegna tramite connettore
  1899.             boolean errorConsegna = false;
  1900.             boolean riconsegna = false;
  1901.             java.sql.Timestamp dataRiconsegna = null;
  1902.             String motivoErroreConsegna = null;
  1903.             boolean invokerNonSupportato = false;
  1904.             SOAPFault soapFault = null;
  1905.             ProblemRFC7807 restProblem = null;
  1906.             OpenSPCoop2MessageFactory faultMessageFactory = null;
  1907.             Exception eccezioneProcessamentoConnettore = null;

  1908.             // Carico connettore richiesto
  1909.             String connectorClass = null;
  1910.             Exception eInvokerNonSupportato = null;
  1911.             if(invokerNonSupportato==false){
  1912.                 try{
  1913.                     connectorSender = (IConnettore) this.pluginLoader.newConnettore(tipoConnector);
  1914.                 }
  1915.                 catch(Exception e){
  1916.                     msgDiag.logErroreGenerico(e,"Inizializzazione Connettore"); // l'errore contiene gia tutte le informazioni
  1917.                     invokerNonSupportato = true;
  1918.                     eInvokerNonSupportato = e;
  1919.                 }
  1920.                 if(connectorSender!=null) {
  1921.                     try {
  1922.                         connectorClass = connectorSender.getClass().getName();
  1923.                         AbstractCore.init(connectorSender, pddContext, protocolFactory);
  1924.                     }catch(Exception e){
  1925.                         msgDiag.logErroreGenerico(e,"IConnettore.newInstance(tipo:"+tipoConnector+" class:"+connectorClass+")");
  1926.                         invokerNonSupportato = true;
  1927.                         eInvokerNonSupportato = e;
  1928.                     }
  1929.                 }
  1930.                 if( (invokerNonSupportato == false) && (connectorSender == null)){
  1931.                     msgDiag.logErroreGenerico("ConnectorSender is null","IConnettore.newInstance(tipo:"+tipoConnector+" class:"+connectorClass+")");
  1932.                     invokerNonSupportato = true;
  1933.                 }
  1934.             }
  1935.            
  1936.             // correggo eventuali contesti e parametri della url nel caso di consegna di una notifica
  1937.             try {
  1938.                 correctForwardPathNotifiche(transazioneApplicativoServer, consegnaMessageTrasformato, protocolFactory);
  1939.             }catch(Exception e){
  1940.                 msgDiag.logErroreGenerico(e,"ConnettoreBaseHTTP.correctForwardPathNotifiche");
  1941.                 invokerNonSupportato = true;
  1942.                 eInvokerNonSupportato = e;
  1943.             }
  1944.            
  1945.             // Imposto tipo di richiesta
  1946.             HttpRequestMethod httpRequestMethod = null;
  1947.             if(connectorSender!=null){
  1948.                 try{
  1949.                     if(connectorSender instanceof ConnettoreBaseHTTP){
  1950.                         ConnettoreBaseHTTP baseHttp = (ConnettoreBaseHTTP) connectorSender;
  1951.                        
  1952.                         if(metodoHttpDaNotificare_notificaAsincrona!=null) {
  1953.                             baseHttp.setForceHttpMethod(metodoHttpDaNotificare_notificaAsincrona);
  1954.                         }
  1955.                        
  1956.                         baseHttp.setHttpMethod(consegnaMessageTrasformato);
  1957.                        
  1958.                         if(ServiceBinding.REST.equals(consegnaMessageTrasformato.getServiceBinding())){
  1959.                             httpRequestMethod = baseHttp.getHttpMethod();
  1960.                         }
  1961.                     }
  1962.                 }catch(Exception e){
  1963.                     msgDiag.logErroreGenerico(e,"ConnettoreBaseHTTP.setHttpMethod(tipo:"+tipoConnector+" class:"+connectorClass+")");
  1964.                     invokerNonSupportato = true;
  1965.                     eInvokerNonSupportato = e;
  1966.                 }
  1967.             }

  1968.             // Location
  1969.             location = ConnettoreUtils.getAndReplaceLocationWithBustaValues(connectorSender, connettoreMsg, bustaRichiesta, pddContext, protocolFactory,  this.log);
  1970.             if(location!=null){
  1971.                 String locationWithUrl = ConnettoreUtils.buildLocationWithURLBasedParameter(this.log, consegnaMessageTrasformato, connettoreMsg.getTipoConnettore(), connettoreMsg.getPropertiesUrlBased(), location,
  1972.                         protocolFactory, this.idModulo);
  1973.                 locationWithUrl = ConnettoreUtils.addProxyInfoToLocationForHTTPConnector(connettoreMsg.getTipoConnettore(), connettoreMsg.getConnectorProperties(), locationWithUrl);
  1974.                 locationWithUrl = ConnettoreUtils.addGovWayProxyInfoToLocationForHTTPConnector(connettoreMsg.getForwardProxy(),connectorSender, locationWithUrl);
  1975.                 msgDiag.addKeyword(CostantiPdD.KEY_LOCATION, ConnettoreUtils.formatLocation(httpRequestMethod, locationWithUrl));
  1976.                
  1977.                 pddContext.addObject(CostantiPdD.CONNETTORE_REQUEST_METHOD, httpRequestMethod);
  1978.                 pddContext.addObject(CostantiPdD.CONNETTORE_REQUEST_URL, locationWithUrl);
  1979.             }
  1980.             else{
  1981.                 msgDiag.addKeyword(CostantiPdD.KEY_LOCATION, "N.D.");
  1982.             }

  1983.             // timeout di default
  1984.             if(connettoreMsg.getConnectorProperties()==null){
  1985.                 java.util.Map<String,String> propCon = new java.util.HashMap<>();
  1986.                 connettoreMsg.setConnectorProperties(propCon);
  1987.             }
  1988.             if(connettoreMsg.getConnectorProperties().get(CostantiConnettori.CONNETTORE_CONNECTION_TIMEOUT)==null ||
  1989.                     connettoreMsg.getConnectorProperties().get(CostantiConnettori.CONNETTORE_READ_CONNECTION_TIMEOUT)==null){
  1990.                 DatiTempiRisposta datiTempiRisposta = ConnettoreUtilities.readDatiGlobaliTimeout(configurazionePdDManager, TipoPdD.APPLICATIVA, requestInfo, this.propertiesReader);
  1991.                 if(connettoreMsg.getConnectorProperties().get(CostantiConnettori.CONNETTORE_CONNECTION_TIMEOUT)==null){
  1992.                     connettoreMsg.getConnectorProperties().put(CostantiConnettori.CONNETTORE_CONNECTION_TIMEOUT,
  1993.                             "" + ((datiTempiRisposta!=null && datiTempiRisposta.getConnectionTimeout()!=null) ? datiTempiRisposta.getConnectionTimeout().intValue() : this.propertiesReader.getConnectionTimeout_consegnaContenutiApplicativi()));
  1994.                     connettoreMsg.getConnectorProperties().put(CostantiConnettori.CONNETTORE_CONNECTION_TIMEOUT_GLOBALE, "true" );
  1995.                 }
  1996.                 if(connettoreMsg.getConnectorProperties().get(CostantiConnettori.CONNETTORE_READ_CONNECTION_TIMEOUT)==null){
  1997.                     connettoreMsg.getConnectorProperties().put(CostantiConnettori.CONNETTORE_READ_CONNECTION_TIMEOUT,
  1998.                             "" + ((datiTempiRisposta!=null && datiTempiRisposta.getReadConnectionTimeout()!=null) ? datiTempiRisposta.getReadConnectionTimeout().intValue() : this.propertiesReader.getReadConnectionTimeout_consegnaContenutiApplicativi()));
  1999.                     connettoreMsg.getConnectorProperties().put(CostantiConnettori.CONNETTORE_READ_CONNECTION_TIMEOUT_GLOBALE, "true" );
  2000.                 }
  2001.             }

  2002.             // behaviourForwardToConfiguration
  2003.             if(behaviourForwardToConfiguration!=null){
  2004.                 if(behaviourForwardToConfiguration.getSbustamentoInformazioniProtocollo()!=null){
  2005.                     if(org.openspcoop2.pdd.core.behaviour.StatoFunzionalita.ABILITATA.equals(behaviourForwardToConfiguration.getSbustamentoInformazioniProtocollo())){
  2006.                         connettoreMsg.setSbustamentoInformazioniProtocollo(true);
  2007.                     }
  2008.                     else if(org.openspcoop2.pdd.core.behaviour.StatoFunzionalita.DISABILITATA.equals(behaviourForwardToConfiguration.getSbustamentoInformazioniProtocollo())){
  2009.                         connettoreMsg.setSbustamentoInformazioniProtocollo(false);
  2010.                     }
  2011.                 }
  2012.                 if(behaviourForwardToConfiguration.getSbustamentoSoap()!=null){
  2013.                     if(org.openspcoop2.pdd.core.behaviour.StatoFunzionalita.ABILITATA.equals(behaviourForwardToConfiguration.getSbustamentoSoap())){
  2014.                         connettoreMsg.setSbustamentoSOAP(true);
  2015.                     }
  2016.                     else if(org.openspcoop2.pdd.core.behaviour.StatoFunzionalita.DISABILITATA.equals(behaviourForwardToConfiguration.getSbustamentoSoap())){
  2017.                         connettoreMsg.setSbustamentoSOAP(false);
  2018.                     }
  2019.                 }
  2020.             }
  2021.            
  2022.             // GestioneErrore
  2023.             GestioneErrore gestioneConsegnaConnettore = null;
  2024.             if(gestioneErroreBehaviour!=null) {
  2025.                 gestioneConsegnaConnettore = gestioneErroreBehaviour;
  2026.             }
  2027.             else {
  2028.                 if(Costanti.SCENARIO_CONSEGNA_CONTENUTI_APPLICATIVI.equals(scenarioCooperazione) ||
  2029.                         Costanti.SCENARIO_ASINCRONO_SIMMETRICO_CONSEGNA_RISPOSTA.equals(scenarioCooperazione) ){
  2030.                     try{
  2031.                         msgDiag.mediumDebug("Inizializzo contesto per la gestione (getGestioneErroreConnettoreRispostaAsincrona) [ConsegnaContenuti/AsincronoSimmetricoRisposta]...");
  2032.                         gestioneConsegnaConnettore = configurazionePdDManager.getGestioneErroreConnettoreRispostaAsincrona(protocolFactory, consegnaMessageTrasformato.getServiceBinding(), sa);
  2033.                     }catch(Exception e){
  2034.                         msgDiag.logErroreGenerico(e, "ConsegnaAsincrona.getDatiConsegna(sa:"+servizioApplicativo+")");
  2035.                         ejbUtils.rollbackMessage("[ConsegnaAsincrona] Connettore per consegna applicativa non definito:"+e.getMessage(),servizioApplicativo, esito);
  2036.                         esito.setEsitoInvocazione(false);
  2037.                         esito.setStatoInvocazioneErroreNonGestito(e);
  2038.                         return esito;
  2039.                     }
  2040.    
  2041.    
  2042.                 }
  2043.                 else if(Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_POLLING.equals(scenarioCooperazione)){
  2044.                     try{
  2045.                         msgDiag.mediumDebug("Inizializzo contesto per la gestione (getGestioneErroreConnettoreRispostaAsincrona) [AsincronoAsimmetricoPolling]...");
  2046.                         gestioneConsegnaConnettore = configurazionePdDManager.getGestioneErroreConnettoreRispostaAsincrona(protocolFactory, consegnaMessageTrasformato.getServiceBinding(), sa);
  2047.                     }catch(Exception e){
  2048.                         msgDiag.logErroreGenerico(e, "AsincronoSimmetricoPolling.getDatiConsegna(sa:"+servizioApplicativo+")");
  2049.                         ejbUtils.rollbackMessage("[AsincronoSimmetricoPolling] Connettore per consegna applicativa non definito:"+e.getMessage(),servizioApplicativo, esito);
  2050.                         esito.setEsitoInvocazione(false);
  2051.                         esito.setStatoInvocazioneErroreNonGestito(e);
  2052.                         return esito;
  2053.                     }
  2054.                 }else{
  2055.                     try{
  2056.                         gestioneConsegnaConnettore = configurazionePdDManager.getGestioneErroreConnettoreInvocazioneServizio(protocolFactory, consegnaMessageTrasformato.getServiceBinding(), sa);
  2057.                         msgDiag.mediumDebug("Inizializzo contesto per la gestione (invocazioneServizioPerRiferimento)...");
  2058.                     }catch(Exception e){
  2059.                         msgDiag.logErroreGenerico(e, "InvocazioneServizio.getDatiConsegna(sa:"+servizioApplicativo+")");
  2060.                         ejbUtils.rollbackMessage("Connettore per consegna applicativa non definito:"+e.getMessage(),servizioApplicativo, esito);
  2061.                         esito.setEsitoInvocazione(false);
  2062.                         esito.setStatoInvocazioneErroreNonGestito(e);
  2063.                         return esito;
  2064.                     }
  2065.                 }
  2066.             }
  2067.             if(gestioneConsegnaConnettore==null){
  2068.                 msgDiag.logErroreGenerico("Gestore Errore di consegna non definito nella configurazione (is null)", "getDatiConsegna(sa:"+servizioApplicativo+")");
  2069.                 ejbUtils.rollbackMessage("Gestione Errore di consegna non definito per il sa ["+servizioApplicativo+"]",servizioApplicativo, esito);
  2070.                 esito.setEsitoInvocazione(false);
  2071.                 esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO, "Gestione Errore di consegna non definito per il sa ["+servizioApplicativo+"]");
  2072.                 return esito;
  2073.             }
  2074.            
  2075.            
  2076.            
  2077.            
  2078.            
  2079.            
  2080.            
  2081.             /* ------------------- OutRequestHandler -----------------------*/
  2082.             OutRequestContext outRequestContext = null;
  2083.             try{
  2084.                 outRequestContext = new OutRequestContext(this.log,protocolFactory,openspcoopstate.getStatoRichiesta());
  2085.                
  2086.                 // Informazioni connettore in uscita
  2087.                 InfoConnettoreUscita infoConnettoreUscita = new InfoConnettoreUscita();
  2088.                 infoConnettoreUscita.setLocation(location);
  2089.                 infoConnettoreUscita.setProperties(connettoreMsg.getConnectorProperties());
  2090.                 infoConnettoreUscita.setHeaders(connettoreMsg.getPropertiesTrasporto());
  2091.                 infoConnettoreUscita.setParameters(connettoreMsg.getPropertiesUrlBased());
  2092.                 infoConnettoreUscita.setSbustamentoSoap(connettoreMsg.isSbustamentoSOAP());
  2093.                 infoConnettoreUscita.setSbustamentoInformazioniProtocollo(connettoreMsg.isSbustamentoInformazioniProtocollo());
  2094.                 infoConnettoreUscita.setTipoAutenticazione(connettoreMsg.getAutenticazione());
  2095.                 infoConnettoreUscita.setCredenziali(connettoreMsg.getCredenziali());
  2096.                 infoConnettoreUscita.setTipoConnettore(connettoreMsg.getTipoConnettore());
  2097.                 outRequestContext.setConnettore(infoConnettoreUscita);
  2098.                
  2099.                 // Informazioni messaggio
  2100.                 outRequestContext.setMessaggio(consegnaMessageTrasformato);
  2101.                
  2102.                 // TransazioneApplicativoServer
  2103.                 outRequestContext.setTransazioneApplicativoServer(transazioneApplicativoServer);
  2104.                
  2105.                 // Contesto
  2106.                 if(protocolContext==null) {
  2107.                     protocolContext = new ProtocolContext();
  2108.                 }
  2109.                 protocolContext.setIdRichiesta(idMessaggioConsegna);
  2110.                 if(idMessaggioPreBehaviour!=null){
  2111.                     protocolContext.setIdRichiesta(idMessaggioPreBehaviour);
  2112.                 }
  2113.                 protocolContext.setFruitore(soggettoFruitore);
  2114.                 if(bustaRichiesta!=null){
  2115.                     protocolContext.setIndirizzoFruitore(bustaRichiesta.getIndirizzoMittente());
  2116.                 }
  2117.                 if(idServizio!=null){
  2118.                     protocolContext.setErogatore(idServizio.getSoggettoErogatore());
  2119.                     if(bustaRichiesta!=null){
  2120.                         protocolContext.setIndirizzoErogatore(bustaRichiesta.getIndirizzoDestinatario());
  2121.                     }
  2122.                     protocolContext.setTipoServizio(idServizio.getTipo());
  2123.                     protocolContext.setServizio(idServizio.getNome());
  2124.                     protocolContext.setVersioneServizio(idServizio.getVersione());
  2125.                     protocolContext.setAzione(idServizio.getAzione());
  2126.                 }
  2127.                 if(idAccordoServizio!=null){
  2128.                     protocolContext.setIdAccordo(idAccordoServizio);
  2129.                 }
  2130.                 else if(idServizio!=null && idServizio.getUriAccordoServizioParteComune()!=null){
  2131.                     protocolContext.setIdAccordo(IDAccordoFactory.getInstance().getIDAccordoFromUri(idServizio.getUriAccordoServizioParteComune()));
  2132.                 }
  2133.                 String profiloCollorazioneValue = null;
  2134.                 if(bustaRichiesta!=null){
  2135.                     profiloCollorazioneValue = bustaRichiesta.getProfiloDiCollaborazioneValue();
  2136.                 }
  2137.                 protocolContext.setProfiloCollaborazione(profiloCollaborazione,profiloCollorazioneValue);
  2138.                 if(bustaRichiesta!=null){
  2139.                     protocolContext.setCollaborazione(bustaRichiesta.getCollaborazione());
  2140.                 }
  2141.                 protocolContext.setDominio(msgDiag.getDominio());
  2142.                 protocolContext.setScenarioCooperazione(scenarioCooperazione);
  2143.                 outRequestContext.setProtocollo(protocolContext);
  2144.                
  2145.                 // Integrazione
  2146.                 if(integrationContext==null) {
  2147.                     integrationContext = new IntegrationContext();
  2148.                 }
  2149.                 integrationContext.setIdCorrelazioneApplicativa(idCorrelazioneApplicativa);
  2150.                 integrationContext.setServizioApplicativoFruitore(servizioApplicativoFruitore);
  2151.                 integrationContext.addServizioApplicativoErogatore(servizioApplicativo);
  2152.                 integrationContext.setGestioneStateless(portaDiTipoStateless);
  2153.                 integrationContext.setIdPA(idPA);
  2154.                 integrationContext.setIdPD(idPD);
  2155.                 outRequestContext.setIntegrazione(integrationContext);
  2156.                
  2157.                 // Altre informazioni
  2158.                 outRequestContext.setDataElaborazioneMessaggio(DateManager.getDate());
  2159.                 outRequestContext.setPddContext(pddContext);
  2160.                 outRequestContext.setTipoPorta(TipoPdD.APPLICATIVA);
  2161.                 outRequestContext.setIdModulo(this.idModulo);

  2162.                 // Invocazione handler
  2163.                 GestoreHandlers.outRequest(outRequestContext, msgDiag, this.log);
  2164.                
  2165.                 // Riporto messaggio
  2166.                 consegnaMessageTrasformato = outRequestContext.getMessaggio();
  2167.                
  2168.                 // Salvo handler
  2169.                 connettoreMsg.setOutRequestContext(outRequestContext);
  2170.                
  2171.             }
  2172.             catch(Exception e){
  2173.                 String msgErrore = null;
  2174.                 if(e!=null && e.getMessage()!=null){
  2175.                     if(e.getMessage().length()>150){
  2176.                         msgErrore = e.getMessage().substring(0, 150);
  2177.                     }else{
  2178.                         msgErrore = e.getMessage();
  2179.                     }
  2180.                 }
  2181.                 ErroreIntegrazione erroreIntegrazione = null;
  2182.                 IntegrationFunctionError integrationFunctionError = null;
  2183.                 if(e instanceof HandlerException){
  2184.                     HandlerException he = (HandlerException) e;
  2185.                     if(he.isEmettiDiagnostico()){
  2186.                         msgDiag.logErroreGenerico(e, ((HandlerException)e).getIdentitaHandler());
  2187.                     }
  2188.                     msgErrore = ((HandlerException)e).getIdentitaHandler()+" error: "+msgErrore;
  2189.                     if(existsModuloInAttesaRispostaApplicativa) {
  2190.                         erroreIntegrazione = he.convertToErroreIntegrazione();
  2191.                         integrationFunctionError = he.getIntegrationFunctionError();
  2192.                     }
  2193.                 }else{
  2194.                     msgDiag.logErroreGenerico(e, "OutRequestHandler");
  2195.                     msgErrore = "OutRequestHandler error: "+msgErrore;
  2196.                 }
  2197.                 if(existsModuloInAttesaRispostaApplicativa) {
  2198.                    
  2199.                     if(erroreIntegrazione==null){
  2200.                         erroreIntegrazione = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2201.                                 get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_543_HANDLER_OUT_REQUEST);
  2202.                     }
  2203.                    
  2204.                     if(integrationFunctionError!=null) {
  2205.                         ejbUtils.setIntegrationFunctionErrorPortaApplicativa(integrationFunctionError);
  2206.                         if(localForwardEngine!=null) {
  2207.                             localForwardEngine.setIntegrationFunctionError(integrationFunctionError);
  2208.                         }
  2209.                     }
  2210.                     this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  2211.                             erroreIntegrazione,
  2212.                             idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  2213.                             (consegnaMessagePrimaTrasformazione!=null ? consegnaMessagePrimaTrasformazione.getParseException() : null),
  2214.                             pddContext);
  2215.                    
  2216.                     esito.setEsitoInvocazione(true);
  2217.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO, msgErrore);
  2218.                 }else{
  2219.                     ejbUtils.rollbackMessage(msgErrore,servizioApplicativo, esito);
  2220.                     esito.setEsitoInvocazione(false);
  2221.                     esito.setStatoInvocazioneErroreNonGestito(e);
  2222.                 }
  2223.                 openspcoopstate.releaseResource();
  2224.                 return esito;
  2225.             }
  2226.            
  2227.            
  2228.            
  2229.            
  2230.            
  2231.            
  2232.            
  2233.            
  2234.            
  2235.            
  2236.            
  2237.            
  2238.             /* --------------- REFRESH LOCATION ----------------- */
  2239.             // L'handler puo' aggiornare le properties che contengono le proprieta' del connettore.
  2240.             location = ConnettoreUtils.getAndReplaceLocationWithBustaValues(connectorSender, connettoreMsg, bustaRichiesta, pddContext, protocolFactory, this.log);
  2241.             if(location!=null){
  2242.                 String locationWithUrl = ConnettoreUtils.buildLocationWithURLBasedParameter(this.log, consegnaMessageTrasformato, connettoreMsg.getTipoConnettore(), connettoreMsg.getPropertiesUrlBased(), location,
  2243.                         protocolFactory, this.idModulo);
  2244.                 locationWithUrl = ConnettoreUtils.addProxyInfoToLocationForHTTPConnector(connettoreMsg.getTipoConnettore(), connettoreMsg.getConnectorProperties(), locationWithUrl);
  2245.                 locationWithUrl = ConnettoreUtils.addGovWayProxyInfoToLocationForHTTPConnector(connettoreMsg.getForwardProxy(),connectorSender, locationWithUrl);
  2246.                 msgDiag.addKeyword(CostantiPdD.KEY_LOCATION, ConnettoreUtils.formatLocation(httpRequestMethod, locationWithUrl));
  2247.                
  2248.                 pddContext.addObject(CostantiPdD.CONNETTORE_REQUEST_METHOD, httpRequestMethod);
  2249.                 pddContext.addObject(CostantiPdD.CONNETTORE_REQUEST_URL, locationWithUrl);
  2250.             }
  2251.             else{
  2252.                 msgDiag.addKeyword(CostantiPdD.KEY_LOCATION, "N.D.");
  2253.             }
  2254.            
  2255.            
  2256.            
  2257.            
  2258.            
  2259.            
  2260.            
  2261.            
  2262.             /* ------------------- add start parameter -----------------------*/
  2263.             if(CostantiPdD.isEnabledAddSWAStartParameterIfNotPresent(consegnaMessageTrasformato)) {
  2264.                 SoapUtils.addSWAStartParameterIfNotPresent(consegnaMessageTrasformato);
  2265.             }
  2266.            
  2267.            
  2268.            
  2269.            
  2270.            
  2271.            
  2272.            
  2273.            
  2274.            
  2275.             /* ------------------- Dump -----------------------*/
  2276.                
  2277.             // Invoco il metodo getMessage del ConnettoreMsg per provocare l'eventuale sbustamento delle informazioni di protocollo
  2278.             connettoreMsg.getRequestMessage(requestInfo, pddContext);
  2279.            
  2280.             String idMessaggioDumpRichiesta = idMessaggioConsegna;
  2281.             if(idMessaggioPreBehaviour!=null){
  2282.                 idMessaggioDumpRichiesta = idMessaggioPreBehaviour;
  2283.             }
  2284.            
  2285.             Dump dumpApplicativoRichiesta = new Dump(identitaPdD,ConsegnaContenutiApplicativi.ID_MODULO,idMessaggioDumpRichiesta,
  2286.                     soggettoFruitore,idServizio,TipoPdD.APPLICATIVA,msgDiag.getPorta(),pddContext,
  2287.                     openspcoopstate.getStatoRichiesta(),openspcoopstate.getStatoRisposta(),
  2288.                     dumpConfig);
  2289.             if(transazioneApplicativoServer!=null) {
  2290.                 dumpApplicativoRichiesta.setTransazioneApplicativoServer(transazioneApplicativoServer, idPA, dataConsegna);
  2291.             }
  2292.             dumpApplicativoRichiesta.dumpRichiestaUscita(consegnaMessageTrasformato, outRequestContext.getConnettore());

  2293.            
  2294.            
  2295.            
  2296.            
  2297.            
  2298.            
  2299.            
  2300.            
  2301.            
  2302.            
  2303.            
  2304.            
  2305.            
  2306.             /* -------------------
  2307.                Rilascio Risorse (Le riprendero' dopo aver ottenuto la risposta, se necessario)
  2308.                Le informazioni nel DB sono state utilizzate fino a questo punto solo in lettura.
  2309.                Eventuali spedizioni JMS sono state effettuate e le risorse gia' rilasciate (non arrivero a questo punto)
  2310.                -----------------------*/
  2311.             msgDiag.mediumDebug("Rilascio connessione al database...");
  2312.             openspcoopstate.releaseResource();
  2313.            
  2314.            
  2315.            
  2316.            
  2317.            
  2318.            
  2319.            

  2320.             // --------------------- spedizione --------------------------
  2321.                        
  2322.             Date dataPrimaInvocazioneConnettore = null;
  2323.             Date dataTerminataInvocazioneConnettore = null;
  2324.             if(invokerNonSupportato==false){
  2325.                 msgDiag.logPersonalizzato("consegnaInCorso");
  2326.                
  2327.                 // se il tracciamento lo prevedo emetto un log
  2328.                 if(transazioneApplicativoServer==null) {
  2329.                     registraTracciaOutRequest(transactionNullable, outRequestContext, this.log, msgDiag);
  2330.                 }
  2331.                
  2332.                 // utilizzo connettore
  2333.                 ejbUtils.setSpedizioneMsgIngresso(new Timestamp(outRequestContext.getDataElaborazioneMessaggio().getTime()));
  2334.                 dataPrimaInvocazioneConnettore = DateManager.getDate();
  2335.                 errorConsegna = !connectorSender.send(responseCachingConfig, connettoreMsg);
  2336.                 dataTerminataInvocazioneConnettore = DateManager.getDate();
  2337.             }
  2338.            
  2339.            
  2340.            
  2341.             Utilities.printFreeMemory("ConsegnaContenuti - Richiesta risorsa per la gestione della risposta...");
  2342.            
  2343.            
  2344.            
  2345.            
  2346.             /* ------------  Re-ottengo Connessione al DB -------------- */
  2347.             msgDiag.mediumDebug("Richiesta risorsa per la gestione della risposta...");
  2348.             try{
  2349.                 boolean gestioneAsincroniStateless =
  2350.                     (ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(profiloCollaborazione) ||
  2351.                             ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(profiloCollaborazione))
  2352.                             && portaDiTipoStateless;
  2353.                 boolean oldGestioneConnessione = false;
  2354.                 if(gestioneAsincroniStateless || salvaRispostaPerNotifiche){
  2355.                     oldGestioneConnessione = ((OpenSPCoopStateless)openspcoopstate).isUseConnection();
  2356.                     ((OpenSPCoopStateless)openspcoopstate).setUseConnection(true);
  2357.                 }
  2358.                 openspcoopstate.updateResource(idTransazione);
  2359.                 if(gestioneAsincroniStateless){
  2360.                     ((OpenSPCoopStateless)openspcoopstate).setUseConnection(oldGestioneConnessione);
  2361.                 }
  2362.                
  2363.                 // Aggiorno risorse
  2364.                 ejbUtils.updateOpenSPCoopState(openspcoopstate);
  2365.                 msgRequest.updateOpenSPCoopState(openspcoopstate);
  2366.                
  2367.                 // POOL,TRANSACTIONISOLATION:
  2368.                 //connectionDB.setTransactionIsolation(DBManager.getTransactionIsolationLevel());
  2369.             }catch(Exception e){
  2370.                 msgDiag.logErroreGenerico(e,"openspcoopstate.updateResource()");
  2371.                 openspcoopstate.releaseResource();
  2372.                 esito.setEsitoInvocazione(false);  
  2373.                 esito.setStatoInvocazioneErroreNonGestito(e);
  2374.                 return esito;
  2375.             }
  2376.            
  2377.            
  2378.            
  2379.             /* ------------  Analisi Risposta -------------- */
  2380.             if(invokerNonSupportato==false){
  2381.            
  2382.                 try {
  2383.                     msgDiag.mediumDebug("Analisi Risposta");
  2384.                
  2385.                     // nota per lo stato si intende un esito di errore connettore quando è proprio il connettore a restituire errore.
  2386.                     // se invece il connettore esce "bene" e restituisce poi un codice http e/o una risposta, si rientra nei casi sottostanti
  2387.                     pddContext.addObject(org.openspcoop2.core.constants.Costanti.ERRORE_UTILIZZO_CONNETTORE, errorConsegna);
  2388.                    
  2389.                     ejbUtils.setRicezioneMsgRisposta(DateManager.getTimestamp());
  2390.                     motivoErroreConsegna = connectorSender.getErrore();
  2391.                     eccezioneProcessamentoConnettore = connectorSender.getEccezioneProcessamento();
  2392.                     if(errorConsegna && motivoErroreConsegna==null){
  2393.                         motivoErroreConsegna = "Errore durante la consegna";
  2394.                     }
  2395.                     //  interpretazione esito consegna
  2396.                     GestoreErroreConnettore gestoreErrore = new GestoreErroreConnettore();
  2397.                     errorConsegna = !gestoreErrore.verificaConsegna(gestioneConsegnaConnettore,motivoErroreConsegna,eccezioneProcessamentoConnettore,connectorSender);
  2398.                     if(errorConsegna){
  2399.                         motivoErroreConsegna = gestoreErrore.getErrore();
  2400.                         riconsegna = gestoreErrore.isRiconsegna();
  2401.                         dataRiconsegna = gestoreErrore.getDataRispedizione();
  2402.                     }
  2403.                     // dopo aver verificato se siamo in un caso di errore, vediamo se l'errore è dovuto al codice di trasporto
  2404.                     // in tal caso rientriamo in un utilizzo del connettore con errore.
  2405.                     if(errorConsegna) {
  2406.                         if(connectorSender.getResponse()==null) {
  2407.                             pddContext.addObject(org.openspcoop2.core.constants.Costanti.ERRORE_UTILIZZO_CONNETTORE, errorConsegna);
  2408.                         }
  2409.                     }
  2410.                     if(transazioneApplicativoServer!=null) {
  2411.                         transazioneApplicativoServer.setConsegnaTerminata(!errorConsegna);
  2412.                     }
  2413.                     // raccolta risultati del connettore
  2414.                     soapFault = gestoreErrore.getFault();
  2415.                     restProblem = gestoreErrore.getProblem();
  2416.                     faultMessageFactory = connectorSender.getResponse()!=null ? connectorSender.getResponse().getFactory() : OpenSPCoop2MessageFactory.getDefaultMessageFactory();
  2417.                     codiceRitornato = connectorSender.getCodiceTrasporto();
  2418.                     transportResponseContext = new TransportResponseContext(this.log, connectorSender.getCodiceTrasporto()+"",
  2419.                             connectorSender.getHeaderTrasporto(),
  2420.                             connectorSender.getContentLength(),
  2421.                             motivoErroreConsegna, connectorSender.getEccezioneProcessamento());
  2422.                     responseMessage = connectorSender.getResponse();
  2423.                     useResponseForParseException = true;
  2424.                     if(responseMessage!=null){
  2425.                         responseMessage.setTransportRequestContext(consegnaMessagePrimaTrasformazione.getTransportRequestContext());
  2426.                         responseMessage.setTransportResponseContext(transportResponseContext);
  2427.                         responseContentLength = connectorSender.getContentLength();
  2428.                     }
  2429.                     // gestione connessione connettore
  2430.                     if(existsModuloInAttesaRispostaApplicativa) {
  2431.                         if(localForward){
  2432.                             RepositoryConnettori.salvaConnettorePD(
  2433.                                     //idMessaggioConsegna,
  2434.                                     idTransazione,
  2435.                                     connectorSender);
  2436.                         }else{
  2437.                             RepositoryConnettori.salvaConnettorePA(
  2438.                                     //idMessaggioConsegna,
  2439.                                     idTransazione,
  2440.                                     connectorSender);
  2441.                         }
  2442.                     }else{
  2443.                         // Sono nella casistica di messaggio preso in carico.
  2444.                         // Non si deve chiudere immediatamente la connessione, poiche' nel resto del modulo, il messaggio puo' ancora essere utilizzato (es. dump)
  2445.                         connectorSenderForDisconnect = connectorSender;
  2446.                     }          
  2447.                     msgDiag.addKeyword(CostantiPdD.KEY_CODICE_CONSEGNA, codiceRitornato+"");
  2448.                     if(motivoErroreConsegna!=null)
  2449.                         msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_CONSEGNA, motivoErroreConsegna);
  2450.                    
  2451.                     // Il Connettore potrebbe aggiungere informazioni alla location.
  2452.                     String tmpLocation = connectorSender.getLocation();
  2453.                     if(tmpLocation!=null){
  2454.                        
  2455.                         // salvo la request url originale, se la risposta non è letta dalla cache
  2456.                         boolean responseCached = false;
  2457.                         if(pddContext.containsKey(ConnettoreBase.RESPONSE_FROM_CACHE)) {
  2458.                             responseCached = (Boolean) pddContext.getObject(ConnettoreBase.RESPONSE_FROM_CACHE);
  2459.                         }
  2460.                         if(!responseCached) {
  2461.                             pddContext.addObject(CostantiPdD.CONNETTORE_REQUEST_METHOD, httpRequestMethod);
  2462.                             pddContext.addObject(CostantiPdD.CONNETTORE_REQUEST_URL, tmpLocation);
  2463.                         }
  2464.                        
  2465.                         // aggiorno
  2466.                         location = tmpLocation;
  2467.                         if(responseCached) {
  2468.                             msgDiag.addKeyword(CostantiPdD.KEY_LOCATION, location);
  2469.                         }
  2470.                         else {
  2471.                             msgDiag.addKeyword(CostantiPdD.KEY_LOCATION, ConnettoreUtils.formatLocation(httpRequestMethod, location));
  2472.                         }
  2473.                     }
  2474.                    
  2475.                     /* ------------ Check Charset ------------- */
  2476.                     try {
  2477.                         if(transportResponseContext!=null) {
  2478.                             boolean checkEnabled = false;
  2479.                             List<String> ctDefault = null;
  2480.                             if(consegnaMessageTrasformato!=null && ServiceBinding.SOAP.equals(consegnaMessageTrasformato.getServiceBinding())){
  2481.                                 if(this.propertiesReader.isControlloCharsetContentTypeAbilitatoRicezioneBusteSoap()) {
  2482.                                     checkEnabled = true;
  2483.                                     ctDefault = this.propertiesReader.getControlloCharsetContentTypeAbilitatoRicezioneBusteSoap();
  2484.                                 }
  2485.                             }
  2486.                             else {
  2487.                                 if(this.propertiesReader.isControlloCharsetContentTypeAbilitatoRicezioneBusteRest()) {
  2488.                                     checkEnabled = true;
  2489.                                     ctDefault = this.propertiesReader.getControlloCharsetContentTypeAbilitatoRicezioneBusteRest();
  2490.                                 }
  2491.                             }
  2492.                             if(checkEnabled) {
  2493.                                 if(transportResponseContext.getContentType()!=null) {
  2494.                                     ServicesUtils.checkCharset(transportResponseContext.getContentType(), ctDefault, msgDiag, false, TipoPdD.APPLICATIVA);
  2495.                                 }
  2496.                             }
  2497.                         }
  2498.                     }catch(Throwable t) {
  2499.                         String ct = null;
  2500.                         try {
  2501.                             if(transportResponseContext!=null) {
  2502.                                 ct = transportResponseContext.getContentType();
  2503.                             }
  2504.                         }catch(Throwable tRead) {
  2505.                             // ignore
  2506.                         }  
  2507.                         this.log.error("Avvenuto errore durante il controllo del charset della risposta (Content-Type: "+ct+"): "+t.getMessage(),t);
  2508.                     }
  2509.                    
  2510.                     // ------------- aggiungo gli Headers peer -----------------
  2511.                     if(transportResponseContext!=null) {
  2512.                         this.addHeadersPeer(pddContext, transportResponseContext, proprietaPorta);
  2513.                     }
  2514.                    
  2515.                 } catch (Exception e) {
  2516.                     msgDiag.addKeywordErroreProcessamento(e, "Analisi risposta fallita");
  2517.                     msgDiag.logErroreGenerico(e,"AnalisiRispostaConnettore");
  2518.                     String msgErrore = "Analisi risposta del connettore ha provocato un errore: "+e.getMessage();
  2519.                     this.log.error(msgErrore,e);
  2520.                     if(existsModuloInAttesaRispostaApplicativa) {
  2521.                        
  2522.                         this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  2523.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2524.                                 get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_500_ERRORE_INTERNO),
  2525.                                 idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  2526.                                 (connectorSender!=null && connectorSender.getResponse()!=null ? connectorSender.getResponse().getParseException() : null),
  2527.                                 pddContext);
  2528.                        
  2529.                         esito.setEsitoInvocazione(true);
  2530.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO, msgErrore);
  2531.                     }else{
  2532.                         ejbUtils.rollbackMessage(msgErrore,servizioApplicativo, esito);
  2533.                         esito.setEsitoInvocazione(false);
  2534.                         esito.setStatoInvocazioneErroreNonGestito(e);
  2535.                     }
  2536.                     openspcoopstate.releaseResource();
  2537.                     return esito;
  2538.                 }
  2539.             }

  2540.                
  2541.            
  2542.            
  2543.             msgDiag.mediumDebug("Aggiungo informazioni di integrazione dinamica della risposta nel contesto ...");
  2544.                    
  2545.             try {
  2546.                 if(pa!=null && transportResponseContext!=null) {
  2547.                     configurazionePdDManager.setInformazioniIntegrazioneDinamiche(this.log, transportResponseContext, pddContext, pa);
  2548.                 }
  2549.             }
  2550.             catch (Throwable e) {
  2551.                 msgDiag.addKeywordErroreProcessamento(e, "setInformazioniIntegrazioneDinamicheRisposta");
  2552.                 msgDiag.logErroreGenerico(e,"setInformazioniIntegrazioneDinamicheRisposta");
  2553.                 String msgErrore = "Lettura delle informazioni di integrazione dinamica della risposta ha provocato un errore: "+e.getMessage();
  2554.                 this.log.error(msgErrore,e);
  2555.                 if(existsModuloInAttesaRispostaApplicativa) {
  2556.                    
  2557.                     this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  2558.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2559.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_500_ERRORE_INTERNO),
  2560.                             idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  2561.                             (connectorSender!=null && connectorSender.getResponse()!=null ? connectorSender.getResponse().getParseException() : null),
  2562.                             pddContext);
  2563.                    
  2564.                     esito.setEsitoInvocazione(true);
  2565.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO, msgErrore);
  2566.                 }else{
  2567.                     ejbUtils.rollbackMessage(msgErrore,servizioApplicativo, esito);
  2568.                     esito.setEsitoInvocazione(false);
  2569.                     esito.setStatoInvocazioneErroreNonGestito(e);
  2570.                 }
  2571.                 openspcoopstate.releaseResource();
  2572.                 return esito;
  2573.             }



  2574.            
  2575.            
  2576.             if(salvaRispostaPerNotifiche && responseMessage!=null) {
  2577.                 try {
  2578.                     msgDiag.mediumDebug("Conservazione della risposta per il gestore delle notifiche");
  2579.                    
  2580.                     // TODO in futuro valutare se poter salvare la risposta già trasformata
  2581.                     // Poichè il campo a disposizione è uno solo per la risposta, e l'impostazione di cosa salvare viene dedotta da quanto indicato su ogni connettore
  2582.                     // la console dovrà poi consentire di indicare solamente 1 opzione tra risposta originale e risposta trasformata tra tutti i connettori multipli
  2583.                    
  2584.                     List<MapKey<String>> contextInResponse = new ArrayList<MapKey<String>>();
  2585.                     Iterator<MapKey<String>> it = responseMessage.keysContextProperty();
  2586.                     while (it.hasNext()) {
  2587.                         MapKey<String> key = (MapKey<String>) it.next();
  2588.                         contextInResponse.add(key);
  2589.                     }
  2590.                    
  2591.                     if(consegnaMessageTrasformato!=null) {
  2592.                         it = consegnaMessageTrasformato.keysContextProperty();
  2593.                         while (it.hasNext()) {
  2594.                             MapKey<String> key = (MapKey<String>) it.next();
  2595.                             if(!contextInResponse.contains(key)) {
  2596.                                 Object v = consegnaMessageTrasformato.getContextProperty(key);
  2597.                                 //System.out.println("ADD ["+key+"] ["+v.getClass().getName()+"] ["+v+"]");
  2598.                                 responseMessage.addContextProperty(key, v);
  2599.                             }
  2600.                         }
  2601.                         if(ServiceBinding.SOAP.equals(consegnaMessageTrasformato.getServiceBinding()) &&
  2602.                                 ServiceBinding.SOAP.equals(responseMessage.getServiceBinding())) {
  2603.                             String soapAction = null;
  2604.                             if(consegnaMessageTrasformato.getTransportRequestContext()!=null && consegnaMessageTrasformato.getTransportRequestContext().getHeaders()!=null) {
  2605.                                 if(TransportUtils.containsKey(consegnaMessageTrasformato.getTransportRequestContext().getHeaders(), org.openspcoop2.message.constants.Costanti.SOAP11_MANDATORY_HEADER_HTTP_SOAP_ACTION)){
  2606.                                     soapAction = TransportUtils.getFirstValue(consegnaMessageTrasformato.getTransportRequestContext().getHeaders(), org.openspcoop2.message.constants.Costanti.SOAP11_MANDATORY_HEADER_HTTP_SOAP_ACTION);
  2607.                                 }
  2608.                             }
  2609.                             if(soapAction==null) {
  2610.                                 soapAction = consegnaMessageTrasformato.castAsSoap().getSoapAction();
  2611.                             }
  2612.                             if(soapAction!=null) {
  2613.                                 responseMessage.castAsSoap().setSoapAction(soapAction);
  2614.                             }
  2615.                         }
  2616.                     }
  2617.                    
  2618.                     msgRequest.registraRisposta_statelessEngine(identificativoMessaggioDoveSalvareLaRisposta, responseMessage, false);
  2619.                                        
  2620.                 } catch (Exception e) {
  2621.                     msgDiag.addKeywordErroreProcessamento(e, "Conservazione risposta fallita");
  2622.                     msgDiag.logErroreGenerico(e,"ConservazioneRispostaConnettore");
  2623.                     String msgErrore = "Conservazione risposta del connettore ha provocato un errore: "+e.getMessage();
  2624.                     this.log.error(msgErrore,e);
  2625.                     if(existsModuloInAttesaRispostaApplicativa) {
  2626.                        
  2627.                         this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  2628.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2629.                                 get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_500_ERRORE_INTERNO),
  2630.                                 idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  2631.                                 (connectorSender!=null && connectorSender.getResponse()!=null ? connectorSender.getResponse().getParseException() : null),
  2632.                                 pddContext);
  2633.                        
  2634.                         esito.setEsitoInvocazione(true);
  2635.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO, msgErrore);
  2636.                     }else{
  2637.                         ejbUtils.rollbackMessage(msgErrore,servizioApplicativo, esito);
  2638.                         esito.setEsitoInvocazione(false);
  2639.                         esito.setStatoInvocazioneErroreNonGestito(e);
  2640.                     }
  2641.                     openspcoopstate.releaseResource();
  2642.                     return esito;
  2643.                 }
  2644.             }
  2645.            
  2646.            
  2647.            
  2648.            
  2649.            
  2650.            
  2651.            
  2652.             /* ------------ Trasformazione Risposta  -------------- */
  2653.            
  2654.             boolean dumpRispostaEffettuato = false;
  2655.             if(trasformazioni!=null && responseMessage!=null
  2656.                     && transazioneApplicativoServer==null // non ha senso per le notifiche asincrone
  2657.                     ) {
  2658.                 try {
  2659.                    
  2660.                     // prima effettuo dump applicativo
  2661.                     if(responseMessage!=null ){
  2662.                        
  2663.                         String idMessaggioDump = idMessaggioConsegna;
  2664.                         if(idMessaggioPreBehaviour!=null){
  2665.                             idMessaggioDump = idMessaggioPreBehaviour;
  2666.                         }
  2667.                        
  2668.                         Dump dumpApplicativo = new Dump(identitaPdD,ConsegnaContenutiApplicativi.ID_MODULO,idMessaggioDump,
  2669.                                 soggettoFruitore,idServizio,TipoPdD.APPLICATIVA,msgDiag.getPorta(),pddContext,
  2670.                                 openspcoopstate.getStatoRichiesta(),openspcoopstate.getStatoRisposta(),
  2671.                                 dumpConfig);
  2672.                         /*if(transazioneApplicativoServer!=null) {
  2673.                             dumpApplicativo.setTransazioneApplicativoServer(transazioneApplicativoServer, idPA, dataConsegna);
  2674.                         }*/
  2675.                         InfoConnettoreUscita infoConnettoreUscita = outRequestContext.getConnettore();
  2676.                         if(infoConnettoreUscita!=null){
  2677.                             infoConnettoreUscita.setLocation(location); // aggiorno location ottenuta dal connettore utilizzato
  2678.                         }
  2679.                         dumpApplicativo.dumpRispostaIngresso(responseMessage, infoConnettoreUscita, connectorSender.getHeaderTrasporto());
  2680.                         dumpRispostaEffettuato = true;
  2681.                     }
  2682.                    
  2683.                     MessageType messageTypePrimaTrasformazione = responseMessage.getMessageType();
  2684.                    
  2685.                     responseMessage = gestoreTrasformazioni.trasformazioneRisposta(responseMessage, bustaRichiesta);
  2686.                    
  2687.                     MessageType messageTypeDopoTrasformazione = (responseMessage!=null)  ? responseMessage.getMessageType() : null;
  2688.                     if(messageTypeDopoTrasformazione==null || messageTypePrimaTrasformazione.equals(messageTypeDopoTrasformazione)==false) {
  2689.                         soapFault = null;
  2690.                         restProblem = null;
  2691.                         if(messageTypeDopoTrasformazione!=null) {
  2692.                             if(responseMessage instanceof OpenSPCoop2SoapMessage){
  2693.                                 if(responseMessage.castAsSoap().hasSOAPFault()){
  2694.                                     SOAPBody body = responseMessage.castAsSoap().getSOAPBody();
  2695.                                     soapFault = body.getFault();
  2696.                                 }
  2697.                             }
  2698.                             else {
  2699.                                 if(responseMessage instanceof OpenSPCoop2RestJsonMessage ){
  2700.                                     OpenSPCoop2RestJsonMessage msg = responseMessage.castAsRestJson();
  2701.                                     if(msg.hasContent() && msg.isProblemDetailsForHttpApis_RFC7807()) {
  2702.                                         JsonDeserializer deserializer = new JsonDeserializer();
  2703.                                         restProblem = deserializer.fromString(msg.getContent(), false);
  2704.                                     }
  2705.                                 }
  2706.                                 else if(responseMessage instanceof OpenSPCoop2RestXmlMessage ){
  2707.                                     OpenSPCoop2RestXmlMessage msg = responseMessage.castAsRestXml();
  2708.                                     if(msg.hasContent() && msg.isProblemDetailsForHttpApis_RFC7807()) {
  2709.                                         XmlDeserializer deserializer = new XmlDeserializer();
  2710.                                         restProblem = deserializer.fromNode(msg.getContent(), false);
  2711.                                     }
  2712.                                 }
  2713.                             }
  2714.                         }
  2715.                     }
  2716.                 }
  2717.                 catch(Throwable e) {
  2718.                    
  2719.                     pddContext.addObject(org.openspcoop2.core.constants.Costanti.ERRORE_TRASFORMAZIONE_RISPOSTA, "true");
  2720.                    
  2721.                     // prima emetto diagnostico di fine connettore
  2722.                     emitDiagnostico(invokerNonSupportato, bustaRichiesta, msgDiag, errorConsegna);

  2723.                    
  2724.                     msgDiag.addKeywordErroreProcessamento(e);
  2725.                     msgDiag.logPersonalizzato("trasformazione.processamentoRispostaInErrore");
  2726.                    
  2727.                     ErroreIntegrazione erroreIntegrazione = gestoreTrasformazioni.getErrore();
  2728.                     if(erroreIntegrazione==null) {
  2729.                         erroreIntegrazione = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2730.                                 get5XX_ErroreProcessamento(e,CodiceErroreIntegrazione.CODICE_562_TRASFORMAZIONE);
  2731.                     }
  2732.                    
  2733.                     String msgErrore = e.getMessage();                  
  2734.                     if(existsModuloInAttesaRispostaApplicativa) {
  2735.                        
  2736.                         IntegrationFunctionError integrationFunctionError = IntegrationFunctionError.TRANSFORMATION_RULE_RESPONSE_FAILED;
  2737.                         if(e instanceof GestoreTrasformazioniException && (((GestoreTrasformazioniException)e).getOp2IntegrationFunctionError()!=null)) {
  2738.                             integrationFunctionError = ((GestoreTrasformazioniException)e).getOp2IntegrationFunctionError();
  2739.                         }
  2740.                         ejbUtils.setIntegrationFunctionErrorPortaApplicativa(integrationFunctionError);
  2741.                         if(localForwardEngine!=null) {
  2742.                             localForwardEngine.setIntegrationFunctionError(integrationFunctionError);
  2743.                         }
  2744.                        
  2745.                         if(e instanceof GestoreTrasformazioniException && (((GestoreTrasformazioniException)e).getOpenSPCoop2ErrorMessage()!=null)) {
  2746.                             this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  2747.                                     ((GestoreTrasformazioniException)e).getOpenSPCoop2ErrorMessage(), msgErrore,
  2748.                                     idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore);
  2749.                         }
  2750.                         else {
  2751.                             this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  2752.                                 erroreIntegrazione,
  2753.                                 idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  2754.                                 (connectorSender!=null && connectorSender.getResponse()!=null ? connectorSender.getResponse().getParseException() : null),
  2755.                                 pddContext);
  2756.                         }
  2757.                        
  2758.                         esito.setEsitoInvocazione(true);
  2759.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO, msgErrore);
  2760.                     }else{
  2761.                         ejbUtils.rollbackMessage(msgErrore,servizioApplicativo, esito);
  2762.                         esito.setEsitoInvocazione(false);
  2763.                         esito.setStatoInvocazioneErroreNonGestito(e);
  2764.                     }
  2765.                     openspcoopstate.releaseResource();
  2766.                     return esito;
  2767.                 }      
  2768.             }
  2769.            
  2770.            
  2771.            
  2772.            
  2773.            
  2774.            
  2775.            
  2776.            
  2777.    

  2778.            
  2779.             /* -------- OpenSPCoop2Message Update ------------- */
  2780.             try {
  2781.                 if(transazioneApplicativoServer==null) { // non ha senso per le notifiche asincrone
  2782.                     msgDiag.mediumDebug("Aggiornamento del messaggio");
  2783.                     // NOTA la versione SOAP capirla da consegnaMessage, la risposta puo' essere null
  2784.                     NotifierInputStreamParams nParams = null;
  2785.                     if(invokerNonSupportato==false){
  2786.                         nParams = connectorSender.getNotifierInputStreamParamsResponse();
  2787.                     }
  2788.                     responseMessage = protocolFactory.createProtocolManager().updateOpenSPCoop2MessageResponse(responseMessage,
  2789.                             bustaRichiesta, nParams,
  2790.                             consegnaMessagePrimaTrasformazione.getTransportRequestContext(),transportResponseContext,
  2791.                             protocolFactory.getCachedRegistryReader(openspcoopstate.getStatoRichiesta(), requestInfo),
  2792.                             true);
  2793.                 }
  2794.             } catch (Exception e) {
  2795.                 msgDiag.addKeywordErroreProcessamento(e, "Aggiornamento messaggio fallito");
  2796.                 msgDiag.logErroreGenerico(e,"ProtocolManager.updateOpenSPCoop2Message");
  2797.                 String msgErrore = "ProtocolManager.updateOpenSPCoop2Message error: "+e.getMessage();
  2798.                 this.log.error(msgErrore,e);
  2799.                 if(existsModuloInAttesaRispostaApplicativa) {
  2800.                    
  2801.                     this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  2802.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2803.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),
  2804.                             idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  2805.                             (responseMessage!=null ? responseMessage.getParseException() : null),
  2806.                             pddContext);
  2807.                    
  2808.                     esito.setEsitoInvocazione(true);
  2809.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO, msgErrore);
  2810.                 }else{
  2811.                     ejbUtils.rollbackMessage(msgErrore,servizioApplicativo, esito);
  2812.                     esito.setEsitoInvocazione(false);
  2813.                     esito.setStatoInvocazioneErroreNonGestito(e);
  2814.                 }
  2815.                 openspcoopstate.releaseResource();
  2816.                 return esito;
  2817.             }
  2818.            
  2819.            
  2820.            
  2821.            
  2822.            
  2823.            
  2824.            
  2825.            
  2826.            
  2827.            
  2828.            
  2829.             /* ------------------- InResponseHandler -----------------------*/
  2830.             InResponseContext inResponseContext = null;
  2831.             if(invokerNonSupportato==false){
  2832.                 try{
  2833.                     inResponseContext = new InResponseContext(this.log,protocolFactory,openspcoopstate.getStatoRisposta());
  2834.                    
  2835.                     // Informazioni sul messaggio di riposta
  2836.                     if(responseMessage!=null){
  2837.                         inResponseContext.setMessaggio(responseMessage);                
  2838.                     }
  2839.                    
  2840.                     // TransazioneApplicativoServer
  2841.                     inResponseContext.setTransazioneApplicativoServer(transazioneApplicativoServer);
  2842.                    
  2843.                     // Informazioni sulla consegna
  2844.                     inResponseContext.setErroreConsegna(motivoErroreConsegna);
  2845.                     inResponseContext.setResponseHeaders(connectorSender.getHeaderTrasporto());
  2846.                     inResponseContext.setReturnCode(codiceRitornato);
  2847.                    
  2848.                     // Altre informazioni
  2849.                     if(outRequestContext.getConnettore()!=null){
  2850.                         outRequestContext.getConnettore().setLocation(location); // aggiorno location ottenuta dal connettore utilizzato
  2851.                     }
  2852.                     inResponseContext.setConnettore(outRequestContext.getConnettore());
  2853.                     inResponseContext.setDataPrimaInvocazioneConnettore(dataPrimaInvocazioneConnettore);
  2854.                     inResponseContext.setDataTerminataInvocazioneConnettore(dataTerminataInvocazioneConnettore);
  2855.                     inResponseContext.setDataRichiestaInoltrata(connectorSender.getDataRichiestaInoltrata());
  2856.                     inResponseContext.setDataAccettazioneRisposta(connectorSender.getDataAccettazioneRisposta());
  2857.                     inResponseContext.setDataElaborazioneMessaggio(ejbUtils.getRicezioneMsgRisposta());
  2858.                     inResponseContext.setProtocollo(outRequestContext.getProtocollo());
  2859.                     inResponseContext.setPddContext(pddContext);
  2860.                     inResponseContext.setIntegrazione(outRequestContext.getIntegrazione());
  2861.                     inResponseContext.setTipoPorta(outRequestContext.getTipoPorta());
  2862.                    
  2863.                     // Invocazione handler
  2864.                     GestoreHandlers.inResponse(inResponseContext, msgDiag, this.log);
  2865.                    
  2866.                 }
  2867.                 catch(Exception e){
  2868.                     String msgErrore = null;
  2869.                     if(e!=null && e.getMessage()!=null){
  2870.                         if(e.getMessage().length()>150){
  2871.                             msgErrore = e.getMessage().substring(0, 150);
  2872.                         }else{
  2873.                             msgErrore = e.getMessage();
  2874.                         }
  2875.                     }
  2876.                     ErroreIntegrazione erroreIntegrazione = null;
  2877.                     IntegrationFunctionError integrationFunctionError = null;
  2878.                     if(e instanceof HandlerException){
  2879.                         HandlerException he = (HandlerException) e;
  2880.                         if(he.isEmettiDiagnostico()){
  2881.                             msgDiag.logErroreGenerico(e, ((HandlerException)e).getIdentitaHandler());
  2882.                         }
  2883.                         msgErrore = ((HandlerException)e).getIdentitaHandler()+" error: "+msgErrore;
  2884.                         if(existsModuloInAttesaRispostaApplicativa) {
  2885.                             erroreIntegrazione = he.convertToErroreIntegrazione();
  2886.                             integrationFunctionError = he.getIntegrationFunctionError();
  2887.                         }
  2888.                     }else{
  2889.                         msgDiag.logErroreGenerico(e, "InResponseHandler");
  2890.                         msgErrore = "InResponseHandler error: "+msgErrore;
  2891.                     }
  2892.                     if(existsModuloInAttesaRispostaApplicativa) {
  2893.                        
  2894.                         if(erroreIntegrazione==null){
  2895.                             erroreIntegrazione = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2896.                                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_544_HANDLER_IN_RESPONSE);
  2897.                         }
  2898.                        
  2899.                         if(integrationFunctionError!=null) {
  2900.                             ejbUtils.setIntegrationFunctionErrorPortaApplicativa(integrationFunctionError);
  2901.                             if(localForwardEngine!=null) {
  2902.                                 localForwardEngine.setIntegrationFunctionError(integrationFunctionError);
  2903.                             }
  2904.                         }
  2905.                         this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  2906.                                 erroreIntegrazione,
  2907.                                 idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  2908.                                 (responseMessage!=null ? responseMessage.getParseException() : null),
  2909.                                 pddContext);
  2910.                        
  2911.                         esito.setEsitoInvocazione(true);
  2912.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO, msgErrore);
  2913.                     }else{
  2914.                         ejbUtils.rollbackMessage(msgErrore,servizioApplicativo, esito);
  2915.                         esito.setEsitoInvocazione(false);
  2916.                         esito.setStatoInvocazioneErroreNonGestito(e);
  2917.                     }
  2918.                     openspcoopstate.releaseResource();
  2919.                     return esito;
  2920.                 }
  2921.             }
  2922.            
  2923.            
  2924.            
  2925.            
  2926.            
  2927.            
  2928.            
  2929.            
  2930.            
  2931.            
  2932.            
  2933.            
  2934.             /* ------------ Controllo che il messaggio non contenga una busta */
  2935.             msgDiag.mediumDebug("Controllo non esistenza di una busta ...");
  2936.             ValidazioneSintattica validatoreSintattico = new ValidazioneSintattica(pddContext, openspcoopstate.getStatoRichiesta(),responseMessage, protocolFactory);
  2937.             String msgErrore = null;
  2938.             try{
  2939.                 if(validatoreSintattico.verifyProtocolPresence(tipoPdD,profiloCollaborazione,RuoloMessaggio.RISPOSTA)){
  2940.                     throw new Exception("Rilevato ProtocolHeader nella risposta");
  2941.                 }
  2942.             } catch (Exception e){
  2943.                 msgDiag.logPersonalizzato("rispostaContenenteBusta");
  2944.                 this.log.error("CheckProtocolPresence",e);
  2945.                 if(existsModuloInAttesaRispostaApplicativa) {
  2946.                    
  2947.                     ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.INTEROPERABILITY_PROFILE_RESPONSE_ALREADY_EXISTS);
  2948.                     if(localForwardEngine!=null) {
  2949.                         localForwardEngine.setIntegrationFunctionError(IntegrationFunctionError.INTEROPERABILITY_PROFILE_RESPONSE_ALREADY_EXISTS);
  2950.                     }
  2951.                     this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  2952.                             ErroriIntegrazione.ERRORE_454_BUSTA_PRESENTE_RISPOSTA_APPLICATIVA.getErroreIntegrazione(),
  2953.                             idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  2954.                             (responseMessage!=null ? responseMessage.getParseException() : null),
  2955.                             pddContext);
  2956.                    
  2957.                     esito.setEsitoInvocazione(true);
  2958.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  2959.                             msgDiag.getMessaggio_replaceKeywords("rispostaContenenteBusta"));
  2960.                 }else{
  2961.                     ejbUtils.rollbackMessage(msgErrore,servizioApplicativo, esito);
  2962.                     esito.setEsitoInvocazione(false);
  2963.                     esito.setStatoInvocazioneErroreNonGestito(e);
  2964.                 }
  2965.                 openspcoopstate.releaseResource();
  2966.                 return esito;
  2967.             }finally{
  2968.                 // *** GB ***
  2969.                 if(validatoreSintattico!=null){
  2970.                     validatoreSintattico.setHeaderSOAP(null);
  2971.                 }
  2972.                 validatoreSintattico = null;
  2973.                 // *** GB ***
  2974.             }

  2975.            
  2976.            
  2977.            
  2978.            
  2979.            
  2980.            
  2981.            
  2982.            
  2983.            
  2984.            
  2985.            
  2986.            
  2987.             // --------------------- Messaggio di Risposta + Dump --------------------------
  2988.             if(invokerNonSupportato==false){
  2989.                
  2990.                 // Leggo informazioni di trasporto
  2991.                 codiceRitornato = inResponseContext.getReturnCode();
  2992.                 motivoErroreConsegna = inResponseContext.getErroreConsegna();
  2993.                 responseMessage = inResponseContext.getMessaggio();
  2994.                
  2995.                 String idMessaggioDump = idMessaggioConsegna;
  2996.                 if(idMessaggioPreBehaviour!=null){
  2997.                     idMessaggioDump = idMessaggioPreBehaviour;
  2998.                 }
  2999.                
  3000.                 //  dump applicativo
  3001.                 if(!dumpRispostaEffettuato && responseMessage!=null ){
  3002.                     Dump dumpApplicativo = new Dump(identitaPdD,ConsegnaContenutiApplicativi.ID_MODULO,idMessaggioDump,
  3003.                             soggettoFruitore,idServizio,TipoPdD.APPLICATIVA,msgDiag.getPorta(),pddContext,
  3004.                             openspcoopstate.getStatoRichiesta(),openspcoopstate.getStatoRisposta(),
  3005.                             dumpConfig);
  3006.                     if(transazioneApplicativoServer!=null) {
  3007.                         dumpApplicativo.setTransazioneApplicativoServer(transazioneApplicativoServer, idPA, dataConsegna);
  3008.                     }
  3009.                     dumpApplicativo.dumpRispostaIngresso(responseMessage, inResponseContext.getConnettore(), inResponseContext.getResponseHeaders());
  3010.                 }
  3011.                
  3012.             }
  3013.            
  3014.            
  3015.            
  3016.            
  3017.            





  3018.             /* ------------------- MsgDiagnostico -----------------------*/
  3019.            
  3020.             emitDiagnostico(invokerNonSupportato, bustaRichiesta, msgDiag, errorConsegna);







  3021.             /* ------------------------- Gestione Notifica ---------------------------- */
  3022.             if(salvaRispostaPerNotifiche && responseMessage==null && MessaggioDaNotificare.RISPOSTA.equals(tipiMessaggiNotificabili)) {
  3023.                 try{
  3024.                     ConnettoreException e = null;
  3025.                     if(consegnaMessageTrasformato!=null && ServiceBinding.SOAP.equals(consegnaMessageTrasformato.getServiceBinding()) && !errorConsegna){
  3026.                         e = new ConnettoreException("Non essendo presente un payload nella risposta restituita dal backend, il salvataggio della risposta non può essere completato e nessuna notifica verrà generata");
  3027.                     }
  3028.                     else {
  3029.                         e = new ConnettoreException("Causa indisponibilità del backend, il salvataggio della risposta non può essere completato e nessuna notifica verrà generata");
  3030.                     }
  3031.                     msgDiag.addKeywordErroreProcessamento(e, "Conservazione risposta fallita");
  3032.                     msgDiag.logErroreGenerico(e,"Notifiche");
  3033.                     String msgErroreR = "Conservazione risposta fallita: "+e.getMessage();
  3034.                     this.log.error(msgErroreR,e);
  3035.                     pddContext.put(CostantiPdD.CONNETTORE_MULTIPLO_CONSEGNA_NOTIFICA_DISABILITATA, e);
  3036.                 }catch (Exception e){
  3037.                     this.log.error("Errore Salvataggio informazione di notifica disabilitata",e);
  3038.                 }
  3039.             }
  3040.            
  3041.            
  3042.            



  3043.             /* ------------------------- Gestione Errori Consegna ---------------------------- */
  3044.             msgDiag.mediumDebug("Gestione errore consegna della risposta...");
  3045.             // Invoker Non Supportato
  3046.             if( invokerNonSupportato == true  ){
  3047.                 String msgErroreConnettoreNonSupportato = "Connettore non supportato [tipo:"+tipoConnector+" class:"+connectorClass+"]";
  3048.                 if(existsModuloInAttesaRispostaApplicativa) {
  3049.                    
  3050.                     this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  3051.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3052.                                 get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_515_CONNETTORE_NON_REGISTRATO),
  3053.                             idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, eInvokerNonSupportato,
  3054.                             (responseMessage!=null ? responseMessage.getParseException() : null),
  3055.                             pddContext);
  3056.                    
  3057.                     esito.setEsitoInvocazione(true);
  3058.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO, msgErroreConnettoreNonSupportato);
  3059.                 }else{
  3060.                     ejbUtils.rollbackMessage(msgErroreConnettoreNonSupportato,servizioApplicativo, esito);
  3061.                     esito.setEsitoInvocazione(false);
  3062.                     esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO, msgErroreConnettoreNonSupportato);
  3063.                 }
  3064.                 openspcoopstate.releaseResource();
  3065.                 return esito;

  3066.             }
  3067.             //  Errori avvenuti durante la consegna
  3068.             else if(errorConsegna){
  3069.                        
  3070.                 // Effettuo log dell'eventuale fault
  3071.                 if(soapFault!=null &&
  3072.                         (
  3073.                           (motivoErroreConsegna==null) ||
  3074.                           (!motivoErroreConsegna.toLowerCase().contains("faultCode") && !motivoErroreConsegna.toLowerCase().contains("faultActor") && !motivoErroreConsegna.toLowerCase().contains("faultString"))
  3075.                         )
  3076.                     ){
  3077.                     // Se non l'ho gia indicato nel motivo di errore, registro il fault
  3078.                     msgDiag.addKeyword(CostantiPdD.KEY_SOAP_FAULT, SoapUtils.safe_toString(faultMessageFactory, soapFault, this.log));
  3079.                     msgDiag.logPersonalizzato("ricezioneSoapFault");
  3080.                 }
  3081.                 else if(restProblem!=null &&
  3082.                         (
  3083.                           (motivoErroreConsegna==null) ||
  3084.                           (!motivoErroreConsegna.toLowerCase().contains(ProblemConstants.CLAIM_TYPE))
  3085.                         )
  3086.                     ){
  3087.                     // Se non l'ho gia indicato nel motivo di errore, registro il fault
  3088.                     msgDiag.addKeyword(CostantiPdD.KEY_REST_PROBLEM, restProblem.getRaw());
  3089.                     msgDiag.logPersonalizzato("ricezioneRestProblem");
  3090.                 }
  3091.                 else{
  3092.                    
  3093.                     // Controllo Situazione Anomala ISSUE OP-7
  3094.                     if(responseMessage!=null && ServiceBinding.SOAP.equals(responseMessage.getServiceBinding())){
  3095.                         OpenSPCoop2SoapMessage soapMessageResponse = responseMessage.castAsSoap();
  3096.                         if(soapMessageResponse.getSOAPPart()!=null &&
  3097.                                 soapMessageResponse.getSOAPPart().getEnvelope()!=null &&
  3098.                                 (soapMessageResponse.isSOAPBodyEmpty() || (!soapMessageResponse.hasSOAPFault()) )
  3099.                                 ) {
  3100.                             msgDiag.logPersonalizzato("comportamentoAnomalo.erroreConsegna.ricezioneMessaggioDiversoFault");
  3101.                             if(isBlockedTransaction_responseMessageWithTransportCodeError){
  3102.                                 String msgErroreSituazioneAnomale = msgDiag.getMessaggio_replaceKeywords("comportamentoAnomalo.erroreConsegna.ricezioneMessaggioDiversoFault");
  3103.                                 if(existsModuloInAttesaRispostaApplicativa) {
  3104.                                    
  3105.                                     ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.BAD_RESPONSE);
  3106.                                     if(localForwardEngine!=null) {
  3107.                                         localForwardEngine.setIntegrationFunctionError(IntegrationFunctionError.BAD_RESPONSE);
  3108.                                     }
  3109.                                     this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  3110.                                             ErroriIntegrazione.ERRORE_559_RICEVUTA_RISPOSTA_CON_ERRORE_TRASPORTO.
  3111.                                                 get559_RicevutaRispostaConErroreTrasporto(msgErroreSituazioneAnomale),
  3112.                                             idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, eInvokerNonSupportato,
  3113.                                             (responseMessage!=null ? responseMessage.getParseException() : null),
  3114.                                             pddContext);
  3115.                                    
  3116.                                     esito.setEsitoInvocazione(true);
  3117.                                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO, msgErroreSituazioneAnomale);
  3118.                                 }else{
  3119.                                     ejbUtils.rollbackMessage(msgErroreSituazioneAnomale,servizioApplicativo, esito);
  3120.                                     esito.setEsitoInvocazione(false);
  3121.                                     esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO, msgErroreSituazioneAnomale);
  3122.                                 }
  3123.                                 openspcoopstate.releaseResource();
  3124.                                 return esito;
  3125.                             }
  3126.                         }
  3127.                     }
  3128.                 }
  3129.                
  3130.                 String messaggioErroreConsegnaConnettore = "Consegna ["+tipoConnector+"] con errore: "+motivoErroreConsegna;
  3131.                 if(existsModuloInAttesaRispostaApplicativa) {
  3132.                     OpenSPCoop2Message connettoreMsgRequest = connettoreMsg.getRequestMessage(requestInfo, pddContext);
  3133.                     String requestReadTimeout = null;
  3134.                     String responseReadTimeout = null;
  3135.                     if(pddContext!=null && pddContext.containsKey(TimeoutInputStream.ERROR_MSG_KEY)) {
  3136.                         String timeoutMessage = PdDContext.getValue(TimeoutInputStream.ERROR_MSG_KEY, pddContext);
  3137.                         if(timeoutMessage!=null && timeoutMessage.startsWith(CostantiPdD.PREFIX_TIMEOUT_REQUEST)) {
  3138.                             requestReadTimeout = timeoutMessage;
  3139.                         }
  3140.                         else if(timeoutMessage!=null && timeoutMessage.startsWith(CostantiPdD.PREFIX_TIMEOUT_RESPONSE)) {
  3141.                             responseReadTimeout = timeoutMessage;
  3142.                         }
  3143.                     }
  3144.                     String requestLimitExceeded = null;
  3145.                     String responseLimitExceeded = null;
  3146.                     if(pddContext!=null && pddContext.containsKey(LimitedInputStream.ERROR_MSG_KEY)) {
  3147.                         String limitedExceededMessage = PdDContext.getValue(LimitedInputStream.ERROR_MSG_KEY, pddContext);
  3148.                         if(limitedExceededMessage!=null && limitedExceededMessage.startsWith(CostantiPdD.PREFIX_LIMITED_REQUEST)) {
  3149.                             requestLimitExceeded = limitedExceededMessage;
  3150.                         }
  3151.                         else if(limitedExceededMessage!=null && limitedExceededMessage.startsWith(CostantiPdD.PREFIX_LIMITED_RESPONSE)) {
  3152.                             responseLimitExceeded = limitedExceededMessage;
  3153.                         }
  3154.                     }
  3155.                     if(connettoreMsgRequest.getParseException() != null ||
  3156.                             requestReadTimeout!=null ||
  3157.                             requestLimitExceeded!=null){
  3158.                        
  3159.                         ParseException parseException = null;
  3160.                         Throwable tParsing = null;
  3161.                         String errorMsg = null;
  3162.                         if(requestReadTimeout != null) {
  3163.                             tParsing = (TimeoutIOException) pddContext.getObject(TimeoutInputStream.EXCEPTION_KEY);
  3164.                             errorMsg = tParsing.getMessage();
  3165.                         }
  3166.                         else if(requestLimitExceeded != null) {
  3167.                             tParsing = (LimitExceededIOException) pddContext.getObject(LimitedInputStream.EXCEPTION_KEY);
  3168.                             errorMsg = tParsing.getMessage();
  3169.                         }
  3170.                         else {
  3171.                             parseException = connettoreMsgRequest.getParseException();
  3172.                             tParsing = parseException.getParseException();
  3173.                             errorMsg = tParsing.getMessage();
  3174.                         }
  3175.                        
  3176.                         pddContext.addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO, true);
  3177.                         IntegrationFunctionError integrationFunctionError = IntegrationFunctionError.UNPROCESSABLE_REQUEST_CONTENT;
  3178.                         if(requestReadTimeout!=null) {
  3179.                             integrationFunctionError = IntegrationFunctionError.REQUEST_TIMED_OUT;
  3180.                         }
  3181.                         else if(requestLimitExceeded!=null) {
  3182.                             integrationFunctionError = IntegrationFunctionError.REQUEST_SIZE_EXCEEDED;
  3183.                         }
  3184.                         else if(connettoreMsgRequest.getParseException().getSourceException()!=null &&
  3185.                                 TimeoutIOException.isTimeoutIOException(connettoreMsgRequest.getParseException().getSourceException())) {
  3186.                             integrationFunctionError = IntegrationFunctionError.REQUEST_TIMED_OUT;
  3187.                         }
  3188.                         else if(connettoreMsgRequest.getParseException().getSourceException()!=null &&
  3189.                                 LimitExceededIOException.isLimitExceededIOException(connettoreMsgRequest.getParseException().getSourceException())) {
  3190.                             integrationFunctionError = IntegrationFunctionError.REQUEST_SIZE_EXCEEDED;
  3191.                         }
  3192.                         ejbUtils.setIntegrationFunctionErrorPortaApplicativa(integrationFunctionError);
  3193.                         if(localForwardEngine!=null) {
  3194.                             localForwardEngine.setIntegrationFunctionError(integrationFunctionError);
  3195.                         }
  3196.                         this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  3197.                                 ErroriIntegrazione.ERRORE_432_PARSING_EXCEPTION_RICHIESTA.getErrore432_MessaggioRichiestaMalformato(tParsing),
  3198.                                 idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore,
  3199.                                 tParsing,parseException,
  3200.                                 pddContext);
  3201.                        
  3202.                         openspcoopstate.releaseResource();
  3203.                         esito.setEsitoInvocazione(true);
  3204.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,errorMsg);
  3205.                         return esito;
  3206.                     } else if(responseMessage==null &&
  3207.                             !pddContext.containsKey(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO_PARSE_EXCEPTION)){
  3208.                         // Genero una risposta di errore
  3209.                         IntegrationFunctionError integrationFunctionError = IntegrationFunctionError.SERVICE_UNAVAILABLE;
  3210.                         if(eccezioneProcessamentoConnettore!=null && motivoErroreConsegna!=null) {
  3211.                             if(responseReadTimeout!=null) {
  3212.                                 integrationFunctionError = IntegrationFunctionError.ENDPOINT_REQUEST_TIMED_OUT;
  3213.                                 pddContext.removeObject(TimeoutInputStream.ERROR_MSG_KEY);
  3214.                                 pddContext.removeObject(TimeoutInputStream.EXCEPTION_KEY);
  3215.                             }
  3216.                             else if(responseLimitExceeded!=null) {
  3217.                                 integrationFunctionError = IntegrationFunctionError.RESPONSE_SIZE_EXCEEDED;
  3218.                                 pddContext.removeObject(LimitedInputStream.ERROR_MSG_KEY);
  3219.                                 pddContext.removeObject(LimitedInputStream.EXCEPTION_KEY);
  3220.                             }
  3221.                             else if(this.propertiesReader.isServiceUnavailableReadTimedOut(motivoErroreConsegna)){
  3222.                                 integrationFunctionError = IntegrationFunctionError.ENDPOINT_REQUEST_TIMED_OUT;
  3223.                             }
  3224.                         }
  3225.                         ejbUtils.setIntegrationFunctionErrorPortaApplicativa(integrationFunctionError);
  3226.                         if(localForwardEngine!=null) {
  3227.                             localForwardEngine.setIntegrationFunctionError(integrationFunctionError);
  3228.                         }
  3229.                         this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  3230.                                 ErroriIntegrazione.ERRORE_516_CONNETTORE_UTILIZZO_CON_ERRORE.get516_ServizioApplicativoNonDisponibile(),
  3231.                                 idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, eccezioneProcessamentoConnettore,
  3232.                                 (responseMessage!=null ? responseMessage.getParseException() : null),
  3233.                                 pddContext);
  3234.                    
  3235.                         openspcoopstate.releaseResource();
  3236.                         esito.setEsitoInvocazione(true);
  3237.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,messaggioErroreConsegnaConnettore);
  3238.                         return esito;
  3239.                     } else if(pddContext.containsKey(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO_PARSE_EXCEPTION) ||
  3240.                             responseMessage.getParseException() != null ||
  3241.                             responseReadTimeout!=null ||
  3242.                             responseLimitExceeded!=null){
  3243.                        
  3244.                         ParseException parseException = null;
  3245.                         Throwable tParsing = null;
  3246.                         String errorMsg = null;
  3247.                         if(responseReadTimeout != null) {
  3248.                             tParsing = (TimeoutIOException) pddContext.getObject(TimeoutInputStream.EXCEPTION_KEY);
  3249.                             errorMsg = tParsing.getMessage();
  3250.                         }
  3251.                         else if(responseLimitExceeded != null) {
  3252.                             tParsing = (LimitExceededIOException) pddContext.getObject(LimitedInputStream.EXCEPTION_KEY);
  3253.                             errorMsg = tParsing.getMessage();
  3254.                         }
  3255.                         else if(pddContext.containsKey(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO_PARSE_EXCEPTION)){
  3256.                             parseException = (ParseException) pddContext.getObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO_PARSE_EXCEPTION);
  3257.                             tParsing = parseException.getParseException();
  3258.                             errorMsg = tParsing.getMessage();
  3259.                         }
  3260.                         else {
  3261.                             parseException = responseMessage.getParseException();
  3262.                             tParsing = parseException.getParseException();
  3263.                             errorMsg = tParsing.getMessage();
  3264.                         }
  3265.                        
  3266.                         pddContext.addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO, true);
  3267.                         IntegrationFunctionError integrationFunctionError = IntegrationFunctionError.UNPROCESSABLE_RESPONSE_CONTENT;
  3268.                         if(responseReadTimeout!=null) {
  3269.                             integrationFunctionError = IntegrationFunctionError.ENDPOINT_REQUEST_TIMED_OUT;
  3270.                         }
  3271.                         else if(responseLimitExceeded!=null) {
  3272.                             integrationFunctionError = IntegrationFunctionError.RESPONSE_SIZE_EXCEEDED;
  3273.                         }
  3274.                         else if(parseException.getSourceException()!=null &&
  3275.                                 TimeoutIOException.isTimeoutIOException(parseException.getSourceException())) {
  3276.                             integrationFunctionError = IntegrationFunctionError.ENDPOINT_REQUEST_TIMED_OUT;
  3277.                         }
  3278.                         else if(parseException.getSourceException()!=null &&
  3279.                                 LimitExceededIOException.isLimitExceededIOException(parseException.getSourceException())) {
  3280.                             integrationFunctionError = IntegrationFunctionError.RESPONSE_SIZE_EXCEEDED;
  3281.                         }
  3282.                         ejbUtils.setIntegrationFunctionErrorPortaApplicativa(integrationFunctionError);
  3283.                         if(localForwardEngine!=null) {
  3284.                             localForwardEngine.setIntegrationFunctionError(integrationFunctionError);
  3285.                         }
  3286.                         this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  3287.                                 ErroriIntegrazione.ERRORE_440_PARSING_EXCEPTION_RISPOSTA.getErrore440_MessaggioRispostaMalformato(tParsing),
  3288.                                 idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore,
  3289.                                 tParsing,parseException,
  3290.                                 pddContext);
  3291.                        
  3292.                         openspcoopstate.releaseResource();
  3293.                         esito.setEsitoInvocazione(true);
  3294.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,errorMsg);
  3295.                         return esito;
  3296.                     }
  3297.                    
  3298.                 }else {
  3299.                     if(riconsegna){
  3300.                         ejbUtils.rollbackMessage(messaggioErroreConsegnaConnettore,dataRiconsegna,servizioApplicativo, esito);
  3301.                         esito.setEsitoInvocazione(false);
  3302.                         esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,messaggioErroreConsegnaConnettore);
  3303.                     }else{
  3304.                         ejbUtils.releaseInboxMessage(true);
  3305.                         esito.setEsitoInvocazione(true);
  3306.                         esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,messaggioErroreConsegnaConnettore);
  3307.                     }
  3308.                     openspcoopstate.releaseResource();
  3309.                     this.log.info(ConsegnaContenutiApplicativi.ID_MODULO + " errore avvenuto durante la consegna");

  3310.                     return esito;
  3311.                 }
  3312.             }





























  3313.             /* ----------- Gestione della risposta applicativa da eseguire nei seguenti casi:
  3314.                AsincronoSimmetrico (InvocazioneServizio e ConsegnaRisposta):
  3315.                   se isRicevutaApplicativa
  3316.                      - Bisogna aspettare una risposta applicativa
  3317.                      - Bisogna quindi generare un busta per la ricevuta asincrona
  3318.                   altrimenti
  3319.                      - Non serve aspettare una risposta applicativa
  3320.                      - Se si riceve un Fault, il fault viene loggato.
  3321.                AsincronoAsimmetrico(InvocazioneServizio):
  3322.                   se isRicevutaApplicativa
  3323.                      - Bisogna aspettare una risposta applicativa
  3324.                      - Bisogna quindi generare un busta per la ricevuta asincrona
  3325.                   altrimenti
  3326.                      - Non serve aspettare una risposta applicativa
  3327.                      - Se si riceve un Fault, il fault viene loggato.
  3328.                AsincronoAsimmetrico (Polling):
  3329.                   - Bisogna aspettare una risposta applicativa 'sincrona'
  3330.                   - Bisogna quindi generare un busta della risposta contenente il risultato del polling          
  3331.                Sincrono:
  3332.                   - Bisogna aspettare una risposta applicativa sincrona
  3333.                   - Bisogna quindi generare un busta della risposta  sincrona
  3334.                Altro (OneWay):
  3335.                   - Non bisogna aspettare una risposta applicativa
  3336.                   - Se si riceve un Fault, il fault viene loggato.
  3337.             ------------- */
  3338.            
  3339.             msgDiag.mediumDebug("Registrazione eventuale fault...");
  3340.             // Effettuo log del fault
  3341.             if(soapFault!=null){
  3342.                 msgDiag.addKeyword(CostantiPdD.KEY_SOAP_FAULT, SoapUtils.safe_toString(faultMessageFactory, soapFault, this.log));
  3343.                 msgDiag.logPersonalizzato("ricezioneSoapFault");
  3344.             }
  3345.             else if(restProblem!=null){
  3346.                 // Se non l'ho gia indicato nel motivo di errore, registro il fault
  3347.                 msgDiag.addKeyword(CostantiPdD.KEY_REST_PROBLEM, restProblem.getRaw());
  3348.                 msgDiag.logPersonalizzato("ricezioneRestProblem");
  3349.             }
  3350.            
  3351.             if(existsModuloInAttesaRispostaApplicativa){

  3352.                 if( !localForward && richiestaApplicativa!=null && Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(richiestaApplicativa.getScenario())){

  3353.                     // Oneway in modalita sincrona

  3354.                     boolean returnProtocolReply = false;        
  3355.                     Busta bustaHTTPReply = null;
  3356.                    
  3357.                     boolean consegnaAffidabile = false;
  3358.                     switch (protocolManager.getConsegnaAffidabile(bustaIndicazioneConsegnaInOrdine)) {
  3359.                     case ABILITATA:
  3360.                         consegnaAffidabile = true;
  3361.                         break;
  3362.                     case DISABILITATA:
  3363.                         consegnaAffidabile = false;
  3364.                         break;
  3365.                     default:
  3366.                         consegnaAffidabile = bustaRichiesta.isConfermaRicezione() &&
  3367.                             this.propertiesReader.isGestioneRiscontri(implementazionePdDMittente);
  3368.                         break;
  3369.                     }
  3370.                    
  3371.                     if(consegnaAffidabile){
  3372.                         msgDiag.mediumDebug("Gestione eventuali riscontri da inviare...");
  3373.                         if(ProfiloDiCollaborazione.ONEWAY.equals(bustaRichiesta.getProfiloDiCollaborazione()) ) {  
  3374.                             TipoOraRegistrazione tipoOraRegistrazione = this.propertiesReader.getTipoTempoBusta(implementazionePdDMittente);
  3375.                             bustaHTTPReply = bustaRichiesta.invertiBusta(tipoOraRegistrazione,
  3376.                                     protocolFactory.createTraduttore().toString(tipoOraRegistrazione));

  3377.                             // Riscontro ad hoc
  3378.                             Riscontro r = new Riscontro();
  3379.                             r.setID(bustaRichiesta.getID());
  3380.                             r.setOraRegistrazione(bustaHTTPReply.getOraRegistrazione());
  3381.                             r.setTipoOraRegistrazione(this.propertiesReader.getTipoTempoBusta(implementazionePdDMittente));
  3382.                             bustaHTTPReply.addRiscontro(r);
  3383.                             bustaHTTPReply.setTipoServizioRichiedenteBustaDiServizio(bustaRichiesta.getTipoServizio());
  3384.                             bustaHTTPReply.setServizioRichiedenteBustaDiServizio(bustaRichiesta.getServizio());
  3385.                             bustaHTTPReply.setVersioneServizioRichiedenteBustaDiServizio(bustaRichiesta.getVersioneServizio());
  3386.                             bustaHTTPReply.setAzioneRichiedenteBustaDiServizio(bustaRichiesta.getAzione());

  3387.                             returnProtocolReply = true;
  3388.                         }
  3389.                     }

  3390.                     if( returnProtocolReply == false){

  3391.                         if(soapFault!=null || restProblem!=null){
  3392.                             // Devo ritornare il SoapFault
  3393.                             msgDiag.mediumDebug("Invio messaggio di fault a Ricezione/Consegna ContenutiApplicativi...");
  3394.                             msgResponse = ejbUtils.sendSOAPFault(richiestaApplicativa.getIdModuloInAttesa(),responseMessage);
  3395.                         }
  3396.                         else{
  3397.                             // Invio sblocco se e' attesa una risposta dal modulo
  3398.                             // Se non e' abilitato la risposta su di una nuova connessione, e l'indirizzo telematico
  3399.                             // non e' abilitato o cmq non presente, allora devo inviare lo sblocco
  3400.                             msgDiag.mediumDebug("Invio messaggio di sblocco a RicezioneBuste...");
  3401.                             msgResponse = ejbUtils.sendSbloccoRicezioneBuste(richiestaApplicativa.getIdModuloInAttesa());
  3402.                         }
  3403.                     }
  3404.                     else{

  3405.                         // Invio risposta immediata in seguito alla richiesta ricevuta
  3406.                         if(soapFault!=null || restProblem!=null){
  3407.                             // Devo ritornare il SoapFault
  3408.                             msgDiag.mediumDebug("Invio messaggio di fault a Ricezione/Consegna ContenutiApplicativi...");
  3409.                             msgResponse = ejbUtils.sendSOAPFault(richiestaApplicativa.getIdModuloInAttesa(),responseMessage);
  3410.                         }
  3411.                         else{
  3412.                             msgDiag.mediumDebug("Invio messaggio a Ricezione/Consegna ContenutiApplicativi...");
  3413.                             msgResponse = ejbUtils.buildAndSendBustaRisposta(richiestaApplicativa.getIdModuloInAttesa(),bustaHTTPReply,
  3414.                                     MessageUtilities.buildEmptyMessage(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),
  3415.                                             requestInfo.getProtocolRequestMessageType(), MessageRole.RESPONSE),profiloGestione,
  3416.                                     idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta,servizioApplicativoFruitore);
  3417.                         }
  3418.                     }
  3419.                 }
  3420.                 else{
  3421.                     /*-- analisi risposta per riferimento -- */
  3422.                     if(rispostaPerRiferimento && !errorConsegna){
  3423.                         msgDiag.mediumDebug("Gestione risposta per riferimento...");
  3424.                         boolean rilasciaRisorsa = false;
  3425.                         if(openspcoopstate instanceof OpenSPCoopStateless){
  3426.                             OpenSPCoopStateless state = (OpenSPCoopStateless) openspcoopstate;
  3427.                             // La risposta per riferimento ha bisogno della connessione.
  3428.                             if (state.resourceReleased()){
  3429.                                 // Risorsa e' rilasciata se siamo in RinegoziamentoConnessione
  3430.                                 state.setUseConnection(true);
  3431.                                 state.updateResource(idTransazione);
  3432.                                 rilasciaRisorsa = true;
  3433.                             }else{
  3434.                                 // Non siamo in RinegoziamentoConnessione, basta dire di utilizzare la connessione
  3435.                                 state.setUseConnection(true);
  3436.                             }
  3437.                         }
  3438.                         try{
  3439.                             if(MessageType.SOAP_11.equals(responseMessage.getMessageType())==false){
  3440.                                 throw new Exception("Tipo di messaggio ["+responseMessage.getMessageType()+"] non supportato");
  3441.                             }
  3442.                            
  3443.                             // 1. Read IDMessaggio
  3444.                             // L'id del messaggio deve essere prelevato dal messaggio di risposta ritornato dal gestore eventi.
  3445.                             Node prelevaMessaggioResponse = responseMessage.castAsSoap().getSOAPBody().getFirstChild();
  3446.                             if(prelevaMessaggioResponse==null)
  3447.                                 throw new Exception("Identificativo non presente [prelevaMessaggioResponse]");
  3448.                             Node prelevaMessaggioReturn = prelevaMessaggioResponse.getFirstChild();
  3449.                             if(prelevaMessaggioReturn==null)
  3450.                                 throw new Exception("Identificativo non presente [prelevaMessaggioReturn]");
  3451.                             Node idMessaggioPresenteNelRepositoryNode = prelevaMessaggioReturn.getFirstChild();
  3452.                             if(idMessaggioPresenteNelRepositoryNode==null)
  3453.                                 throw new Exception("Identificativo non presente [idMessaggioPresenteNelRepositoryNode]");
  3454.                             byte[] idMessaggioPresenteNelRepositoryByte = Base64Utilities.decode(idMessaggioPresenteNelRepositoryNode.getNodeValue());
  3455.                             String idMessaggioPresenteNelRepository = new String(idMessaggioPresenteNelRepositoryByte);
  3456.                             //if(idMessaggioPresenteNelRepository==null)
  3457.                             //  throw new Exception("Identificativo non presente");


  3458.                             // 2. get Messaggio dal Repository
  3459.                             GestoreMessaggi gestoreMsgFromRepository = new GestoreMessaggi(openspcoopstate, false, idMessaggioPresenteNelRepository,Costanti.INBOX,msgDiag,pddContext);
  3460.                             OpenSPCoop2Message msgFromRepository = gestoreMsgFromRepository.getMessage();
  3461.                             //if(idMessaggioPresenteNelRepository==null)
  3462.                             //  throw new Exception("Messaggio non presente nel repository");

  3463.                             // 3. prendo body applicativo
  3464.                             byte[] bodyApplicativoPrecedentementePubblicato = TunnelSoapUtils.sbustamentoMessaggio(msgFromRepository);

  3465.                             // 4. Inserimento dei byte del body applicativo al posto dell'ID,
  3466.                             //    nel msg ritornato dal GestoreEventi.
  3467.                             //    La variabile responseMessage deve contenere il messaggio Soap che sara' ritornato a chi ha richiesto un messaggio
  3468.                             responseMessage = gestoreMsgFromRepository.buildRispostaPrelevamentoMessaggio_RepositoryMessaggi(bodyApplicativoPrecedentementePubblicato,msgFromRepository.getMessageType());
  3469.                            
  3470.                         }catch(Exception e){
  3471.                             msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_CONSEGNA, ("risposta per riferimento non costruita, "+e.getMessage()));
  3472.                             if(bustaRichiesta.getMittente()!=null && bustaRichiesta.getTipoMittente()!=null){
  3473.                                 msgDiag.logPersonalizzato("consegnaConErrore");
  3474.                             }
  3475.                             else{
  3476.                                 msgDiag.logPersonalizzato("consegnaConErrore.mittenteAnonimo");
  3477.                             }
  3478.                            
  3479.                             this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  3480.                                     ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3481.                                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_511_READ_RESPONSE_MSG),
  3482.                                     idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  3483.                                     (responseMessage!=null ? responseMessage.getParseException() : null),
  3484.                                     pddContext);
  3485.                        
  3486.                             esito.setEsitoInvocazione(true);
  3487.                             esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO, "risposta per riferimento non costruita, "+e.getMessage());
  3488.                             openspcoopstate.releaseResource();
  3489.                             return esito;
  3490.                         }finally{
  3491.                             if(openspcoopstate instanceof OpenSPCoopStateless){
  3492.                                 OpenSPCoopStateless state = (OpenSPCoopStateless) openspcoopstate;
  3493.                                 if(rilasciaRisorsa){
  3494.                                     state.releaseResource();
  3495.                                 }
  3496.                                 state.setUseConnection(false);
  3497.                             }
  3498.                         }
  3499.                     }

  3500.                     msgDiag.mediumDebug("Gestione risposta...");
  3501.                     boolean rispostaVuotaValidaPerAsincroniStateless_modalitaAsincrona = false;
  3502.                     if(responseMessage == null &&
  3503.                             !(localForward && richiestaApplicativa!=null && Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(richiestaApplicativa.getScenario())) ){

  3504.                         if( (Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_INVOCAZIONE_SERVIZIO.equals(scenarioCooperazione) ||
  3505.                                 Costanti.SCENARIO_ASINCRONO_SIMMETRICO_INVOCAZIONE_SERVIZIO.equals(scenarioCooperazione) ||
  3506.                                 Costanti.SCENARIO_ASINCRONO_SIMMETRICO_CONSEGNA_RISPOSTA.equals(scenarioCooperazione) )
  3507.                                 && portaDiTipoStateless
  3508.                                 && (!isRicevutaAsincrona) ){
  3509.                             rispostaVuotaValidaPerAsincroniStateless_modalitaAsincrona = true;
  3510.                             responseMessage = MessageUtilities.buildEmptyMessage(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),
  3511.                                     requestInfo.getProtocolRequestMessageType(), MessageRole.RESPONSE); // Costruisce messaggio vuoto per inserire busta (ricevuta asincrona)
  3512.                         }
  3513.                         else{
  3514.                             msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_CONSEGNA, ("risposta applicativa attesa ma non ricevuta"));
  3515.                             if(bustaRichiesta.getMittente()!=null && bustaRichiesta.getTipoMittente()!=null){
  3516.                                 msgDiag.logPersonalizzato("consegnaConErrore");
  3517.                             }
  3518.                             else{
  3519.                                 msgDiag.logPersonalizzato("consegnaConErrore.mittenteAnonimo");
  3520.                             }
  3521.                            
  3522.                             ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.EXPECTED_RESPONSE_NOT_FOUND);
  3523.                             if(localForwardEngine!=null) {
  3524.                                 localForwardEngine.setIntegrationFunctionError(IntegrationFunctionError.EXPECTED_RESPONSE_NOT_FOUND);
  3525.                             }
  3526.                             this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  3527.                                     ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3528.                                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_517_RISPOSTA_RICHIESTA_NON_RITORNATA),
  3529.                                     idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, null,
  3530.                                     (responseMessage!=null ? responseMessage.getParseException() : null),
  3531.                                     pddContext);
  3532.                            
  3533.                             openspcoopstate.releaseResource();
  3534.                             esito.setEsitoInvocazione(true);
  3535.                             esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"risposta applicativa attesa ma non ricevuta");

  3536.                             return esito;
  3537.                         }

  3538.                     }
  3539.                    
  3540.                     if(rispostaVuotaValidaPerAsincroniStateless_modalitaAsincrona==false
  3541.                             && transazioneApplicativoServer==null // non ha senso per le notifiche asincrone tutte le operazioni presenti in questo corpo (validazione, correlazione, header di integrazione)
  3542.                             ){
  3543.                        
  3544.                         if(validazioneContenutoApplicativoApplicativo!=null && validazioneContenutoApplicativoApplicativo.getTipo()!=null){
  3545.                             String tipo = ValidatoreMessaggiApplicativi.getTipo(validazioneContenutoApplicativoApplicativo);
  3546.                             //this.msgContext.getIntegrazione().setTipoValidazioneContenuti(tipo);
  3547.                             msgDiag.addKeyword(CostantiPdD.KEY_TIPO_VALIDAZIONE_CONTENUTI, tipo);
  3548.                             msgDiag.addKeyword(CostantiPdD.KEY_DETAILS_VALIDAZIONE_CONTENUTI,"");
  3549.                         }
  3550.                        
  3551.                         // Verifica xsd  (Se siamo in un caso di risposta applicativa presente)
  3552.                         if(
  3553.                                 (responseMessage!=null)
  3554.                                 &&
  3555.                                 (validazioneContenutoApplicativoApplicativo!=null)
  3556.                                 &&
  3557.                                 (
  3558.                                         CostantiConfigurazione.STATO_CON_WARNING_ABILITATO.equals(validazioneContenutoApplicativoApplicativo.getStato())
  3559.                                         ||
  3560.                                         CostantiConfigurazione.STATO_CON_WARNING_WARNING_ONLY.equals(validazioneContenutoApplicativoApplicativo.getStato())
  3561.                                 )
  3562.                             ){

  3563.                             if(transactionNullable!=null) {
  3564.                                 transactionNullable.getTempiElaborazione().startValidazioneRisposta();
  3565.                             }
  3566.                             ByteArrayInputStream binXSD = null;
  3567.                             try{
  3568.                                 boolean hasContent = false;
  3569.                                 boolean isFault = false;
  3570.                                 if(ServiceBinding.SOAP.equals(responseMessage.getServiceBinding())){
  3571.                                     OpenSPCoop2SoapMessage soapMsg = responseMessage.castAsSoap();
  3572.                                     hasContent = !soapMsg.isSOAPBodyEmpty();
  3573.                                     isFault = soapMsg.isFault();
  3574.                                 }
  3575.                                 else{
  3576.                                     //org.openspcoop2.message.OpenSPCoop2RestMessage<?> restMsg = responseMessage.castAsRest();
  3577.                                     //hasContent = restMsg.hasContent();
  3578.                                     hasContent = true; // devo controllare gli header etc...
  3579.                                     // fix: i problem detail devono far parte dell'interfaccia openapi
  3580.                                     //isFault = restMsg.isProblemDetailsForHttpApis_RFC7807() || MessageRole.FAULT.equals(responseMessage.getMessageRole());
  3581.                                     isFault = MessageRole.FAULT.equals(responseMessage.getMessageRole());
  3582.                                 }
  3583.                                
  3584.                                 boolean validazioneAbilitata = true;
  3585.                                 if(ServiceBinding.SOAP.equals(responseMessage.getServiceBinding())){
  3586.                                     validazioneAbilitata = hasContent && (isFault==false);
  3587.                                 }
  3588.                                 else {
  3589.                                     validazioneAbilitata = ValidatoreMessaggiApplicativiRest.isValidazioneAbilitata(this.log,proprietaPorta, responseMessage, codiceRitornato);
  3590.                                 }
  3591.                                 if( validazioneAbilitata ){
  3592.                                    
  3593.                                     msgDiag.logPersonalizzato("validazioneContenutiApplicativiRispostaInCorso");
  3594.                                    
  3595.                                     boolean readInterface = CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_INTERFACE.equals(validazioneContenutoApplicativoApplicativo.getTipo());
  3596.                                     IDServizio idSValidazioneXSD = idServizio;
  3597.                                     if(servizioHeaderIntegrazione!=null){
  3598.                                         idSValidazioneXSD = servizioHeaderIntegrazione;
  3599.                                     }
  3600.                                    
  3601.                                     if(ServiceBinding.SOAP.equals(responseMessage.getServiceBinding())){
  3602.                                    
  3603.                                         // Accept mtom message
  3604.                                         List<MtomXomReference> xomReferences = null;
  3605.                                         if(StatoFunzionalita.ABILITATO.equals(validazioneContenutoApplicativoApplicativo.getAcceptMtomMessage())){
  3606.                                             msgDiag.mediumDebug("Validazione xsd della risposta (mtomFastUnpackagingForXSDConformance)...");
  3607.                                             xomReferences = responseMessage.castAsSoap().mtomFastUnpackagingForXSDConformance();
  3608.                                         }
  3609.                                        
  3610.                                         // Init Validatore
  3611.                                         msgDiag.mediumDebug("Validazione della risposta (initValidator)...");
  3612.                                         ValidatoreMessaggiApplicativi validatoreMessaggiApplicativi =
  3613.                                             new ValidatoreMessaggiApplicativi(registroServiziManager,idSValidazioneXSD,
  3614.                                                     responseMessage,readInterface,
  3615.                                                     this.propertiesReader.isValidazioneContenutiApplicativiRpcLiteralXsiTypeGestione(),
  3616.                                                     proprietaPorta,
  3617.                                                     pddContext);
  3618.    
  3619.                                         // Validazione WSDL
  3620.                                         if( CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_INTERFACE.equals(validazioneContenutoApplicativoApplicativo.getTipo())
  3621.                                                 ||
  3622.                                                 CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_OPENSPCOOP.equals(validazioneContenutoApplicativoApplicativo.getTipo())
  3623.                                         ){
  3624.                                             msgDiag.mediumDebug("Validazione wsdl della risposta ...");
  3625.                                             validatoreMessaggiApplicativi.validateWithWsdlLogicoImplementativo(false);
  3626.                                         }
  3627.                                        
  3628.                                         // Validazione XSD
  3629.                                         msgDiag.mediumDebug("Validazione xsd della risposta ...");
  3630.                                         validatoreMessaggiApplicativi.validateWithWsdlDefinitorio(false);
  3631.                                        
  3632.                                         // Validazione WSDL (Restore Original Document)
  3633.                                         if (CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_INTERFACE.equals(validazioneContenutoApplicativoApplicativo.getTipo())
  3634.                                             || CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_OPENSPCOOP.equals(validazioneContenutoApplicativoApplicativo.getTipo())) {
  3635.                                             if(this.propertiesReader.isValidazioneContenutiApplicativiRpcLiteralXsiTypeGestione() &&
  3636.                                                     this.propertiesReader.isValidazioneContenutiApplicativiRpcLiteralXsiTypeRipulituraDopoValidazione()){
  3637.                                                 msgDiag.mediumDebug("Ripristino elementi modificati per supportare validazione wsdl della risposta ...");
  3638.                                                 validatoreMessaggiApplicativi.restoreOriginalDocument(false);
  3639.                                             }
  3640.                                         }
  3641.                                        
  3642.                                         // Ripristino struttura messaggio con xom
  3643.                                         if(xomReferences!=null && xomReferences.size()>0){
  3644.                                             msgDiag.mediumDebug("Validazione xsd della risposta (mtomRestoreAfterXSDConformance)...");
  3645.                                             responseMessage.castAsSoap().mtomRestoreAfterXSDConformance(xomReferences);
  3646.                                         }
  3647.                                        
  3648.                                     }
  3649.                                     else {
  3650.                                        
  3651.                                         // Init Validatore
  3652.                                         msgDiag.mediumDebug("Validazione della risposta (initValidator)...");
  3653.                                         ValidatoreMessaggiApplicativiRest validatoreMessaggiApplicativi =
  3654.                                             new ValidatoreMessaggiApplicativiRest(registroServiziManager, idSValidazioneXSD, responseMessage, readInterface, proprietaPorta,
  3655.                                                     protocolFactory, pddContext);
  3656.                                        
  3657.                                         if(CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_XSD.equals(validazioneContenutoApplicativoApplicativo.getTipo()) &&
  3658.                                                 responseMessage.castAsRest().hasContent()) {
  3659.                                            
  3660.                                             // Validazione XSD
  3661.                                             msgDiag.mediumDebug("Validazione xsd della risposta ...");
  3662.                                             validatoreMessaggiApplicativi.validateWithSchemiXSD(false);
  3663.                                            
  3664.                                         }
  3665.                                         else {
  3666.                                            
  3667.                                             // Validazione Interface
  3668.                                             validatoreMessaggiApplicativi.validateResponseWithInterface(consegnaMessagePrimaTrasformazione, true);
  3669.                                            
  3670.                                         }
  3671.                                        
  3672.                                     }

  3673.                                     msgDiag.logPersonalizzato("validazioneContenutiApplicativiRispostaEffettuata");
  3674.                                 }
  3675.                                 else{
  3676.                                     if(hasContent==false){
  3677.                                         msgDiag.addKeyword(CostantiPdD.KEY_DETAILS_VALIDAZIONE_CONTENUTI,CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_VALIDAZIONE_SOAP_BODY_NON_PRESENTE);
  3678.                                         msgDiag.logPersonalizzato("validazioneContenutiApplicativiRispostaDisabilitata");
  3679.                                     }
  3680.                                     else if (isFault ){
  3681.                                         msgDiag.addKeyword(CostantiPdD.KEY_DETAILS_VALIDAZIONE_CONTENUTI,CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_VALIDAZIONE_SOAP_FAULT_PRESENTE);
  3682.                                         msgDiag.logPersonalizzato("validazioneContenutiApplicativiRispostaDisabilitata");
  3683.                                     }
  3684.                                 }

  3685.                             }catch(ValidatoreMessaggiApplicativiException ex){
  3686.                                 msgDiag.addKeywordErroreProcessamento(ex);
  3687.                                 this.log.error("[ValidazioneContenutiApplicativi Risposta] "+ex.getMessage(),ex);
  3688.                                 if (CostantiConfigurazione.STATO_CON_WARNING_WARNING_ONLY.equals(validazioneContenutoApplicativoApplicativo.getStato())) {
  3689.                                     msgDiag.logPersonalizzato("validazioneContenutiApplicativiRispostaNonRiuscita.warningOnly");
  3690.                                 }
  3691.                                 else {
  3692.                                     msgDiag.logPersonalizzato("validazioneContenutiApplicativiRispostaNonRiuscita");
  3693.                                 }
  3694.                                 if(CostantiConfigurazione.STATO_CON_WARNING_WARNING_ONLY.equals(validazioneContenutoApplicativoApplicativo.getStato()) == false){
  3695.                                    
  3696.                                     // validazione abilitata
  3697.                                    
  3698.                                     pddContext.addObject(org.openspcoop2.core.constants.Costanti.ERRORE_VALIDAZIONE_RISPOSTA, "true");
  3699.                                    
  3700.                                     IntegrationFunctionError integrationFunctionError = null;
  3701.                                     if(ex.getErrore()!=null &&
  3702.                                             (
  3703.                                                     //CodiceErroreIntegrazione.CODICE_417_COSTRUZIONE_VALIDATORE_TRAMITE_INTERFACCIA_FALLITA.equals(ex.getErrore().getCodiceErrore()) ||
  3704.                                                     CodiceErroreIntegrazione.CODICE_419_VALIDAZIONE_RISPOSTA_TRAMITE_INTERFACCIA_FALLITA.equals(ex.getErrore().getCodiceErrore())
  3705.                                             )
  3706.                                         ){
  3707.                                         integrationFunctionError = IntegrationFunctionError.INVALID_RESPONSE_CONTENT;
  3708.                                     }
  3709.                                     else{
  3710.                                         integrationFunctionError = IntegrationFunctionError.INTERNAL_RESPONSE_ERROR;
  3711.                                     }
  3712.                                    
  3713.                                     ejbUtils.setIntegrationFunctionErrorPortaApplicativa(integrationFunctionError);
  3714.                                     if(localForwardEngine!=null) {
  3715.                                         localForwardEngine.setIntegrationFunctionError(integrationFunctionError);
  3716.                                     }
  3717.                                    
  3718.                                     this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  3719.                                             ex.getErrore(),
  3720.                                             idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, ex,
  3721.                                             (responseMessage!=null ? responseMessage.getParseException() : null),
  3722.                                             pddContext);
  3723.                                    
  3724.                                     openspcoopstate.releaseResource();
  3725.                                     esito.setEsitoInvocazione(true);
  3726.                                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  3727.                                             msgDiag.getMessaggio_replaceKeywords("validazioneContenutiApplicativiNonRiuscita"));
  3728.                                     return esito;
  3729.                                 }
  3730.                             }catch(Exception ex){
  3731.                                 msgDiag.addKeywordErroreProcessamento(ex);
  3732.                                 this.log.error("Riscontrato errore durante la validazione xsd della risposta applicativa",ex);
  3733.                                 if (CostantiConfigurazione.STATO_CON_WARNING_WARNING_ONLY.equals(validazioneContenutoApplicativoApplicativo.getStato())) {
  3734.                                     msgDiag.logPersonalizzato("validazioneContenutiApplicativiRispostaNonRiuscita.warningOnly");
  3735.                                 }
  3736.                                 else {
  3737.                                     msgDiag.logPersonalizzato("validazioneContenutiApplicativiRispostaNonRiuscita");
  3738.                                 }
  3739.                                 if(CostantiConfigurazione.STATO_CON_WARNING_WARNING_ONLY.equals(validazioneContenutoApplicativoApplicativo.getStato()) == false){
  3740.                                    
  3741.                                     pddContext.addObject(org.openspcoop2.core.constants.Costanti.ERRORE_VALIDAZIONE_RISPOSTA, "true");
  3742.                                    
  3743.                                     // validazione abilitata
  3744.                                    
  3745.                                     this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  3746.                                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3747.                                                 get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_531_VALIDAZIONE_TRAMITE_INTERFACCIA_FALLITA),
  3748.                                             idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, ex,
  3749.                                             (responseMessage!=null ? responseMessage.getParseException() : null),
  3750.                                             pddContext);
  3751.                                
  3752.                                     openspcoopstate.releaseResource();
  3753.                                     esito.setEsitoInvocazione(true);
  3754.                                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  3755.                                             msgDiag.getMessaggio_replaceKeywords("validazioneContenutiApplicativiNonRiuscita"));
  3756.                                     return esito;
  3757.                                 }
  3758.                             }finally{
  3759.                                 if(transactionNullable!=null) {
  3760.                                     transactionNullable.getTempiElaborazione().endValidazioneRisposta();
  3761.                                 }
  3762.                                 if(binXSD!=null){
  3763.                                     try{
  3764.                                         binXSD.close();
  3765.                                     }catch(Exception e){
  3766.                                         // close
  3767.                                     }  
  3768.                                 }
  3769.                             }
  3770.                         }
  3771.                         else{
  3772.                             msgDiag.logPersonalizzato("validazioneContenutiApplicativiRispostaDisabilitata");
  3773.                         }


  3774.                        
  3775.                         /* ------------  Header integrazione Risposta ------------- */
  3776.                        
  3777.                         HeaderIntegrazione headerIntegrazioneRisposta = new HeaderIntegrazione(idTransazione);      
  3778.                         InResponsePAMessage inResponsePAMessage = new InResponsePAMessage();
  3779.                         inResponsePAMessage.setBustaRichiesta(bustaRichiesta);
  3780.                         inResponsePAMessage.setMessage(responseMessage);
  3781.                         if(pa!=null)
  3782.                             inResponsePAMessage.setPortaApplicativa(pa);
  3783.                         else
  3784.                             inResponsePAMessage.setPortaDelegata(pd);
  3785.                         inResponsePAMessage.setHeaders(connectorSender.getHeaderTrasporto());
  3786.                         inResponsePAMessage.setServizio(outRequestPAMessage.getServizio());
  3787.                         inResponsePAMessage.setSoggettoMittente(outRequestPAMessage.getSoggettoMittente());
  3788.                         Utilities.printFreeMemory("ConsegnaContenutiApplicativi - Gestione Header Integrazione... ");                  
  3789.                         for(int i=0; i<tipiIntegrazione.length;i++){
  3790.                             try{
  3791.                                 IGestoreIntegrazionePA gestore = null;
  3792.                                 try{
  3793.                                     gestore = (IGestoreIntegrazionePA) this.pluginLoader.newIntegrazionePortaApplicativa(tipiIntegrazione[i]);
  3794.                                 }catch(Exception e){
  3795.                                     throw e;
  3796.                                 }
  3797.                                 if(gestore!=null){
  3798.                                     String classType = null;
  3799.                                     try {
  3800.                                         classType = gestore.getClass().getName();
  3801.                                         AbstractCore.init(gestore, pddContext, protocolFactory);
  3802.                                     }catch(Exception e){
  3803.                                         throw new Exception("Riscontrato errore durante l'inizializzazione della classe ["+classType+
  3804.                                                 "] da utilizzare per la gestione dell'integrazione (Risposta) delle erogazione di tipo ["+tipiIntegrazione[i]+"]: "+e.getMessage());
  3805.                                     }
  3806.                                     if(responseMessage!=null){
  3807.                                         gestore.readInResponseHeader(headerIntegrazioneRisposta,inResponsePAMessage);
  3808.                                     }else if( ! (gestore instanceof IGestoreIntegrazionePASoap) ){
  3809.                                         gestore.readInResponseHeader(headerIntegrazioneRisposta,inResponsePAMessage);
  3810.                                     }
  3811.                                 }
  3812.                             } catch (Exception e) {
  3813.                                 this.log.debug("Errore durante la lettura dell'header di integrazione ["+ tipiIntegrazione[i]
  3814.                                         + "]: "+ e.getMessage(),e);
  3815.                                 msgDiag.addKeyword(CostantiPdD.KEY_TIPO_HEADER_INTEGRAZIONE,tipiIntegrazione[i]);
  3816.                                 msgDiag.addKeywordErroreProcessamento(e);
  3817.                                 msgDiag.logPersonalizzato("headerIntegrazione.letturaFallita");
  3818.                             }
  3819.                         }
  3820.                        
  3821.                         /* ------------  Correlazione Applicativa Risposta ------------- */
  3822.                         if(correlazioneApplicativaRisposta!=null){
  3823.                             Utilities.printFreeMemory("ConsegnaContenutiApplicativi - CorrelazioneApplicativa... ");    
  3824.                             GestoreCorrelazioneApplicativa gestoreCorrelazione = null;
  3825.                             try{
  3826.                                
  3827.                                 GestoreCorrelazioneApplicativaConfig caConfig = new GestoreCorrelazioneApplicativaConfig();
  3828.                                 caConfig.setState(openspcoopstate.getStatoRisposta());
  3829.                                 caConfig.setAlog(this.log);
  3830.                                 caConfig.setSoggettoFruitore(soggettoFruitore);
  3831.                                 caConfig.setIdServizio(idServizio);
  3832.                                 caConfig.setBusta(bustaRichiesta);
  3833.                                 caConfig.setServizioApplicativo(servizioApplicativo);
  3834.                                 caConfig.setProtocolFactory(protocolFactory);
  3835.                                 caConfig.setTransaction(transactionNullable);
  3836.                                 caConfig.setPddContext(pddContext);
  3837.                                
  3838.                                 if(pa!=null) {
  3839.                                     caConfig.setPa(pa);
  3840.                                     gestoreCorrelazione = new GestoreCorrelazioneApplicativa(caConfig);
  3841.                                 }
  3842.                                 else if(pd!=null) {
  3843.                                     caConfig.setPd(pd);
  3844.                                     gestoreCorrelazione = new GestoreCorrelazioneApplicativa(caConfig);
  3845.                                 }
  3846.                                
  3847.                                 if(gestoreCorrelazione!=null){
  3848.                                     gestoreCorrelazione.verificaCorrelazioneRisposta(correlazioneApplicativaRisposta, responseMessage, headerIntegrazioneRisposta, false);
  3849.                                    
  3850.                                     idCorrelazioneApplicativaRisposta = gestoreCorrelazione.getIdCorrelazione();
  3851.                                    
  3852.                                     if(idCorrelazioneApplicativaRisposta!=null) {
  3853.                                         if(transactionNullable!=null) {
  3854.                                             transactionNullable.setCorrelazioneApplicativaRisposta(idCorrelazioneApplicativaRisposta);
  3855.                                         }
  3856.                                     }
  3857.                                    
  3858.                                     if(richiestaApplicativa!=null)
  3859.                                         richiestaApplicativa.setIdCorrelazioneApplicativaRisposta(idCorrelazioneApplicativaRisposta);
  3860.                                     else if(richiestaDelegata!=null)
  3861.                                         richiestaDelegata.setIdCorrelazioneApplicativaRisposta(idCorrelazioneApplicativaRisposta);
  3862.                                                            
  3863.                                     msgDiag.setIdCorrelazioneRisposta(idCorrelazioneApplicativaRisposta);
  3864.                                 }
  3865.                                
  3866.                             }catch(Exception e){
  3867.                                
  3868.                                 pddContext.addObject(org.openspcoop2.core.constants.Costanti.ERRORE_CORRELAZIONE_APPLICATIVA_RISPOSTA, "true");
  3869.                                
  3870.                                 msgDiag.logErroreGenerico(e,"CorrelazioneApplicativaRisposta");
  3871.                                 this.log.error("Riscontrato errore durante il controllo di correlazione applicativa della risposta: "+ e.getMessage(),e);
  3872.                                
  3873.                                 ErroreIntegrazione errore = null;
  3874.                                 if(gestoreCorrelazione!=null){
  3875.                                     errore = gestoreCorrelazione.getErrore();
  3876.                                 }
  3877.                                 if(errore==null){
  3878.                                     errore = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3879.                                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_553_CORRELAZIONE_APPLICATIVA_RISPOSTA_NON_RIUSCITA);
  3880.                                 }
  3881.                                
  3882.                                 ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.APPLICATION_CORRELATION_IDENTIFICATION_RESPONSE_FAILED);
  3883.                                 if(localForwardEngine!=null) {
  3884.                                     localForwardEngine.setIntegrationFunctionError(IntegrationFunctionError.APPLICATION_CORRELATION_IDENTIFICATION_RESPONSE_FAILED);
  3885.                                 }
  3886.                                
  3887.                                 this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  3888.                                         errore,
  3889.                                         idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  3890.                                         (responseMessage!=null ? responseMessage.getParseException() : null),
  3891.                                         pddContext);
  3892.                                
  3893.                                 esito.setEsitoInvocazione(true);
  3894.                                 esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  3895.                                         "Riscontrato errore durante il controllo di correlazione applicativa della risposta: "+ e.getMessage());
  3896.                                 openspcoopstate.releaseResource();
  3897.                                 return esito;
  3898.                             }
  3899.                         }
  3900.                        
  3901.                         /* ------------  Header integrazione Risposta (Update/Delete) ------------- */
  3902.                        
  3903.                         Utilities.printFreeMemory("ConsegnaContenutiApplicativi - Update/Delete Header Integrazione... ");                  
  3904.                         for(int i=0; i<tipiIntegrazione.length;i++){
  3905.                             try{
  3906.                                 IGestoreIntegrazionePA gestore = null;
  3907.                                 try{
  3908.                                     gestore = (IGestoreIntegrazionePA) this.pluginLoader.newIntegrazionePortaApplicativa(tipiIntegrazione[i]);
  3909.                                 }catch(Exception e){
  3910.                                     throw e;
  3911.                                 }
  3912.                                 if(gestore!=null){
  3913.                                     String classType = null;
  3914.                                     try {
  3915.                                         classType = gestore.getClass().getName();
  3916.                                         AbstractCore.init(gestore, pddContext, protocolFactory);
  3917.                                     }catch(Exception e){
  3918.                                         throw new Exception("Riscontrato errore durante l'inizializzazione della classe ["+classType+
  3919.                                                 "] da utilizzare per la gestione dell'integrazione (Risposta Update/Delete) delle erogazione di tipo ["+tipiIntegrazione[i]+"]: "+e.getMessage());
  3920.                                     }
  3921.                                     if (responseMessage!=null && (gestore instanceof IGestoreIntegrazionePASoap) ) {
  3922.                                         if(this.propertiesReader.deleteHeaderIntegrazioneResponsePA()){
  3923.                                             ((IGestoreIntegrazionePASoap)gestore).deleteInResponseHeader(inResponsePAMessage);
  3924.                                         }else{
  3925.                                             ((IGestoreIntegrazionePASoap)gestore).updateInResponseHeader(inResponsePAMessage, idMessaggioConsegna, idMessageResponse, servizioApplicativoFruitore,
  3926.                                                     idCorrelazioneApplicativaRisposta, idCorrelazioneApplicativa);
  3927.                                         }
  3928.                                     }
  3929.                                 }
  3930.                             } catch (Exception e) {
  3931.                                 this.log.debug("Errore durante la lettura dell'header di integrazione ["+ tipiIntegrazione[i]
  3932.                                         + "]: "+ e.getMessage(),e);
  3933.                                 msgDiag.addKeyword(CostantiPdD.KEY_TIPO_HEADER_INTEGRAZIONE,tipiIntegrazione[i]);
  3934.                                 msgDiag.addKeywordErroreProcessamento(e);
  3935.                                 msgDiag.logPersonalizzato("headerIntegrazione.letturaFallita");
  3936.                             }
  3937.                         }
  3938.                        
  3939.                        
  3940.                         /* ------------  Gestione Funzionalita' speciali per Attachments (Manifest) ------------- */    
  3941.                         // Funzionalita' necessaria solo per la consegna di un servizio
  3942.                         if(richiestaApplicativa!=null){
  3943.                             if(scartaBody){
  3944.                                 IntegrationFunctionError integrationFunctionError = null;
  3945.                                 try{
  3946.                                     if(responseMessage!=null){
  3947.                                         if(ServiceBinding.SOAP.equals(responseMessage.getServiceBinding())==false){
  3948.                                             integrationFunctionError = IntegrationFunctionError.NOT_SUPPORTED_BY_PROTOCOL;
  3949.                                             throw new Exception("Funzionalita 'ScartaBody' valida solamente per Service Binding SOAP");
  3950.                                         }
  3951.                                        
  3952.                                         // E' permesso SOLO per messaggi con attachment
  3953.                                         if(responseMessage.castAsSoap().countAttachments() <= 0){
  3954.                                             throw new Exception("La funzionalita' e' permessa solo per messaggi SOAP With Attachments");
  3955.                                         }
  3956.                                     }
  3957.                                 }catch(Exception e){
  3958.                                     msgDiag.addKeywordErroreProcessamento(e);
  3959.                                     msgDiag.logPersonalizzato("funzionalitaScartaBodyNonRiuscita");
  3960.                                                                        
  3961.                                     if(integrationFunctionError==null) {
  3962.                                         integrationFunctionError = IntegrationFunctionError.BAD_RESPONSE;
  3963.                                     }
  3964.                                     ejbUtils.setIntegrationFunctionErrorPortaApplicativa(integrationFunctionError);
  3965.                                     if(localForwardEngine!=null) {
  3966.                                         localForwardEngine.setIntegrationFunctionError(integrationFunctionError);
  3967.                                     }
  3968.                                    
  3969.                                     this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  3970.                                             ErroriIntegrazione.ERRORE_425_SCARTA_BODY.getErrore425_ScartaBody(e.getMessage()),
  3971.                                             idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  3972.                                             (responseMessage!=null ? responseMessage.getParseException() : null),
  3973.                                             pddContext);
  3974.                                    
  3975.                                     openspcoopstate.releaseResource();
  3976.                                     esito.setEsitoInvocazione(true);
  3977.                                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  3978.                                             msgDiag.getMessaggio_replaceKeywords("funzionalitaScartaBodyNonRiuscita"));
  3979.                                     return esito;
  3980.                                 }
  3981.                             }
  3982.                             if(allegaBody){
  3983.                                 try{
  3984.                                     if(responseMessage!=null){
  3985.                                         TunnelSoapUtils.allegaBody(responseMessage, this.propertiesReader.getHeaderSoapActorIntegrazione());
  3986.                                     }
  3987.                                 }catch(Exception e){
  3988.                                     msgDiag.addKeywordErroreProcessamento(e);
  3989.                                     msgDiag.logPersonalizzato("funzionalitaAllegaBodyNonRiuscita");
  3990.                                    
  3991.                                     ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.BAD_RESPONSE);
  3992.                                     if(localForwardEngine!=null) {
  3993.                                         localForwardEngine.setIntegrationFunctionError(IntegrationFunctionError.BAD_RESPONSE);
  3994.                                     }
  3995.                                    
  3996.                                     this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  3997.                                             ErroriIntegrazione.ERRORE_424_ALLEGA_BODY.getErrore424_AllegaBody(e.getMessage()),
  3998.                                             idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  3999.                                             (responseMessage!=null ? responseMessage.getParseException() : null),
  4000.                                             pddContext);
  4001.                                    
  4002.                                     openspcoopstate.releaseResource();
  4003.                                     esito.setEsitoInvocazione(true);
  4004.                                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  4005.                                             msgDiag.getMessaggio_replaceKeywords("funzionalitaAllegaBodyNonRiuscita"));
  4006.                                     return esito;
  4007.                                 }
  4008.                             }
  4009.                         }
  4010.                     }
  4011.                    
  4012.                    
  4013.                    
  4014.                     // processResponse localforward
  4015.                     if(localForward){
  4016.                        
  4017.                         if( richiestaApplicativa!=null && Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(richiestaApplicativa.getScenario()) ){
  4018.                             // Per avere esattamente il solito comportamento dello scenario con protocollo.
  4019.                             if(soapFault==null && restProblem==null){
  4020.                                 // devo 'ignorare' la risposta anche se presente, essendo un profilo oneway.
  4021.                                 if(responseMessage!=null){
  4022.                                     if(ServiceBinding.SOAP.equals(responseMessage.getServiceBinding())){
  4023.                                         SOAPBody body = responseMessage.castAsSoap().getSOAPBody();
  4024.                                         if(body!=null)
  4025.                                             body.removeContents();  
  4026.                                     }
  4027.                                 }
  4028.                             }
  4029.                         }
  4030.                        
  4031.                         msgDiag.mediumDebug("Process response message for local forward...");
  4032.                         try{
  4033.                             if(localForwardEngine.processResponse(responseMessage)==false){
  4034.                                 localForwardEngine.sendErrore(localForwardEngine.getResponseMessageError());
  4035.                                 openspcoopstate.releaseResource();
  4036.                                 esito.setEsitoInvocazione(true);
  4037.                                 esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"localForwardEngine.processResponse==false");
  4038.                                 return esito;
  4039.                             }
  4040.                             if(localForwardEngine.getResponseMessageAfterProcess()!=null){
  4041.                                 // Messaggio aggiornato
  4042.                                 responseMessage = localForwardEngine.getResponseMessageAfterProcess();
  4043.                             }
  4044.                         }catch(Exception e){
  4045.                             msgDiag.addKeywordErroreProcessamento(e);
  4046.                             msgDiag.logErroreGenerico(e, "localForwardProcessResponse");
  4047.                             this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  4048.                                     ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  4049.                                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_556_LOCAL_FORWARD_PROCESS_RESPONSE_ERROR),
  4050.                                     idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  4051.                                     (responseMessage!=null ? responseMessage.getParseException() : null),
  4052.                                     pddContext);
  4053.                            
  4054.                             openspcoopstate.releaseResource();
  4055.                             esito.setEsitoInvocazione(true);
  4056.                             esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  4057.                                     e.getMessage());
  4058.                             return esito;
  4059.                         }
  4060.                     }
  4061.                    
  4062.                    
  4063.                    
  4064.                     // Salvo messaggio ricevuto
  4065.                     msgDiag.mediumDebug("Registrazione messaggio di risposta nel RepositoryMessaggi...");
  4066.                     try{
  4067.                         msgResponse = new GestoreMessaggi(openspcoopstate, false, idMessageResponse,Costanti.OUTBOX,msgDiag,pddContext);
  4068.                         msgResponse.registraMessaggio(responseMessage,idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta);
  4069.                         msgResponse.aggiornaRiferimentoMessaggio(idMessaggioConsegna);
  4070.                         msgResponse.aggiornaProprietarioMessaggio(ImbustamentoRisposte.ID_MODULO);
  4071.                         if(responseMessage!=null && responseMessage.getParseException()!= null)
  4072.                             throw responseMessage.getParseException().getSourceException(); // gestito nel cacth
  4073.                     }catch(Exception e){
  4074.                         msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_CONSEGNA, ("salvataggio risposta, "+e.getMessage()));
  4075.                         if(bustaRichiesta.getMittente()!=null && bustaRichiesta.getTipoMittente()!=null){
  4076.                             msgDiag.logPersonalizzato("consegnaConErrore");
  4077.                         }
  4078.                         else{
  4079.                             msgDiag.logPersonalizzato("consegnaConErrore.mittenteAnonimo");
  4080.                         }
  4081.                        
  4082.                         msgResponse.deleteMessageFromFileSystem(); // elimino eventuale risposta salvata su fileSystem
  4083.                         msgResponse.aggiornaProprietarioMessaggio(TimerGestoreMessaggi.ID_MODULO);
  4084.                         if(responseMessage==null || responseMessage.getParseException() == null){
  4085.                            
  4086.                             this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  4087.                                     ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  4088.                                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_510_SAVE_RESPONSE_MSG),
  4089.                                     idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  4090.                                     (responseMessage!=null ? responseMessage.getParseException() : null),
  4091.                                     pddContext);
  4092.                            
  4093.                         } else {
  4094.                            
  4095.                             ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.UNPROCESSABLE_RESPONSE_CONTENT);
  4096.                             if(localForwardEngine!=null) {
  4097.                                 localForwardEngine.setIntegrationFunctionError(IntegrationFunctionError.UNPROCESSABLE_RESPONSE_CONTENT);
  4098.                             }
  4099.                            
  4100.                             pddContext.addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO, true);
  4101.                             this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  4102.                                     ErroriIntegrazione.ERRORE_440_PARSING_EXCEPTION_RISPOSTA.
  4103.                                         getErrore440_MessaggioRispostaMalformato(responseMessage.getParseException().getParseException()),
  4104.                                     idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore,
  4105.                                     responseMessage.getParseException().getParseException(),
  4106.                                     responseMessage.getParseException(),
  4107.                                     pddContext);
  4108.                            
  4109.                         }
  4110.                         openspcoopstate.releaseResource();
  4111.                         esito.setEsitoInvocazione(true);
  4112.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  4113.                                 "salvataggio risposta, "+e.getMessage());
  4114.                         return esito;
  4115.                     }

  4116.                     // Creazione messaggio di risposta
  4117.                     if(localForward){
  4118.                        
  4119.                         localForwardEngine.sendResponse(idMessageResponse);
  4120.                        
  4121.                     }
  4122.                     else{
  4123.                        
  4124.                         ImbustamentoRisposteMessage imbustamentoRisposteMSG = new ImbustamentoRisposteMessage();
  4125.                         imbustamentoRisposteMSG.setIDMessageResponse(idMessageResponse);
  4126.                         imbustamentoRisposteMSG.setRichiestaApplicativa(richiestaApplicativa);
  4127.                         imbustamentoRisposteMSG.setRichiestaDelegata(richiestaDelegata);
  4128.                         imbustamentoRisposteMSG.setBusta(bustaRichiesta);
  4129.                         imbustamentoRisposteMSG.setSpedizioneMsgIngresso(ejbUtils.getSpedizioneMsgIngresso());
  4130.                         imbustamentoRisposteMSG.setRicezioneMsgRisposta(ejbUtils.getRicezioneMsgRisposta());
  4131.                         imbustamentoRisposteMSG.setOneWayVersione11(oneWayVersione11);
  4132.                         imbustamentoRisposteMSG.setStateless(consegnaContenutiApplicativiMsg.isStateless());
  4133.                         imbustamentoRisposteMSG.setImplementazionePdDSoggettoMittente(consegnaContenutiApplicativiMsg.getImplementazionePdDSoggettoMittente());
  4134.                         imbustamentoRisposteMSG.setImplementazionePdDSoggettoDestinatario(consegnaContenutiApplicativiMsg.getImplementazionePdDSoggettoDestinatario());
  4135.                         imbustamentoRisposteMSG.setPddContext(pddContext);
  4136.                        
  4137.    
  4138.                         // Spedizione risposta al modulo 'ImbustamentoRisposte'
  4139.                         msgDiag.mediumDebug("Invio messaggio al modulo di ImbustamentoRisposte...");
  4140.                         if (openspcoopstate instanceof OpenSPCoopStateful){
  4141.                             try{
  4142.                                 ejbUtils.getNodeSender(this.propertiesReader, this.log).send(imbustamentoRisposteMSG, ImbustamentoRisposte.ID_MODULO, msgDiag,
  4143.                                         identitaPdD,ConsegnaContenutiApplicativi.ID_MODULO, idMessaggioConsegna,msgResponse);
  4144.                             } catch (Exception e) {
  4145.                                 this.log.error("Spedizione->ImbustamentoRisposte non riuscita",e);  
  4146.                                 msgDiag.logErroreGenerico(e,"GenericLib.nodeSender.send(ImbustamentoRisposte)");
  4147.                                 msgResponse.deleteMessageFromFileSystem(); // elimino eventuale risposta salvata su fileSystem
  4148.                                
  4149.                                 this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  4150.                                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  4151.                                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_512_SEND),
  4152.                                         idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  4153.                                         (responseMessage!=null ? responseMessage.getParseException() : null),
  4154.                                         pddContext);
  4155.                                
  4156.                                 openspcoopstate.releaseResource();
  4157.                                 esito.setEsitoInvocazione(true);
  4158.                                 esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO, "Spedizione->ImbustamentoRisposte non riuscita");
  4159.                                 return esito;
  4160.                             }
  4161.                         }
  4162.                         else ((OpenSPCoopStateless)openspcoopstate).setMessageLib(imbustamentoRisposteMSG);
  4163.                     }

  4164.                 }

  4165.             }











  4166.             /* ---------- Aggiornamento numero di sequenza ---------------- */
  4167.             if(ordineConsegna!=null){              
  4168.                 if(oneWayVersione11 || openspcoopstate instanceof OpenSPCoopStateful){
  4169.                     msgDiag.mediumDebug("Aggiornamento numero sequenza per consegna in ordine...");

  4170.                     ordineConsegna.setNextSequenza_daRicevere(bustaRichiesta);
  4171.                 }
  4172.             }






  4173.             /* ---------- Gestione Transazione Modulo ---------------- */

  4174.             // messaggio finale
  4175.             msgDiag.addKeyword(CostantiPdD.KEY_TIPO_CONNETTORE, tipoConnector);
  4176.             msgDiag.logPersonalizzato("gestioneConsegnaTerminata");

  4177.             // Commit JDBC della risposta
  4178.             msgDiag.mediumDebug("Commit delle operazioni per la gestione della richiesta...");
  4179.             openspcoopstate.commit();

  4180.             // Aggiornamento cache messaggio
  4181.             if(msgRequest!=null)
  4182.                 msgRequest.addMessaggiIntoCache_readFromTable(ConsegnaContenutiApplicativi.ID_MODULO, "richiesta");
  4183.             if(msgResponse!=null)
  4184.                 msgResponse.addMessaggiIntoCache_readFromTable(ConsegnaContenutiApplicativi.ID_MODULO, "risposta");

  4185.             // Aggiornamento cache proprietario messaggio
  4186.             if(msgRequest!=null)
  4187.                 msgRequest.addProprietariIntoCache_readFromTable(ConsegnaContenutiApplicativi.ID_MODULO, "richiesta",null,false);
  4188.             if(msgResponse!=null)
  4189.                 msgResponse.addProprietariIntoCache_readFromTable(ConsegnaContenutiApplicativi.ID_MODULO, "risposta",idMessaggioConsegna,false);


  4190.         }catch(Throwable e){
  4191.             this.log.error("ErroreGenerale",e);
  4192.             msgDiag.logErroreGenerico(e, "Generale");

  4193.             if ( msgResponse!=null ){
  4194.                 msgResponse.deleteMessageFromFileSystem(); // elimino eventuale risposta salvata su fileSystem
  4195.             }

  4196.             if(existsModuloInAttesaRispostaApplicativa) {
  4197.                 try{
  4198.                    
  4199.                     ParseException parseException = null;
  4200.                     if(useResponseForParseException) {
  4201.                         parseException = (responseMessage!=null ? responseMessage.getParseException() : null);
  4202.                     }
  4203.                     else {
  4204.                         parseException = (consegnaMessagePrimaTrasformazione!=null ? consegnaMessagePrimaTrasformazione.getParseException() : null);    
  4205.                     }
  4206.                    
  4207.                     this.sendErroreProcessamento(localForward, localForwardEngine, ejbUtils,
  4208.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  4209.                                 getErroreIntegrazione(),
  4210.                             idModuloInAttesa, bustaRichiesta, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, e,
  4211.                             parseException,
  4212.                             pddContext);
  4213.                    
  4214.                     esito.setEsitoInvocazione(true);
  4215.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO, "ErroreGenerale");
  4216.                 }catch(Exception er){
  4217.                     msgDiag.logErroreGenerico(er,"ejbUtils.sendErroreGenerale(profiloConRisposta)");
  4218.                     ejbUtils.rollbackMessage("Spedizione Errore al Mittente durante una richiesta con gestione della risposta non riuscita",servizioApplicativo, esito, false);
  4219.                     esito.setEsitoInvocazione(false);
  4220.                     esito.setStatoInvocazioneErroreNonGestito(er);
  4221.                 }
  4222.             }else{
  4223.                 ejbUtils.rollbackMessage("ErroreGenerale:"+e.getMessage(), servizioApplicativo, esito, false);
  4224.                 esito.setEsitoInvocazione(false);
  4225.                 esito.setStatoInvocazioneErroreNonGestito(e);
  4226.             }
  4227.             openspcoopstate.releaseResource();
  4228.             return esito;
  4229.         }finally{
  4230.             try {
  4231.                 if(transazioneApplicativoServer!=null) {
  4232.                     if(consegnaMessageTrasformato!=null) {
  4233.                         transazioneApplicativoServer.setRichiestaUscitaBytes(consegnaMessageTrasformato.getOutgoingMessageContentLength());
  4234.                     }
  4235.                     if(responseMessage!=null) {
  4236.                         long incomingResponseMessageContentLength = responseMessage.getIncomingMessageContentLength();
  4237.                         if(incomingResponseMessageContentLength<=0){
  4238.                             incomingResponseMessageContentLength = responseContentLength;
  4239.                             if(incomingResponseMessageContentLength<0){
  4240.                                 //System.out.println("FLUSH");
  4241.                                 // forzo la lettura del messaggio per impostare la dimensione della richiesta
  4242.                                 try{
  4243.                                     responseMessage.writeTo(NullOutputStream.INSTANCE, true);
  4244.                                 }catch(Exception eFlush){
  4245.                                     // ignore
  4246.                                 }
  4247.                                 incomingResponseMessageContentLength = responseMessage.getIncomingMessageContentLength();
  4248.                             }
  4249.                         }
  4250.                         transazioneApplicativoServer.setRispostaIngressoBytes(incomingResponseMessageContentLength);
  4251.                     }
  4252.                 }
  4253.             }catch(Throwable t) {
  4254.                 this.log.error("Errore durante la lettura delle dimensioni dei messaggi: "+t.getMessage(),t);
  4255.             }
  4256.             try{
  4257.                 if(connectorSenderForDisconnect!=null)
  4258.                     connectorSenderForDisconnect.disconnect();
  4259.             }catch(Exception e){
  4260.                 try{
  4261.                     if(msgDiag!=null)
  4262.                         msgDiag.logDisconnectError(e, location);
  4263.                 }catch(Exception eDisconnect){
  4264.                     this.log.error("Errore durante la chiusura delle connessione: "+eDisconnect.getMessage(),e);
  4265.                 }
  4266.             }
  4267.         }




  4268.         // Elimino SIL destinatario a cui ho consegnato il messaggio
  4269.         // a meno di consegna per riferimento
  4270.         //  if(connectionDB!=null){
  4271.         //      msgDiag.mediumDebug("Eliminazione SIL destinatario del messaggio nella tabelle MSG_SERVIZI_APPLICATIVI...");
  4272.         if(consegnaPerRiferimento==false){
  4273.             try{
  4274.                 String idMessaggioGestoreMessaggiRichiestaEliminazione = idMessaggioConsegna;
  4275.                 if(idMessaggioPreBehaviour!=null){
  4276.                     idMessaggioGestoreMessaggiRichiestaEliminazione = bustaRichiesta.getID();
  4277.                 }
  4278.                
  4279.                 GestoreMessaggi gestoreEliminazioneDestinatario = new GestoreMessaggi(openspcoopstate, true, idMessaggioGestoreMessaggiRichiestaEliminazione,Costanti.INBOX,msgDiag,pddContext);
  4280.                 if(idMessaggioPreBehaviour!=null && !(openspcoopstate instanceof OpenSPCoopStateful) ){
  4281.                     gestoreEliminazioneDestinatario.setOneWayVersione11(true); // per forzare l'update su db    
  4282.                 }
  4283.                 else{
  4284.                     gestoreEliminazioneDestinatario.setOneWayVersione11(oneWayVersione11);      
  4285.                 }
  4286.                 gestoreEliminazioneDestinatario.eliminaDestinatarioMessaggio(servizioApplicativo, null, oraRegistrazione);
  4287.             }catch(Exception e){
  4288.                 msgDiag.logErroreGenerico(e,"gestoreEliminazioneDestinatario.eliminaDestinatarioMessaggio("+servizioApplicativo+",null)");
  4289.             }
  4290.         }

  4291.         //  Rilascio connessione al DB
  4292.         msgDiag.mediumDebug(ConsegnaContenutiApplicativi.ID_MODULO+ " Rilascio le risorse..");
  4293.         openspcoopstate.releaseResource();

  4294.         msgDiag.mediumDebug("Lavoro Terminato.");
  4295.         esito.setEsitoInvocazione(true);
  4296.         esito.setStatoInvocazione(EsitoLib.OK,null);
  4297.         return esito;

  4298.     }
  4299.    
  4300.        
  4301.     private void sendErroreProcessamento(boolean localForward,LocalForwardEngine localForwardEngine, EJBUtils ejbUtils, ErroreIntegrazione errore,
  4302.             String idModuloInAttesa,Busta bustaRichiesta,String idCorrelazioneApplicativa, String idCorrelazioneApplicativaRisposta,
  4303.             String servizioApplicativoFruitore, Throwable e, ParseException parseException,
  4304.             PdDContext pddContext) throws LocalForwardException, EJBUtilsException, ProtocolException{
  4305.         if(localForward){
  4306.             localForwardEngine.sendErrore(pddContext, errore,e,parseException);
  4307.         }else{
  4308.             ejbUtils.sendAsRispostaBustaErroreProcessamento(idModuloInAttesa,bustaRichiesta,
  4309.                     errore, idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta,servizioApplicativoFruitore,e,parseException);
  4310.         }
  4311.     }
  4312.    
  4313.     private void sendErroreProcessamento(boolean localForward,LocalForwardEngine localForwardEngine, EJBUtils ejbUtils, OpenSPCoop2Message errorMessage, String errorDetail,
  4314.             String idModuloInAttesa,Busta bustaRichiesta,String idCorrelazioneApplicativa, String idCorrelazioneApplicativaRisposta,
  4315.             String servizioApplicativoFruitore) throws LocalForwardException, EJBUtilsException, ProtocolException{
  4316.         if(localForward){
  4317.             localForwardEngine.sendErrore(errorMessage);
  4318.         }else{
  4319.             ejbUtils.sendAsRispostaBustaErroreProcessamento(idModuloInAttesa,bustaRichiesta,
  4320.                     idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta,servizioApplicativoFruitore,
  4321.                     errorMessage, errorDetail);
  4322.         }
  4323.     }

  4324.     private void mappingProtocolProperties(Map<String, List<String>> protocolProperties,Map<String, List<String>> propertiesDaImpostare,
  4325.             IDSoggetto soggettoFruitoreHeaderIntegrazione, IDServizio servizioHeaderIntegrazione,
  4326.             IDSoggetto soggettoFruitore,IDServizio idServizio,
  4327.             Busta bustaRichiesta, String idCorrelazioneApplicativa){
  4328.         // mapping in valori delle keyword delle proprieta di trasporto protocol-properties.
  4329.         if(protocolProperties != null){
  4330.             Iterator<String> keys = protocolProperties.keySet().iterator();
  4331.             while (keys.hasNext()) {
  4332.                 String key = (String) keys.next();
  4333.                 List<String> values = protocolProperties.get(key);
  4334.                 String value = TransportUtils.getFirstValue(values);
  4335.                
  4336.                 if(ProprietaProtocolloValore.TIPO_MITTENTE.equals(value)){
  4337.                     if(soggettoFruitoreHeaderIntegrazione!=null && soggettoFruitoreHeaderIntegrazione.getTipo()!=null){
  4338.                         TransportUtils.setHeader(propertiesDaImpostare,key,soggettoFruitoreHeaderIntegrazione.getTipo());
  4339.                     }else if(soggettoFruitore!=null && soggettoFruitore.getTipo()!=null){
  4340.                         TransportUtils.setHeader(propertiesDaImpostare,key,soggettoFruitore.getTipo());
  4341.                     }else if(bustaRichiesta!=null && bustaRichiesta.getTipoMittente()!=null){
  4342.                         TransportUtils.setHeader(propertiesDaImpostare,key,bustaRichiesta.getTipoMittente());
  4343.                     }
  4344.                 }
  4345.                 if(ProprietaProtocolloValore.MITTENTE.equals(value)){
  4346.                     if(soggettoFruitoreHeaderIntegrazione!=null && soggettoFruitoreHeaderIntegrazione.getNome()!=null){
  4347.                         TransportUtils.setHeader(propertiesDaImpostare,key,soggettoFruitoreHeaderIntegrazione.getNome());
  4348.                     }else if(soggettoFruitore!=null && soggettoFruitore.getNome()!=null){
  4349.                         TransportUtils.setHeader(propertiesDaImpostare,key,soggettoFruitore.getNome());
  4350.                     }else if(bustaRichiesta!=null && bustaRichiesta.getMittente()!=null){
  4351.                         TransportUtils.setHeader(propertiesDaImpostare,key,bustaRichiesta.getMittente());
  4352.                     }
  4353.                 }
  4354.                 if(ProprietaProtocolloValore.IDENTIFICATIVO_PORTA_MITTENTE.equals(value)){
  4355.                     if(soggettoFruitoreHeaderIntegrazione!=null && soggettoFruitoreHeaderIntegrazione.getCodicePorta()!=null){
  4356.                         TransportUtils.setHeader(propertiesDaImpostare,key,soggettoFruitoreHeaderIntegrazione.getCodicePorta());
  4357.                     }else if(soggettoFruitore!=null && soggettoFruitore.getCodicePorta()!=null){
  4358.                         TransportUtils.setHeader(propertiesDaImpostare,key,soggettoFruitore.getCodicePorta());
  4359.                     }else if(bustaRichiesta!=null && bustaRichiesta.getIdentificativoPortaMittente()!=null){
  4360.                         TransportUtils.setHeader(propertiesDaImpostare,key,bustaRichiesta.getIdentificativoPortaMittente());
  4361.                     }
  4362.                 }
  4363.                    
  4364.                 if(ProprietaProtocolloValore.TIPO_DESTINATARIO.equals(value)){
  4365.                     if(servizioHeaderIntegrazione!=null && servizioHeaderIntegrazione.getSoggettoErogatore()!=null &&
  4366.                             servizioHeaderIntegrazione.getSoggettoErogatore().getTipo()!=null){
  4367.                         TransportUtils.setHeader(propertiesDaImpostare,key,servizioHeaderIntegrazione.getSoggettoErogatore().getTipo());
  4368.                     }else if(idServizio!=null && idServizio.getSoggettoErogatore()!=null &&
  4369.                             idServizio.getSoggettoErogatore().getTipo()!=null){
  4370.                         TransportUtils.setHeader(propertiesDaImpostare,key,idServizio.getSoggettoErogatore().getTipo());
  4371.                     }else if(bustaRichiesta!=null && bustaRichiesta.getTipoDestinatario()!=null){
  4372.                         TransportUtils.setHeader(propertiesDaImpostare,key,bustaRichiesta.getTipoDestinatario());
  4373.                     }
  4374.                 }  
  4375.                 if(ProprietaProtocolloValore.DESTINATARIO.equals(value)){
  4376.                     if(servizioHeaderIntegrazione!=null && servizioHeaderIntegrazione.getSoggettoErogatore()!=null &&
  4377.                             servizioHeaderIntegrazione.getSoggettoErogatore().getNome()!=null){
  4378.                         TransportUtils.setHeader(propertiesDaImpostare,key,servizioHeaderIntegrazione.getSoggettoErogatore().getNome());
  4379.                     }else if(idServizio!=null && idServizio.getSoggettoErogatore()!=null &&
  4380.                             idServizio.getSoggettoErogatore().getNome()!=null){
  4381.                         TransportUtils.setHeader(propertiesDaImpostare,key,idServizio.getSoggettoErogatore().getNome());
  4382.                     }else if(bustaRichiesta!=null && bustaRichiesta.getDestinatario()!=null){
  4383.                         TransportUtils.setHeader(propertiesDaImpostare,key,bustaRichiesta.getDestinatario());
  4384.                     }
  4385.                 }
  4386.                 if(ProprietaProtocolloValore.IDENTIFICATIVO_PORTA_DESTINATARIO.equals(value)){
  4387.                     if(servizioHeaderIntegrazione!=null && servizioHeaderIntegrazione.getSoggettoErogatore()!=null &&
  4388.                             servizioHeaderIntegrazione.getSoggettoErogatore().getCodicePorta()!=null){
  4389.                         TransportUtils.setHeader(propertiesDaImpostare,key,servizioHeaderIntegrazione.getSoggettoErogatore().getCodicePorta());
  4390.                     }else if(idServizio!=null && idServizio.getSoggettoErogatore()!=null &&
  4391.                             idServizio.getSoggettoErogatore().getCodicePorta()!=null){
  4392.                         TransportUtils.setHeader(propertiesDaImpostare,key,idServizio.getSoggettoErogatore().getCodicePorta());
  4393.                     }else if(bustaRichiesta!=null && bustaRichiesta.getIdentificativoPortaDestinatario()!=null){
  4394.                         TransportUtils.setHeader(propertiesDaImpostare,key,bustaRichiesta.getIdentificativoPortaDestinatario());
  4395.                     }
  4396.                 }

  4397.                 if(ProprietaProtocolloValore.TIPO_SERVIZIO.equals(value)){
  4398.                     if(servizioHeaderIntegrazione!=null && servizioHeaderIntegrazione.getTipo()!=null){
  4399.                         TransportUtils.setHeader(propertiesDaImpostare,key,servizioHeaderIntegrazione.getTipo());
  4400.                     }else if(idServizio!=null && idServizio.getTipo()!=null){
  4401.                         TransportUtils.setHeader(propertiesDaImpostare,key,idServizio.getTipo());
  4402.                     }else if(bustaRichiesta!=null && bustaRichiesta.getTipoServizio()!=null){
  4403.                         TransportUtils.setHeader(propertiesDaImpostare,key,bustaRichiesta.getTipoServizio());
  4404.                     }
  4405.                 }
  4406.                 if(ProprietaProtocolloValore.SERVIZIO.equals(value)){
  4407.                     if(servizioHeaderIntegrazione!=null && servizioHeaderIntegrazione.getNome()!=null){
  4408.                         TransportUtils.setHeader(propertiesDaImpostare,key,servizioHeaderIntegrazione.getNome());
  4409.                     }else if(idServizio!=null && idServizio.getNome()!=null){
  4410.                         TransportUtils.setHeader(propertiesDaImpostare,key,idServizio.getNome());
  4411.                     }else if(bustaRichiesta!=null && bustaRichiesta.getServizio()!=null){
  4412.                         TransportUtils.setHeader(propertiesDaImpostare,key,bustaRichiesta.getServizio());
  4413.                     }
  4414.                 }
  4415.                 if(ProprietaProtocolloValore.VERSIONE_SERVIZIO.equals(value)){
  4416.                     if(servizioHeaderIntegrazione!=null && servizioHeaderIntegrazione.getVersione()!=null){
  4417.                         TransportUtils.setHeader(propertiesDaImpostare,key,servizioHeaderIntegrazione.getVersione().intValue()+"");
  4418.                     }else if(idServizio!=null && idServizio.getVersione()!=null){
  4419.                         TransportUtils.setHeader(propertiesDaImpostare,key,idServizio.getVersione().intValue()+"");
  4420.                     }else if(bustaRichiesta!=null && bustaRichiesta.getVersioneServizio()!=null){
  4421.                         TransportUtils.setHeader(propertiesDaImpostare,key,bustaRichiesta.getVersioneServizio().intValue()+"");
  4422.                     }
  4423.                 }
  4424.                
  4425.                 if(ProprietaProtocolloValore.AZIONE.equals(value)){
  4426.                     if(servizioHeaderIntegrazione!=null && servizioHeaderIntegrazione.getAzione()!=null){
  4427.                         TransportUtils.setHeader(propertiesDaImpostare,key,servizioHeaderIntegrazione.getAzione());
  4428.                     }else if(idServizio!=null && idServizio.getAzione()!=null){
  4429.                         TransportUtils.setHeader(propertiesDaImpostare,key,idServizio.getAzione());
  4430.                     }else if(bustaRichiesta!=null && bustaRichiesta.getAzione()!=null){
  4431.                         TransportUtils.setHeader(propertiesDaImpostare,key,bustaRichiesta.getAzione());
  4432.                     }
  4433.                 }
  4434.                
  4435.                 if(ProprietaProtocolloValore.IDENTIFICATIVO.equals(value)){
  4436.                     if(bustaRichiesta!=null && bustaRichiesta.getID()!=null){
  4437.                         TransportUtils.setHeader(propertiesDaImpostare,key,bustaRichiesta.getID());
  4438.                     }
  4439.                 }

  4440.                 if(ProprietaProtocolloValore.IDENTIFICATIVO_CORRELAZIONE_APPLICATIVA.equals(value)){
  4441.                     if(idCorrelazioneApplicativa!=null){
  4442.                         TransportUtils.setHeader(propertiesDaImpostare,key,idCorrelazioneApplicativa);
  4443.                     }
  4444.                 }
  4445.             }
  4446.         }
  4447.     }
  4448.    
  4449.    
  4450.     private void emitDiagnostico(boolean invokerNonSupportato, Busta bustaRichiesta, MsgDiagnostico msgDiag, boolean errorConsegna) {
  4451.         if(invokerNonSupportato==false){
  4452.             if(bustaRichiesta.getMittente()!=null && bustaRichiesta.getTipoMittente()!=null){
  4453.                 if(errorConsegna){
  4454.                     msgDiag.logPersonalizzato("consegnaConErrore");
  4455.                 }else{
  4456.                     msgDiag.logPersonalizzato("consegnaEffettuata");
  4457.                 }
  4458.             }
  4459.             else{
  4460.                 if(errorConsegna){
  4461.                     msgDiag.logPersonalizzato("consegnaConErrore.mittenteAnonimo");
  4462.                 }else{
  4463.                     msgDiag.logPersonalizzato("consegnaEffettuata.mittenteAnonimo");
  4464.                 }
  4465.             }
  4466.         }
  4467.     }
  4468.    
  4469.     private void correctForwardPathNotifiche(TransazioneApplicativoServer transazioneApplicativoServer, OpenSPCoop2Message msg, IProtocolFactory<?> pf) throws ProtocolException {
  4470.         if(transazioneApplicativoServer!=null && ServiceBinding.REST.equals(msg.getServiceBinding())) {
  4471.            
  4472.             // non deve essere effettuato il forward del contesto nel path
  4473.             TransportRequestContext requestContext = msg.getTransportRequestContext();
  4474.             if(requestContext!=null) {
  4475.                 String resourcePath = requestContext.getFunctionParameters();
  4476.                 if(resourcePath!=null){
  4477.                     if(resourcePath.startsWith("/")){
  4478.                         resourcePath = resourcePath.substring(1);
  4479.                     }
  4480.                     if(requestContext.getInterfaceName()!=null) {
  4481.                         if(resourcePath.startsWith(requestContext.getInterfaceName())){
  4482.                             requestContext.setFunctionParameters(requestContext.getInterfaceName());
  4483.                         }      
  4484.                         else {
  4485.                             String normalizedInterfaceName = ConnettoreUtils.normalizeInterfaceName(msg, ConsegnaContenutiApplicativi.ID_MODULO, pf);
  4486.                             if(normalizedInterfaceName!=null && resourcePath.startsWith(normalizedInterfaceName)){
  4487.                                 requestContext.setFunctionParameters(normalizedInterfaceName);
  4488.                             }
  4489.                         }
  4490.                     }
  4491.                 }
  4492.             }
  4493.            
  4494.             // non deve essere effettuato il forward dei parametri
  4495.             if(requestContext!=null && requestContext.getParameters()!=null) {
  4496.                 requestContext.getParameters().clear();
  4497.             }
  4498.         }
  4499.     }
  4500.    
  4501.     @SuppressWarnings("unchecked")
  4502.     private List<String> readServiziApplicativiAbilitatiForwardTo(PdDContext pddContext) {
  4503.         List<String> serviziApplicativiAbilitatiForwardTo = null;
  4504.         if(pddContext!=null && pddContext.containsKey(org.openspcoop2.core.constants.Costanti.CONSEGNA_MULTIPLA_CONNETTORI_BY_SA)) {
  4505.             serviziApplicativiAbilitatiForwardTo = (List<String>) pddContext.getObject(org.openspcoop2.core.constants.Costanti.CONSEGNA_MULTIPLA_CONNETTORI_BY_SA);
  4506.         }
  4507.         return serviziApplicativiAbilitatiForwardTo;
  4508.     }
  4509.    
  4510.     private void registraTracciaOutRequest(Transaction transactionNullable, OutRequestContext outRequestContext, Logger log, MsgDiagnostico msgDiag) throws HandlerException {

  4511.         try {
  4512.        
  4513.             if(transactionNullable==null) {
  4514.                 // comunicazione statefull
  4515.                 return;
  4516.             }
  4517.            
  4518.             TracciamentoManager tracciamentoManager = new TracciamentoManager(FaseTracciamento.OUT_REQUEST);
  4519.             if(!tracciamentoManager.isTransazioniEnabled()) {
  4520.                 return;
  4521.             }
  4522.                
  4523.             InformazioniTransazione info = new InformazioniTransazione();
  4524.             info.setContext(outRequestContext.getPddContext());
  4525.             info.setTipoPorta(outRequestContext.getTipoPorta());
  4526.             info.setProtocolFactory(outRequestContext.getProtocolFactory());
  4527.             info.setProtocollo(outRequestContext.getProtocollo());
  4528.             info.setIntegrazione(outRequestContext.getIntegrazione());
  4529.             info.setIdModulo(outRequestContext.getIdModulo());
  4530.            
  4531.             TransportRequestContext transportRequestContext = null;
  4532.             if(outRequestContext.getMessaggio()!=null) {
  4533.                 transportRequestContext = outRequestContext.getMessaggio().getTransportRequestContext();
  4534.             }
  4535.             String esitoContext = EsitoBuilder.getTipoContext(transportRequestContext, EsitiProperties.getInstance(log, outRequestContext.getProtocolFactory()), log);
  4536.            
  4537.             tracciamentoManager.invoke(info, esitoContext,
  4538.                     outRequestContext.getConnettore()!=null ? outRequestContext.getConnettore().getHeaders() : null,
  4539.                             msgDiag);
  4540.            
  4541.         }catch(Exception e) {
  4542.             ServicesUtils.processTrackingException(e, log, FaseTracciamento.OUT_REQUEST, outRequestContext.getPddContext());
  4543.         }
  4544.        
  4545.     }
  4546. }