RicezioneContenutiApplicativi.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */


  20. package org.openspcoop2.pdd.services.core;

  21. import java.io.ByteArrayInputStream;
  22. import java.io.Serializable;
  23. import java.util.ArrayList;
  24. import java.util.Date;
  25. import java.util.Enumeration;
  26. import java.util.HashMap;
  27. import java.util.List;
  28. import java.util.Map;

  29. import javax.servlet.http.HttpServletRequest;

  30. import org.apache.commons.lang.StringUtils;
  31. import org.openspcoop2.core.config.AttributeAuthority;
  32. import org.openspcoop2.core.config.Connettore;
  33. import org.openspcoop2.core.config.CorrelazioneApplicativa;
  34. import org.openspcoop2.core.config.CorsConfigurazione;
  35. import org.openspcoop2.core.config.DumpConfigurazione;
  36. import org.openspcoop2.core.config.GestioneTokenAutenticazione;
  37. import org.openspcoop2.core.config.PortaApplicativa;
  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.ValidazioneContenutiApplicativi;
  43. import org.openspcoop2.core.config.constants.CostantiConfigurazione;
  44. import org.openspcoop2.core.config.constants.StatoFunzionalita;
  45. import org.openspcoop2.core.config.constants.TipoGestioneCORS;
  46. import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
  47. import org.openspcoop2.core.constants.CostantiConnettori;
  48. import org.openspcoop2.core.constants.TipoPdD;
  49. import org.openspcoop2.core.id.IDPortaApplicativa;
  50. import org.openspcoop2.core.id.IDPortaDelegata;
  51. import org.openspcoop2.core.id.IDServizio;
  52. import org.openspcoop2.core.id.IDServizioApplicativo;
  53. import org.openspcoop2.core.id.IDSoggetto;
  54. import org.openspcoop2.core.id.IdentificativiFruizione;
  55. import org.openspcoop2.core.registry.AccordoServizioParteComune;
  56. import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
  57. import org.openspcoop2.core.registry.Resource;
  58. import org.openspcoop2.core.registry.driver.DriverRegistroServiziAzioneNotFound;
  59. import org.openspcoop2.core.registry.driver.DriverRegistroServiziCorrelatoNotFound;
  60. import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
  61. import org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound;
  62. import org.openspcoop2.core.registry.driver.DriverRegistroServiziPortTypeNotFound;
  63. import org.openspcoop2.core.registry.driver.IDAccordoFactory;
  64. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  65. import org.openspcoop2.message.OpenSPCoop2Message;
  66. import org.openspcoop2.message.OpenSPCoop2MessageFactory;
  67. import org.openspcoop2.message.constants.MessageRole;
  68. import org.openspcoop2.message.constants.ServiceBinding;
  69. import org.openspcoop2.message.exception.ParseException;
  70. import org.openspcoop2.message.soap.TunnelSoapUtils;
  71. import org.openspcoop2.message.soap.mtom.MtomXomReference;
  72. import org.openspcoop2.message.utils.MessageUtilities;
  73. import org.openspcoop2.pdd.config.ClassNameProperties;
  74. import org.openspcoop2.pdd.config.ConfigurazioneCanaliNodo;
  75. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  76. import org.openspcoop2.pdd.config.CostantiProprieta;
  77. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  78. import org.openspcoop2.pdd.config.RichiestaApplicativa;
  79. import org.openspcoop2.pdd.config.RichiestaDelegata;
  80. import org.openspcoop2.pdd.config.dynamic.PddPluginLoader;
  81. import org.openspcoop2.pdd.core.AbstractCore;
  82. import org.openspcoop2.pdd.core.CORSFilter;
  83. import org.openspcoop2.pdd.core.CORSWrappedHttpServletResponse;
  84. import org.openspcoop2.pdd.core.CostantiPdD;
  85. import org.openspcoop2.pdd.core.GestoreCorrelazioneApplicativa;
  86. import org.openspcoop2.pdd.core.GestoreCorrelazioneApplicativaConfig;
  87. import org.openspcoop2.pdd.core.GestoreMessaggi;
  88. import org.openspcoop2.pdd.core.GestoreMessaggiException;
  89. import org.openspcoop2.pdd.core.IntegrationContext;
  90. import org.openspcoop2.pdd.core.LocalForwardEngine;
  91. import org.openspcoop2.pdd.core.LocalForwardParameter;
  92. import org.openspcoop2.pdd.core.PdDContext;
  93. import org.openspcoop2.pdd.core.ProtocolContext;
  94. import org.openspcoop2.pdd.core.StatoServiziPdD;
  95. import org.openspcoop2.pdd.core.ValidatoreMessaggiApplicativi;
  96. import org.openspcoop2.pdd.core.ValidatoreMessaggiApplicativiException;
  97. import org.openspcoop2.pdd.core.ValidatoreMessaggiApplicativiRest;
  98. import org.openspcoop2.pdd.core.autorizzazione.GestoreAutorizzazione;
  99. import org.openspcoop2.pdd.core.autorizzazione.container.AutorizzazioneHttpServletRequest;
  100. import org.openspcoop2.pdd.core.autorizzazione.container.IAutorizzazioneSecurityContainer;
  101. import org.openspcoop2.pdd.core.autorizzazione.pd.DatiInvocazionePortaDelegata;
  102. import org.openspcoop2.pdd.core.autorizzazione.pd.EsitoAutorizzazionePortaDelegata;
  103. import org.openspcoop2.pdd.core.connettori.InfoConnettoreIngresso;
  104. import org.openspcoop2.pdd.core.credenziali.Credenziali;
  105. import org.openspcoop2.pdd.core.credenziali.GestoreCredenzialiConfigurationException;
  106. import org.openspcoop2.pdd.core.credenziali.IGestoreCredenziali;
  107. import org.openspcoop2.pdd.core.handlers.GestoreHandlers;
  108. import org.openspcoop2.pdd.core.handlers.HandlerException;
  109. import org.openspcoop2.pdd.core.handlers.InRequestContext;
  110. import org.openspcoop2.pdd.core.handlers.InRequestProtocolContext;
  111. import org.openspcoop2.pdd.core.handlers.OutResponseContext;
  112. import org.openspcoop2.pdd.core.integrazione.HeaderIntegrazione;
  113. import org.openspcoop2.pdd.core.integrazione.IGestoreIntegrazionePD;
  114. import org.openspcoop2.pdd.core.integrazione.IGestoreIntegrazionePDSoap;
  115. import org.openspcoop2.pdd.core.integrazione.InRequestPDMessage;
  116. import org.openspcoop2.pdd.core.integrazione.OutResponsePDMessage;
  117. import org.openspcoop2.pdd.core.node.INodeReceiver;
  118. import org.openspcoop2.pdd.core.node.INodeSender;
  119. import org.openspcoop2.pdd.core.node.NodeTimeoutException;
  120. import org.openspcoop2.pdd.core.response_caching.HashGenerator;
  121. import org.openspcoop2.pdd.core.state.IOpenSPCoopState;
  122. import org.openspcoop2.pdd.core.state.OpenSPCoopState;
  123. import org.openspcoop2.pdd.core.state.OpenSPCoopStateful;
  124. import org.openspcoop2.pdd.core.state.OpenSPCoopStateless;
  125. import org.openspcoop2.pdd.core.token.GestoreToken;
  126. import org.openspcoop2.pdd.core.token.InformazioniToken;
  127. import org.openspcoop2.pdd.core.token.attribute_authority.EsitoRecuperoAttributi;
  128. import org.openspcoop2.pdd.core.token.attribute_authority.InformazioniAttributi;
  129. import org.openspcoop2.pdd.core.token.attribute_authority.PolicyAttributeAuthority;
  130. import org.openspcoop2.pdd.core.token.attribute_authority.pd.GestioneAttributeAuthority;
  131. import org.openspcoop2.pdd.core.transazioni.Transaction;
  132. import org.openspcoop2.pdd.core.transazioni.TransactionContext;
  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.Tracciamento;
  138. import org.openspcoop2.pdd.mdb.ConsegnaContenutiApplicativi;
  139. import org.openspcoop2.pdd.mdb.EsitoLib;
  140. import org.openspcoop2.pdd.mdb.ImbustamentoMessage;
  141. import org.openspcoop2.pdd.mdb.InoltroBuste;
  142. import org.openspcoop2.pdd.mdb.SbustamentoRisposte;
  143. import org.openspcoop2.pdd.services.OpenSPCoop2Startup;
  144. import org.openspcoop2.pdd.services.ServicesUtils;
  145. import org.openspcoop2.pdd.services.connector.messages.ConnectorInMessage;
  146. import org.openspcoop2.pdd.services.error.AbstractErrorGenerator;
  147. import org.openspcoop2.pdd.services.error.RicezioneContenutiApplicativiInternalErrorGenerator;
  148. import org.openspcoop2.pdd.services.skeleton.IntegrationManager;
  149. import org.openspcoop2.pdd.timers.TimerGestoreMessaggi;
  150. import org.openspcoop2.pdd.timers.TimerLock;
  151. import org.openspcoop2.pdd.timers.TimerMonitoraggioRisorseThread;
  152. import org.openspcoop2.pdd.timers.TimerThresholdThread;
  153. import org.openspcoop2.pdd.timers.TipoLock;
  154. import org.openspcoop2.protocol.basic.registry.IdentificazionePortaDelegata;
  155. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  156. import org.openspcoop2.protocol.engine.builder.Imbustamento;
  157. import org.openspcoop2.protocol.engine.constants.Costanti;
  158. import org.openspcoop2.protocol.engine.driver.RepositoryBuste;
  159. import org.openspcoop2.protocol.engine.mapping.IdentificazioneDinamicaException;
  160. import org.openspcoop2.protocol.engine.validator.ValidazioneSintattica;
  161. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  162. import org.openspcoop2.protocol.sdk.Busta;
  163. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  164. import org.openspcoop2.protocol.sdk.Integrazione;
  165. import org.openspcoop2.protocol.sdk.ProtocolException;
  166. import org.openspcoop2.protocol.sdk.ProtocolMessage;
  167. import org.openspcoop2.protocol.sdk.Servizio;
  168. import org.openspcoop2.protocol.sdk.builder.IBustaBuilder;
  169. import org.openspcoop2.protocol.sdk.builder.ProprietaErroreApplicativo;
  170. import org.openspcoop2.protocol.sdk.builder.ProprietaManifestAttachments;
  171. import org.openspcoop2.protocol.sdk.config.IProtocolConfiguration;
  172. import org.openspcoop2.protocol.sdk.config.IProtocolManager;
  173. import org.openspcoop2.protocol.sdk.config.IProtocolVersionManager;
  174. import org.openspcoop2.protocol.sdk.config.ITraduttore;
  175. import org.openspcoop2.protocol.sdk.constants.CodiceErroreIntegrazione;
  176. import org.openspcoop2.protocol.sdk.constants.ErroreIntegrazione;
  177. import org.openspcoop2.protocol.sdk.constants.ErroriIntegrazione;
  178. import org.openspcoop2.protocol.sdk.constants.FaseSbustamento;
  179. import org.openspcoop2.protocol.sdk.constants.FunzionalitaProtocollo;
  180. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  181. import org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione;
  182. import org.openspcoop2.protocol.sdk.constants.RuoloMessaggio;
  183. import org.openspcoop2.protocol.sdk.constants.StatoFunzionalitaProtocollo;
  184. import org.openspcoop2.protocol.sdk.dump.DumpException;
  185. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  186. import org.openspcoop2.protocol.sdk.state.URLProtocolContext;
  187. import org.openspcoop2.protocol.sdk.tracciamento.TracciamentoException;
  188. import org.openspcoop2.utils.LoggerWrapperFactory;
  189. import org.openspcoop2.utils.MapKey;
  190. import org.openspcoop2.utils.Utilities;
  191. import org.openspcoop2.utils.date.DateManager;
  192. import org.openspcoop2.utils.resources.Loader;
  193. import org.openspcoop2.utils.transport.http.CORSRequestType;
  194. import org.openspcoop2.utils.transport.http.HttpConstants;
  195. import org.openspcoop2.utils.transport.http.HttpRequestMethod;
  196. import org.slf4j.Logger;

  197. /**
  198.  * Implementazione del servizio RicezioneContenutiApplicativi di OpenSPCoop
  199.  *
  200.  * @author Poli Andrea (apoli@link.it)
  201.  * @author $Author$
  202.  * @version $Rev$, $Date$
  203.  */

  204. public class RicezioneContenutiApplicativi {

  205.     /**
  206.      * Variabile che indica il Nome del modulo dell'architettura di OpenSPCoop
  207.      * rappresentato da questa classe
  208.      */
  209.     public static final String ID_MODULO = "RicezioneContenutiApplicativi";
  210.    
  211.     private static void logDebug(Logger logCore, String msg) {
  212.         logCore.debug(msg);
  213.     }
  214.     private static void logDebug(Logger logCore, String msg, Throwable e) {
  215.         logCore.debug(msg, e);
  216.     }
  217.     private static void logInfo(Logger logCore, String msg) {
  218.         logCore.info(msg);
  219.     }
  220.     private static void logError(Logger logCore, String msg) {
  221.         logCore.error(msg);
  222.     }
  223.     private static void logError(Logger logCore, String msg, Throwable e) {
  224.         logCore.error(msg,e);
  225.     }
  226.    
  227.    

  228.     /** Indicazione se sono state inizializzate le variabili del servizio */
  229.     public static boolean initializeService = false;

  230.     /** IGestoreIntegrazionePD: lista di gestori, ordinati per priorita' minore */
  231.     private static String[] defaultGestoriIntegrazionePD = null;
  232.     private static java.util.concurrent.ConcurrentHashMap<String, String[]> defaultPerProtocolloGestoreIntegrazionePD = null;

  233.     /** IGestoreCredenziali: lista di gestori delle credenziali */
  234.     private static String [] tipiGestoriCredenziali = null;
  235.    
  236.     /**
  237.      * Inizializzatore del servizio RicezioneContenutiApplicativi
  238.      *
  239.      * @throws Exception
  240.      */
  241.     public static synchronized void initializeService(
  242.             ConfigurazionePdDManager configReader,
  243.             ClassNameProperties className,
  244.             OpenSPCoop2Properties propertiesReader, Logger logCore)
  245.             throws Exception {
  246.         if (RicezioneContenutiApplicativi.initializeService)
  247.             return; // inizializzato da un altro thread

  248.         Loader loader = Loader.getInstance();
  249.         PddPluginLoader pluginLoader = PddPluginLoader.getInstance();
  250.        
  251.         // Inizializzazione NodeSender
  252.         String classTypeNodeSender = className.getNodeSender(propertiesReader.getNodeSender());
  253.         try {
  254.             INodeSender nodeSender = (INodeSender) loader.newInstance(classTypeNodeSender);
  255.             nodeSender.toString();
  256.             logInfo(logCore, "Inizializzazione gestore NodeSender di tipo " + classTypeNodeSender + " effettuata.");
  257.         } catch (Exception e) {
  258.             throw new Exception(
  259.                     "Riscontrato errore durante il caricamento della classe ["+ classTypeNodeSender
  260.                             + "] da utilizzare per la spedizione nell'infrastruttura: " + e.getMessage());
  261.         }

  262.         // Inizializzazione NodeReceiver
  263.         String classType = className.getNodeReceiver(propertiesReader.getNodeReceiver());
  264.         try {
  265.             INodeReceiver nodeReceiver = (INodeReceiver) loader.newInstance(classType);
  266.             nodeReceiver.toString();
  267.             logInfo(logCore, "Inizializzazione gestore NodeReceiver di tipo "+ classType + " effettuata.");
  268.         } catch (Exception e) {
  269.             throw new Exception(
  270.                     "Riscontrato errore durante il caricamento della classe ["+ classType
  271.                             + "] da utilizzare per la ricezione dall'infrastruttura: "+ e.getMessage());
  272.         }

  273.         // Inizializzo IGestoreIntegrazionePD list
  274.         RicezioneContenutiApplicativi.defaultGestoriIntegrazionePD = propertiesReader.getTipoIntegrazionePD();
  275.         for (int i = 0; i < RicezioneContenutiApplicativi.defaultGestoriIntegrazionePD.length; i++) {
  276.             try {
  277.                 IGestoreIntegrazionePD gestore = (IGestoreIntegrazionePD) pluginLoader.newIntegrazionePortaDelegata(RicezioneContenutiApplicativi.defaultGestoriIntegrazionePD[i]);
  278.                 gestore.toString();
  279.                 logInfo(logCore, "Inizializzazione gestore dati di integrazione per le fruizioni di tipo "
  280.                                 + RicezioneContenutiApplicativi.defaultGestoriIntegrazionePD[i] + " effettuata.");
  281.             } catch (Exception e) {
  282.                 throw new Exception(e.getMessage(),e);
  283.             }
  284.         }
  285.        
  286.         // Inizializzo IGestoreIntegrazionePD per protocollo
  287.         RicezioneContenutiApplicativi.defaultPerProtocolloGestoreIntegrazionePD = new java.util.concurrent.ConcurrentHashMap<String, String[]>();
  288.         Enumeration<String> enumProtocols = ProtocolFactoryManager.getInstance().getProtocolNames();
  289.         while (enumProtocols.hasMoreElements()) {
  290.             String protocol = (String) enumProtocols.nextElement();
  291.             String[] tipiIntegrazionePD = propertiesReader.getTipoIntegrazionePD(protocol);
  292.             if(tipiIntegrazionePD!=null && tipiIntegrazionePD.length>0){
  293.                 List<String> tipiIntegrazionePerProtocollo = new ArrayList<>();
  294.                 for (int i = 0; i < tipiIntegrazionePD.length; i++) {
  295.                     try {
  296.                         IGestoreIntegrazionePD gestore = (IGestoreIntegrazionePD) pluginLoader.newIntegrazionePortaDelegata(tipiIntegrazionePD[i]);
  297.                         gestore.toString();
  298.                         tipiIntegrazionePerProtocollo.add(tipiIntegrazionePD[i]);
  299.                         logCore .info("Inizializzazione gestore dati di integrazione (protocollo: "+protocol+") per le fruizioni di tipo "
  300.                                 + tipiIntegrazionePD[i] + " effettuata.");
  301.                     } catch (Exception e) {
  302.                         throw new Exception(e.getMessage(),e);
  303.                     }
  304.                 }
  305.                 if(tipiIntegrazionePerProtocollo.size()>0){
  306.                     RicezioneContenutiApplicativi.defaultPerProtocolloGestoreIntegrazionePD.put(protocol, tipiIntegrazionePerProtocollo.toArray(new String[1]));
  307.                 }
  308.             }
  309.         }

  310.         // Inizializzo GestoriCredenziali PD
  311.         RicezioneContenutiApplicativi.tipiGestoriCredenziali = propertiesReader.getTipoGestoreCredenzialiPD();
  312.         if(RicezioneContenutiApplicativi.tipiGestoriCredenziali!=null){
  313.             for (int i = 0; i < RicezioneContenutiApplicativi.tipiGestoriCredenziali.length; i++) {
  314.                 classType = className.getGestoreCredenziali(RicezioneContenutiApplicativi.tipiGestoriCredenziali[i]);
  315.                 try {
  316.                     IGestoreCredenziali gestore = (IGestoreCredenziali)loader.newInstance(classType);
  317.                     gestore.toString();
  318.                     logCore .info("Inizializzazione gestore credenziali di tipo "
  319.                             + RicezioneContenutiApplicativi.tipiGestoriCredenziali[i]   + " effettuata.");
  320.                 } catch (Exception e) {
  321.                     throw new Exception(
  322.                             "Riscontrato errore durante il caricamento della classe ["+ classType
  323.                             + "] da utilizzare per la gestione delle credenziali di tipo ["
  324.                             + RicezioneContenutiApplicativi.tipiGestoriCredenziali[i]+ "]: " + e.getMessage());
  325.                 }
  326.             }
  327.         }
  328.        
  329.         RicezioneContenutiApplicativi.initializeService = true;
  330.     }



  331.     /** Generatore Errori */
  332.     private RicezioneContenutiApplicativiInternalErrorGenerator generatoreErrore;
  333.    
  334.     /** Contesto della richiesta */
  335.     private RicezioneContenutiApplicativiContext msgContext;
  336.    
  337.     public RicezioneContenutiApplicativi(
  338.             RicezioneContenutiApplicativiContext context,
  339.             RicezioneContenutiApplicativiInternalErrorGenerator generatoreErrore) {
  340.         this.msgContext = context;
  341.         this.generatoreErrore = generatoreErrore;
  342.     }

  343.     public void process(Object ... params) {
  344.                
  345.        
  346.         // ------------- dati generali -----------------------------
  347.        
  348.         // Context
  349.         PdDContext context = this.msgContext.getPddContext();
  350.        
  351.         // Logger
  352.         Logger logCore = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
  353.         if (logCore == null) {
  354.             logCore = LoggerWrapperFactory.getLogger(RicezioneContenutiApplicativi.ID_MODULO);
  355.         }
  356.        
  357.         // MsgDiagnostico
  358.         MsgDiagnostico msgDiag = this.msgContext.getMsgDiagnostico();
  359.        
  360.         // Messaggio
  361.         OpenSPCoop2Message requestMessage = this.msgContext.getMessageRequest();
  362.         if (requestMessage == null) {
  363.             setSOAPFault(IntegrationFunctionError.INTERNAL_REQUEST_ERROR, logCore, msgDiag, new Exception("Request message is null"), "LetturaMessaggioRichiesta");
  364.             return;
  365.         }
  366.        
  367.        
  368.        
  369.        
  370.         // ------------- in-handler -----------------------------
  371.         IProtocolFactory<?> protocolFactory = null;
  372.         try{
  373.             if(context==null) {
  374.                 throw new Exception("Context is null");
  375.             }
  376.             protocolFactory = ProtocolFactoryManager.getInstance().getProtocolFactoryByName((String)context.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME));
  377.         }catch(Exception e){
  378.             setSOAPFault(IntegrationFunctionError.GOVWAY_NOT_INITIALIZED, logCore, msgDiag, e, "ProtocolFactoryInstance");
  379.             return;
  380.         }
  381.         InRequestContext inRequestContext = new InRequestContext(logCore,protocolFactory, null);
  382.         // TipoPorta
  383.         inRequestContext.setTipoPorta(TipoPdD.DELEGATA);
  384.         inRequestContext.setIdModulo(this.msgContext.getIdModulo());
  385.         // Informazioni connettore ingresso
  386.         InfoConnettoreIngresso connettore = new InfoConnettoreIngresso();
  387.         connettore.setCredenziali(this.msgContext.getCredenziali());
  388.         if(this.msgContext.getUrlProtocolContext()!=null &&
  389.                 this.msgContext.getUrlProtocolContext().getHttpServletRequest()!=null){
  390.             OpenSPCoop2Properties properties = OpenSPCoop2Properties.getInstance(); // Puo' non essere inizializzato
  391.             if(properties!=null){
  392.                 String tipo = properties.getRealContainerCustom();
  393.                 if(tipo!=null) {
  394.                     try {
  395.                         ClassNameProperties className = ClassNameProperties.getInstance();
  396.                         Loader loader = Loader.getInstance();
  397.                         // Check tipi registrati
  398.                         String tipoClass = className.getRealmContainerCustom(tipo);
  399.                         IAutorizzazioneSecurityContainer authEngine = (IAutorizzazioneSecurityContainer) loader.newInstance(tipoClass);
  400.                         authEngine.init(this.msgContext.getUrlProtocolContext().getHttpServletRequest(),
  401.                                 context, protocolFactory);
  402.                         AutorizzazioneHttpServletRequest httpServletRequestAuth = new AutorizzazioneHttpServletRequest(this.msgContext.getUrlProtocolContext().getHttpServletRequest(), authEngine);
  403.                         this.msgContext.getUrlProtocolContext().updateHttpServletRequest(httpServletRequestAuth);                  
  404.                     }catch(Exception e){
  405.                         setSOAPFault(IntegrationFunctionError.INTERNAL_REQUEST_ERROR, logCore, msgDiag, e, "AutorizzazioneSecurityContainerInstance");
  406.                         return;
  407.                     }
  408.                 }
  409.             }
  410.         }
  411.         connettore.setUrlProtocolContext(this.msgContext.getUrlProtocolContext());
  412.         if(ServiceBinding.SOAP.equals(requestMessage.getServiceBinding())){
  413.             try{
  414.                 connettore.setSoapAction(requestMessage.castAsSoap().getSoapAction());
  415.             }catch(Exception e){
  416.                 setSOAPFault(IntegrationFunctionError.INTERNAL_REQUEST_ERROR, logCore,msgDiag, e, "LetturaSoapAction");
  417.                 return;
  418.             }
  419.         }
  420.         connettore.setFromLocation(this.msgContext.getSourceLocation());
  421.         inRequestContext.setConnettore(connettore);
  422.         // Data accettazione richiesta
  423.         inRequestContext.setDataAccettazioneRichiesta(this.msgContext.getDataAccettazioneRichiesta());
  424.         // Data ingresso richiesta
  425.         inRequestContext.setDataElaborazioneMessaggio(this.msgContext.getDataIngressoRichiesta());
  426.         // PdDContext
  427.         inRequestContext.setPddContext(context);
  428.         // Dati Messaggio
  429.         inRequestContext.setMessaggio(requestMessage);
  430.         // Invoke handler
  431.         try{
  432.             GestoreHandlers.inRequest(inRequestContext, msgDiag, logCore);
  433.         }catch(HandlerException e){
  434.             setSOAPFault(IntegrationFunctionError.INTERNAL_REQUEST_ERROR, logCore,msgDiag, e, e.getIdentitaHandler());
  435.             return;
  436.         }catch(Exception e){
  437.             setSOAPFault(IntegrationFunctionError.INTERNAL_REQUEST_ERROR, logCore,msgDiag, e, "InvocazioneInRequestHandler");
  438.             return;
  439.         }
  440.        
  441.        
  442.        
  443.        
  444.        
  445.            
  446.         // ------------- process -----------------------------
  447.         HashMap<String, Object> internalObjects = new HashMap<>();
  448.         try{
  449.             process_engine(inRequestContext,internalObjects,params);
  450.         } catch(TracciamentoException e){
  451.             setSOAPFault(AbstractErrorGenerator.getIntegrationInternalError(context), logCore,msgDiag, e, "TracciamentoNonRiuscito");
  452.             return;
  453.         } catch(DumpException e){
  454.             setSOAPFault(AbstractErrorGenerator.getIntegrationInternalError(context), logCore,msgDiag, e, "DumpNonRiuscito");
  455.             return;
  456.         } catch(ProtocolException e){
  457.             setSOAPFault(AbstractErrorGenerator.getIntegrationInternalError(context), logCore,msgDiag, e, "InstanziazioneProtocolFactoryNonRiuscita");
  458.             return;
  459.         }
  460.        
  461.         try{
  462.             if(context!=null  && this.msgContext.getIntegrazione()!=null){
  463.                 if(context.containsKey(CostantiPdD.TIPO_PROCESSAMENTO_MTOM_RICHIESTA)){
  464.                     this.msgContext.getIntegrazione().setTipoProcessamentoMtomXopRichiesta(
  465.                             (String)context.getObject(CostantiPdD.TIPO_PROCESSAMENTO_MTOM_RICHIESTA));
  466.                 }
  467.                 if(context.containsKey(CostantiPdD.TIPO_PROCESSAMENTO_MTOM_RISPOSTA)){
  468.                     this.msgContext.getIntegrazione().setTipoProcessamentoMtomXopRisposta(
  469.                             (String)context.getObject(CostantiPdD.TIPO_PROCESSAMENTO_MTOM_RISPOSTA));
  470.                 }
  471.                 if(context.containsKey(CostantiPdD.TIPO_SICUREZZA_MESSAGGIO_RICHIESTA)){
  472.                     this.msgContext.getIntegrazione().setTipoMessageSecurityRichiesta(
  473.                             (String)context.getObject(CostantiPdD.TIPO_SICUREZZA_MESSAGGIO_RICHIESTA));
  474.                 }
  475.                 if(context.containsKey(CostantiPdD.TIPO_SICUREZZA_MESSAGGIO_RISPOSTA)){
  476.                     this.msgContext.getIntegrazione().setTipoMessageSecurityRisposta(
  477.                             (String)context.getObject(CostantiPdD.TIPO_SICUREZZA_MESSAGGIO_RISPOSTA));
  478.                 }
  479.             }
  480.         }catch(Exception e){
  481.             setSOAPFault(AbstractErrorGenerator.getIntegrationInternalError(context), logCore,msgDiag, e, "FinalizeIntegrationContextRicezioneContenutiApplicativi");
  482.             return;
  483.         }
  484.        
  485.        
  486.        

  487.        
  488.        
  489.        
  490.        
  491.         // ------------- Dump richiesta in ingresso -----------------------------
  492.         if(!internalObjects.containsKey(CostantiPdD.DUMP_RICHIESTA_EFFETTUATO) &&
  493.             Dump.isSistemaDumpDisponibile()){
  494.             try{
  495.                 ConfigurazionePdDManager configurazionePdDReader = ConfigurazionePdDManager.getInstance();  
  496.                
  497.                 if(internalObjects.containsKey(CostantiPdD.DUMP_CONFIG)==false) {
  498.                     URLProtocolContext urlProtocolContext = this.msgContext.getUrlProtocolContext();
  499.                     if(urlProtocolContext!=null && urlProtocolContext.getInterfaceName()!=null) {
  500.                         IDPortaDelegata identificativoPortaDelegata = new IDPortaDelegata();
  501.                         identificativoPortaDelegata.setNome(urlProtocolContext.getInterfaceName());
  502.                         PortaDelegata portaDelegata = configurazionePdDReader.getPortaDelegataSafeMethod(identificativoPortaDelegata, this.msgContext.getRequestInfo());
  503.                         if(portaDelegata!=null) {
  504.                             DumpConfigurazione dumpConfig = configurazionePdDReader.getDumpConfigurazione(portaDelegata);
  505.                             internalObjects.put(CostantiPdD.DUMP_CONFIG, dumpConfig);
  506.                         }
  507.                     }
  508.                 }
  509.                
  510.                 OpenSPCoop2Message msgRichiesta = inRequestContext.getMessaggio();
  511.                 if (msgRichiesta!=null) {
  512.                    
  513.                     Dump dumpApplicativo = getDump(configurazionePdDReader, protocolFactory, internalObjects, msgDiag.getPorta());
  514.                     dumpApplicativo.dumpRichiestaIngresso(msgRichiesta,
  515.                             inRequestContext.getConnettore().getUrlProtocolContext());
  516.                 }
  517.             }catch(DumpException e){
  518.                 setSOAPFault(AbstractErrorGenerator.getIntegrationInternalError(context), logCore,msgDiag, e, "DumpNonRiuscito");
  519.                 return;
  520.             }catch(Exception e){
  521.                 // Se non riesco ad accedere alla configurazione sicuramente gia' nel messaggio di risposta e' presente l'errore di PdD non correttamente inizializzata
  522.             }
  523.         }
  524.        
  525.        
  526.        
  527.        
  528.        
  529.         // ------------- out-handler -----------------------------
  530.         OutResponseContext outResponseContext = new OutResponseContext(logCore,protocolFactory, null);
  531.         // TipoPorta
  532.         outResponseContext.setTipoPorta(this.msgContext.getTipoPorta());
  533.         outResponseContext.setIdModulo(this.msgContext.getIdModulo());
  534.         // DataUscitaMessaggio
  535.         outResponseContext.setDataElaborazioneMessaggio(DateManager.getDate());
  536.         // PddContext
  537.         outResponseContext.setPddContext(inRequestContext.getPddContext());
  538.         // Informazioni protocollo e di integrazione
  539.         outResponseContext.setProtocollo(this.msgContext.getProtocol());
  540.         outResponseContext.setIntegrazione(this.msgContext.getIntegrazione());
  541.         // Header di trasporto della risposta
  542.         outResponseContext.setResponseHeaders(this.msgContext.getResponseHeaders());
  543.         // Messaggio
  544.         OpenSPCoop2Message msgResponse = this.msgContext.getMessageResponse();
  545.         outResponseContext.setMessaggio(msgResponse);
  546.         // Invoke handler
  547.         try{
  548.             GestoreHandlers.outResponse(outResponseContext, msgDiag, logCore);
  549.         }catch(HandlerException e){
  550.             setSOAPFault(AbstractErrorGenerator.getIntegrationInternalError(context), logCore,msgDiag, e, e.getIdentitaHandler());
  551.             return;
  552.         }catch(Exception e){
  553.             setSOAPFault(AbstractErrorGenerator.getIntegrationInternalError(context), logCore,msgDiag, e, "InvocazioneOutResponseHandler");
  554.             return;
  555.         }
  556.        

  557.        
  558.        
  559.        
  560.         // ---------------- fine gestione ------------------------------
  561.         OpenSPCoop2Message msgRisposta = null;
  562.         try{
  563.             msgRisposta = outResponseContext.getMessaggio();
  564.             boolean rispostaPresente = true;
  565.             OpenSPCoop2Properties properties = OpenSPCoop2Properties.getInstance(); // Puo' non essere inizializzato
  566.             if(properties!=null){
  567.                 rispostaPresente = ServicesUtils.verificaRispostaRelazioneCodiceTrasporto202(protocolFactory,OpenSPCoop2Properties.getInstance(), msgRisposta,true);
  568.             }
  569.             if(rispostaPresente){
  570.                 this.msgContext.setMessageResponse(msgRisposta);
  571.             }else{
  572.                 this.msgContext.setMessageResponse(null);
  573.                 msgRisposta = null;
  574.             }
  575.         }catch(Exception e){
  576.             setSOAPFault(AbstractErrorGenerator.getIntegrationInternalError(context), logCore,msgDiag, e, "FineGestioneRicezioneContenutiApplicativi");
  577.             return;
  578.         }
  579.        
  580.        
  581.        
  582.        
  583.        
  584.        
  585.        
  586.        
  587.        
  588.         // ------------- Dump risposta in uscita-----------------------------
  589.         if(Dump.isSistemaDumpDisponibile()){
  590.             try{
  591.                 ConfigurazionePdDManager configurazionePdDReader = ConfigurazionePdDManager.getInstance();  
  592.                 if (msgRisposta!=null) {
  593.                    
  594.                     Dump dumpApplicativo = getDump(configurazionePdDReader, protocolFactory, internalObjects, msgDiag.getPorta());
  595.                     if(outResponseContext.getResponseHeaders()==null) {
  596.                         outResponseContext.setResponseHeaders(new HashMap<>());
  597.                     }
  598.                     Map<String, List<String>> propertiesTrasporto = outResponseContext.getResponseHeaders();
  599.                     ServicesUtils.setGovWayHeaderResponse(requestMessage.getServiceBinding(),
  600.                             msgRisposta, OpenSPCoop2Properties.getInstance(),
  601.                             propertiesTrasporto, logCore, true, outResponseContext.getPddContext(), this.msgContext.getRequestInfo());
  602.                     dumpApplicativo.dumpRispostaUscita(msgRisposta,
  603.                             inRequestContext.getConnettore().getUrlProtocolContext(),
  604.                             outResponseContext.getResponseHeaders());
  605.                 }
  606.             }catch(DumpException e){
  607.                 setSOAPFault(AbstractErrorGenerator.getIntegrationInternalError(context), logCore,msgDiag, e, "DumpNonRiuscito");
  608.             }catch(Exception e){
  609.                 logError(logCore, e.getMessage(),e);
  610.                 // Se non riesco ad accedere alla configurazione sicuramente gia' nel messaggio di risposta e' presente l'errore di PdD non correttamente inizializzata
  611.             }
  612.         }
  613.        
  614.        
  615.     }
  616.    
  617.     private Dump getDump(ConfigurazionePdDManager configurazionePdDReader,
  618.             IProtocolFactory<?> protocolFactory,
  619.             HashMap<String, Object> internalObjects,
  620.             String nomePorta) throws DumpException, DriverRegistroServiziException {
  621.        
  622.         DumpConfigurazione dumpConfig = null;
  623.         if(internalObjects.containsKey(CostantiPdD.DUMP_CONFIG)) {
  624.             dumpConfig = (DumpConfigurazione) internalObjects.get(CostantiPdD.DUMP_CONFIG); // dovrebbe essere stata impostata per la pd/pa specifica
  625.         }
  626.         else {
  627.             dumpConfig = configurazionePdDReader.getDumpConfigurazionePortaDelegata();
  628.         }
  629.        
  630.         ProtocolContext protocolContext = this.msgContext.getProtocol();
  631.         URLProtocolContext urlProtocolContext = this.msgContext.getUrlProtocolContext();
  632.         IDSoggetto soggettoErogatore = null;
  633.         IDServizio idServizio = null;
  634.         IDSoggetto fruitore = null;
  635.         IDSoggetto dominio = null;
  636.         String idRichiesta = null;
  637.         if(protocolContext!=null) {
  638.             if(protocolContext.getTipoServizio()!=null && protocolContext.getServizio()!=null && protocolContext.getVersioneServizio()!=null &&
  639.                 protocolContext.getErogatore()!=null && protocolContext.getErogatore().getTipo()!=null && protocolContext.getErogatore().getNome()!=null) {
  640.                 idServizio = IDServizioFactory.getInstance().getIDServizioFromValues(protocolContext.getTipoServizio(), protocolContext.getServizio(),
  641.                         protocolContext.getErogatore(), protocolContext.getVersioneServizio());
  642.             }
  643.             dominio = protocolContext.getDominio();
  644.             idRichiesta = protocolContext.getIdRichiesta();
  645.             if(protocolContext.getFruitore()!=null && protocolContext.getFruitore().getTipo()!=null && protocolContext.getFruitore().getNome()!=null) {
  646.                 fruitore = protocolContext.getFruitore();
  647.             }
  648.         }
  649.        
  650.         if(dominio == null || fruitore==null || idServizio == null) {
  651.             if(urlProtocolContext!=null && urlProtocolContext.getInterfaceName()!=null) {
  652.                 IDPortaDelegata identificativoPortaDelegata = new IDPortaDelegata();
  653.                 identificativoPortaDelegata.setNome(urlProtocolContext.getInterfaceName());
  654.                 PortaDelegata portaDelegata = null;
  655.                 try {
  656.                     portaDelegata = configurazionePdDReader.getPortaDelegataSafeMethod(identificativoPortaDelegata, this.msgContext.getRequestInfo());
  657.                 }catch(Exception e) {
  658.                     // ignore
  659.                 }
  660.                 if(portaDelegata!=null) {
  661.                     // Aggiorno tutti
  662.                     soggettoErogatore = new IDSoggetto(portaDelegata.getSoggettoErogatore().getTipo(),portaDelegata.getSoggettoErogatore().getNome());
  663.                     if(portaDelegata.getServizio()!=null) {
  664.                         idServizio = IDServizioFactory.getInstance().getIDServizioFromValues(portaDelegata.getServizio().getTipo(),portaDelegata.getServizio().getNome(),
  665.                                     soggettoErogatore, portaDelegata.getServizio().getVersione());
  666.                     }
  667.                     dominio = new IDSoggetto(portaDelegata.getTipoSoggettoProprietario(), portaDelegata.getNomeSoggettoProprietario());
  668.                     fruitore = new IDSoggetto(portaDelegata.getTipoSoggettoProprietario(), portaDelegata.getNomeSoggettoProprietario());
  669.                     try {
  670.                         dominio.setCodicePorta(RegistroServiziManager.getInstance().getDominio(dominio, null, protocolFactory, this.msgContext.getRequestInfo()));
  671.                     }catch(Exception e) {
  672.                         dominio = OpenSPCoop2Properties.getInstance().getIdentitaPortaDefault(protocolFactory.getProtocol(), this.msgContext.getRequestInfo());
  673.                     }
  674.                 }
  675.             }
  676.         }
  677.         if(idServizio!=null) {
  678.             if(protocolContext!=null && protocolContext.getAzione()!=null) {
  679.                 idServizio.setAzione(protocolContext.getAzione());
  680.             }
  681.             else if(this.msgContext.getRequestInfo()!=null &&
  682.                     this.msgContext.getRequestInfo().getIdServizio()!=null && this.msgContext.getRequestInfo().getIdServizio().getAzione()!=null) {
  683.                 idServizio.setAzione(this.msgContext.getRequestInfo().getIdServizio().getAzione());
  684.             }
  685.         }
  686.         if(dominio==null) {
  687.             dominio = OpenSPCoop2Properties.getInstance().getIdentitaPortaDefault(protocolFactory.getProtocol(), this.msgContext.getRequestInfo());
  688.         }

  689.         Dump dumpApplicativo = null;
  690.         if(idServizio!=null){
  691.             dumpApplicativo = new Dump(dominio,
  692.                     this.msgContext.getIdModulo(),
  693.                     idRichiesta, fruitore, idServizio,
  694.                     this.msgContext.getTipoPorta(), nomePorta, this.msgContext.getPddContext(),
  695.                     null,null,
  696.                     dumpConfig);
  697.         }else{
  698.             dumpApplicativo = new Dump(dominio,
  699.                     this.msgContext.getIdModulo(),this.msgContext.getTipoPorta(), nomePorta,this.msgContext.getPddContext(),
  700.                     null,null,
  701.                     dumpConfig);
  702.         }
  703.        
  704.         return  dumpApplicativo;
  705.     }
  706.    
  707.     private void setSOAPFault(IntegrationFunctionError integrationFunctionError, Logger logCore, MsgDiagnostico msgDiag, Exception e, String posizione){
  708.        
  709.         HandlerException he = null;
  710.         if(e!=null && (e instanceof HandlerException)){
  711.             he = (HandlerException) e;
  712.         }
  713.        
  714.         if(msgDiag!=null){
  715.             if(he!=null){
  716.                 if(he.isEmettiDiagnostico()){
  717.                     msgDiag.logErroreGenerico(e, posizione);
  718.                 }
  719.             }else{
  720.                 msgDiag.logErroreGenerico(e, posizione);
  721.             }
  722.         }
  723.         else {
  724.             if(e!=null) {
  725.                 logError(logCore, posizione+": "+e.getMessage(),e);
  726.             }
  727.             else {
  728.                 logError(logCore, posizione);
  729.             }
  730.         }
  731.        
  732.         IntegrationFunctionError ifError = integrationFunctionError;
  733.         if(he!=null && he.getIntegrationFunctionError()!=null) {
  734.             ifError = he.getIntegrationFunctionError();
  735.         }
  736.         ErroreIntegrazione erroreIntegrazioneGenerato = null;
  737.         if(he!=null){
  738.             erroreIntegrazioneGenerato = he.convertToErroreIntegrazione();
  739.         }
  740.        
  741.         if (this.msgContext.isGestioneRisposta()) {
  742.             String posizioneFault = null;
  743.             if(e!=null) {
  744.                 posizioneFault = posizione+": "+e.getMessage();
  745.             }
  746.             else {
  747.                 posizioneFault = posizione;
  748.             }
  749.             if(erroreIntegrazioneGenerato==null) {
  750.                 erroreIntegrazioneGenerato = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.get5XX_ErroreProcessamento(posizioneFault);
  751.             }
  752.             OpenSPCoop2Message messageFault = this.generatoreErrore.build(this.msgContext.getPddContext(), ifError,
  753.                     erroreIntegrazioneGenerato,
  754.                     e, null);
  755.             this.msgContext.setMessageResponse(messageFault);
  756.         }
  757.     }
  758.    
  759.     private boolean checkInizializzazione(Logger logCore, ConfigurazionePdDManager configurazionePdDReader, RegistroServiziManager registroServiziReader,
  760.             PdDContext pddContext) {
  761.         if (!OpenSPCoop2Startup.initialize) {
  762.             String msgErrore = "Inizializzazione di GovWay non correttamente effettuata";
  763.             logError(logCore, "["+ RicezioneContenutiApplicativi.ID_MODULO+ "]  "+msgErrore);
  764.             try{
  765.                 // provo ad emetter un diagnostico
  766.                 if(this.msgContext.getMsgDiagnostico()!=null){
  767.                     this.msgContext.getMsgDiagnostico().logErroreGenerico(msgErrore,"InizializzazioneGovWay");
  768.                 }
  769.             }catch(Throwable t){logError(logCore, "Emissione diagnostico per errore inizializzazione non riuscita: "+t.getMessage(),t);}
  770.             if (this.msgContext.isGestioneRisposta()) {
  771.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext, IntegrationFunctionError.GOVWAY_NOT_INITIALIZED,
  772.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  773.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_501_PDD_NON_INIZIALIZZATA),null,null)));
  774.             }
  775.             return false;
  776.         }
  777.         if (!TimerMonitoraggioRisorseThread.isRisorseDisponibili()) {
  778.             String msgErrore = "Risorse di sistema non disponibili: "+ TimerMonitoraggioRisorseThread.getRisorsaNonDisponibile().getMessage();
  779.             logError(logCore, "["+ RicezioneContenutiApplicativi.ID_MODULO+ "]  "+msgErrore,TimerMonitoraggioRisorseThread.getRisorsaNonDisponibile());
  780.             try{
  781.                 // provo ad emetter un diagnostico
  782.                 if(this.msgContext.getMsgDiagnostico()!=null){
  783.                     this.msgContext.getMsgDiagnostico().logErroreGenerico(msgErrore,"InizializzazioneRisorseGovWay");
  784.                 }
  785.             }catch(Throwable t){logError(logCore, "Emissione diagnostico per errore inizializzazione non riuscita: "+t.getMessage(),t);}
  786.             if (this.msgContext.isGestioneRisposta()) {
  787.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext, IntegrationFunctionError.GOVWAY_RESOURCES_NOT_AVAILABLE,
  788.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  789.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_532_RISORSE_NON_DISPONIBILI),null,null)));
  790.             }
  791.             return false;
  792.         }
  793.         if (!TimerThresholdThread.freeSpace) {
  794.             String msgErrore = "Non sono disponibili abbastanza risorse per la gestione della richiesta";
  795.             logError(logCore, "["+ RicezioneContenutiApplicativi.ID_MODULO+ "]  "+msgErrore);
  796.             try{
  797.                 // provo ad emetter un diagnostico
  798.                 if(this.msgContext.getMsgDiagnostico()!=null){
  799.                     this.msgContext.getMsgDiagnostico().logErroreGenerico(msgErrore,"DisponibilitaRisorseGovWay");
  800.                 }
  801.             }catch(Throwable t){logError(logCore, "Emissione diagnostico per errore inizializzazione non riuscita: "+t.getMessage(),t);}
  802.             if (this.msgContext.isGestioneRisposta()) {
  803.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext, IntegrationFunctionError.GOVWAY_RESOURCES_NOT_AVAILABLE,
  804.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  805.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_533_RISORSE_DISPONIBILI_LIVELLO_CRITICO),null,null)));
  806.             }
  807.             return false;
  808.         }
  809.         if (!Tracciamento.tracciamentoDisponibile) {
  810.             String msgErrore = "Tracciatura non disponibile: "+ Tracciamento.motivoMalfunzionamentoTracciamento.getMessage();
  811.             logError(logCore, "["+ RicezioneContenutiApplicativi.ID_MODULO
  812.                     + "]  "+msgErrore,Tracciamento.motivoMalfunzionamentoTracciamento);
  813.             try{
  814.                 // provo ad emetter un diagnostico
  815.                 if(this.msgContext.getMsgDiagnostico()!=null){
  816.                     this.msgContext.getMsgDiagnostico().logErroreGenerico(msgErrore,"Tracciamento");
  817.                 }
  818.             }catch(Throwable t){logError(logCore, "Emissione diagnostico per errore inizializzazione non riuscita: "+t.getMessage(),t);}
  819.             if (this.msgContext.isGestioneRisposta()) {
  820.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext, IntegrationFunctionError.GOVWAY_RESOURCES_NOT_AVAILABLE,
  821.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  822.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_545_TRACCIATURA_NON_FUNZIONANTE),null,null)));
  823.             }
  824.             return false;
  825.         }
  826.         if (!MsgDiagnostico.gestoreDiagnosticaDisponibile) {
  827.             String msgErrore = "Sistema di diagnostica non disponibile: "+ MsgDiagnostico.motivoMalfunzionamentoDiagnostici.getMessage();
  828.             logError(logCore, "["+ RicezioneContenutiApplicativi.ID_MODULO
  829.                     + "]  "+msgErrore,MsgDiagnostico.motivoMalfunzionamentoDiagnostici);
  830.             try{
  831.                 // provo ad emetter un diagnostico lo stesso (molto probabilmente non ci riuscirร  essendo proprio la risorsa diagnostica non disponibile)
  832.                 if(this.msgContext.getMsgDiagnostico()!=null){
  833.                     this.msgContext.getMsgDiagnostico().logErroreGenerico(msgErrore,"Diagnostica");
  834.                 }
  835.             }catch(Throwable t){logDebug(logCore, "Emissione diagnostico per errore inizializzazione non riuscita: "+t.getMessage(),t);}
  836.             if (this.msgContext.isGestioneRisposta()) {
  837.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext, IntegrationFunctionError.GOVWAY_RESOURCES_NOT_AVAILABLE,
  838.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  839.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_546_DIAGNOSTICA_NON_FUNZIONANTE),null,null)));
  840.             }
  841.             return false;
  842.         }
  843.         if (!Dump.isSistemaDumpDisponibile()) {
  844.             String msgErrore = "Sistema di dump dei contenuti applicativi non disponibile: "+ Dump.getMotivoMalfunzionamentoDump().getMessage();
  845.             logError(logCore, "["+ RicezioneContenutiApplicativi.ID_MODULO
  846.                     + "]  "+msgErrore,Dump.getMotivoMalfunzionamentoDump());
  847.             try{
  848.                 // provo ad emetter un diagnostico
  849.                 if(this.msgContext.getMsgDiagnostico()!=null){
  850.                     this.msgContext.getMsgDiagnostico().logErroreGenerico(msgErrore,"Dump");
  851.                 }
  852.             }catch(Throwable t){logError(logCore, "Emissione diagnostico per errore inizializzazione non riuscita: "+t.getMessage(),t);}
  853.             if (this.msgContext.isGestioneRisposta()) {
  854.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext, IntegrationFunctionError.GOVWAY_RESOURCES_NOT_AVAILABLE,
  855.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  856.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_547_DUMP_CONTENUTI_APPLICATIVI_NON_FUNZIONANTE),null,null)));
  857.             }
  858.             return false;
  859.         }
  860.         // Check Configurazione (XML)
  861.         try{
  862.             configurazionePdDReader.verificaConsistenzaConfigurazione();    
  863.         }catch(Exception e){
  864.             String msgErrore = "Riscontrato errore durante la verifica della consistenza della configurazione";
  865.             logError(logCore, "["+ RicezioneContenutiApplicativi.ID_MODULO
  866.                     + "]  "+msgErrore,e);
  867.             try{
  868.                 // provo ad emetter un diagnostico
  869.                 if(this.msgContext.getMsgDiagnostico()!=null){
  870.                     this.msgContext.getMsgDiagnostico().logErroreGenerico(msgErrore,"CheckConfigurazioneGovWay");
  871.                 }
  872.             }catch(Throwable t){logError(logCore, "Emissione diagnostico per errore inizializzazione non riuscita: "+t.getMessage(),t);}
  873.             if (this.msgContext.isGestioneRisposta()) {
  874.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext, IntegrationFunctionError.GOVWAY_RESOURCES_NOT_AVAILABLE,
  875.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  876.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),null,null)));
  877.             }
  878.             return false;
  879.         }
  880.         // Check RegistroServizi (XML)
  881.         try{
  882.             registroServiziReader.verificaConsistenzaRegistroServizi();
  883.         }catch(Exception e){
  884.             String msgErrore = "Riscontrato errore durante la verifica del registro dei servizi";
  885.             logError(logCore, "["+ RicezioneContenutiApplicativi.ID_MODULO
  886.                     + "]  "+msgErrore,e);
  887.             try{
  888.                 // provo ad emetter un diagnostico
  889.                 if(this.msgContext.getMsgDiagnostico()!=null){
  890.                     this.msgContext.getMsgDiagnostico().logErroreGenerico(msgErrore,"CheckRegistroServizi");
  891.                 }
  892.             }catch(Throwable t){logError(logCore, "Emissione diagnostico per errore inizializzazione non riuscita: "+t.getMessage(),t);}
  893.             if (this.msgContext.isGestioneRisposta()) {
  894.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext, IntegrationFunctionError.GOVWAY_RESOURCES_NOT_AVAILABLE,
  895.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  896.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_534_REGISTRO_DEI_SERVIZI_NON_DISPONIBILE),null,null)));
  897.             }
  898.             return false;
  899.         }
  900.        
  901.         return true;
  902.     }

  903.     private void process_engine(InRequestContext inRequestContext,HashMap<String, Object> internalObjects,Object ... params)
  904.             throws TracciamentoException, DumpException, ProtocolException {

  905.    
  906.        
  907.         /* ------------ Lettura parametri della richiesta ------------- */

  908.         // Messaggio di ingresso
  909.         OpenSPCoop2Message requestMessage = inRequestContext.getMessaggio();
  910.                
  911.         // Logger
  912.         Logger logCore = inRequestContext.getLogCore();
  913.        
  914.         // Data Ingresso Richiesta
  915.         Date dataIngressoRichiesta = this.msgContext.getDataIngressoRichiesta();
  916.        
  917.         // ID Transazione
  918.         String idTransazione = PdDContext.getValue(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE, inRequestContext.getPddContext());
  919.        
  920.         // RequestInfo
  921.         RequestInfo requestInfo = this.msgContext.getRequestInfo();
  922.        
  923.         // Parametri della porta delegata invocata
  924.         URLProtocolContext urlProtocolContext = this.msgContext.getUrlProtocolContext();

  925.         // Credenziali utilizzate nella richiesta
  926.         Credenziali credenziali = this.msgContext.getCredenziali();

  927.         // Autenticazione/Autorizzazione registrate
  928.         ClassNameProperties className = ClassNameProperties.getInstance();

  929.         // PropertiesReader
  930.         OpenSPCoop2Properties propertiesReader = OpenSPCoop2Properties.getInstance();
  931.         PdDContext pddContext = inRequestContext.getPddContext();
  932.         if (propertiesReader == null) {
  933.             String msg = "Inizializzazione di GovWay non correttamente effettuata: OpenSPCoopProperties";
  934.             logError(logCore, msg);
  935.             if (this.msgContext.isGestioneRisposta()) {
  936.                 this.msgContext.setMessageResponse(this.generatoreErrore.build(pddContext, IntegrationFunctionError.GOVWAY_NOT_INITIALIZED,
  937.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  938.                         get5XX_ErroreProcessamento(msg,CodiceErroreIntegrazione.CODICE_501_PDD_NON_INIZIALIZZATA), null, null));
  939.             }
  940.             return;
  941.         }

  942.         // Configurazione PdD Reader
  943.         ConfigurazionePdDManager configurazionePdDReader = ConfigurazionePdDManager.getInstance();

  944.         // RegistroServizi Reader
  945.         RegistroServiziManager registroServiziReader = RegistroServiziManager.getInstance();

  946.         if(requestInfo==null) {
  947.             String msg = "Inizializzazione di GovWay non correttamente effettuata: RequestInfo is null";
  948.             logError(logCore, msg);
  949.             if (this.msgContext.isGestioneRisposta()) {
  950.                 this.msgContext.setMessageResponse(this.generatoreErrore.build(pddContext, IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  951.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  952.                         get5XX_ErroreProcessamento(msg), null, null));
  953.             }
  954.             return;
  955.         }
  956.        
  957.         // IdentificativoPdD
  958.         IDSoggetto identitaPdD = requestInfo.getIdentitaPdD();

  959.         // ProtocolFactory
  960.         IProtocolFactory<?> protocolFactory = requestInfo.getProtocolFactory();
  961.         ITraduttore traduttore = protocolFactory.createTraduttore();
  962.         IProtocolManager protocolManager = protocolFactory.createProtocolManager();
  963.         IProtocolConfiguration protocolConfig = protocolFactory.createProtocolConfiguration();
  964.        
  965.         // ProprietaErroreApplicativo
  966.         ProprietaErroreApplicativo proprietaErroreAppl = propertiesReader
  967.                 .getProprietaGestioneErrorePD(protocolManager);
  968.         proprietaErroreAppl.setDominio(identitaPdD.getCodicePorta());
  969.         proprietaErroreAppl.setIdModulo(this.msgContext.getIdModulo());
  970.         if(this.msgContext.isForceFaultAsXML()){
  971.             proprietaErroreAppl.setFaultAsXML(true); // es. se siamo in una richiesta http senza SOAP, un SoapFault non ha senso
  972.         }
  973.         this.msgContext.setProprietaErroreAppl(proprietaErroreAppl);
  974.         this.generatoreErrore.updateProprietaErroreApplicativo(proprietaErroreAppl);
  975.                
  976.         // MESSAGGIO DI LIBRERIA
  977.         ImbustamentoMessage imbustamentoMSG = new ImbustamentoMessage();
  978.        
  979.         // Context di risposta
  980.         this.msgContext.setProtocol(new ProtocolContext());
  981.         this.msgContext.getProtocol().setDominio(this.msgContext.getIdentitaPdD());
  982.         this.msgContext.setIntegrazione(new IntegrationContext());

  983.        
  984.        
  985.        
  986.        
  987.        
  988.         /* ------------ Controllo inizializzazione OpenSPCoop ------------------ */
  989.         if(!checkInizializzazione(logCore, configurazionePdDReader, registroServiziReader, pddContext)) {
  990.             return;
  991.         }
  992.        
  993.        
  994.        
  995.         // Logger dei messaggi diagnostici
  996.         String nomePorta = null;
  997.         if(requestInfo.getProtocolContext().getInterfaceName()!=null){
  998.             nomePorta = requestInfo.getProtocolContext().getInterfaceName();
  999.         }
  1000.         else{
  1001.             nomePorta = urlProtocolContext.getFunctionParameters() + "_urlInvocazione("+ urlProtocolContext.getUrlInvocazione_formBased() + ")";
  1002.         }
  1003.         MsgDiagnostico msgDiag = MsgDiagnostico.newInstance(TipoPdD.DELEGATA,identitaPdD, this.msgContext.getIdModulo(),nomePorta,requestInfo,configurazionePdDReader);
  1004.         if(msgDiag==null) {
  1005.             String msg = "Inizializzazione di GovWay non correttamente effettuata: MsgDiagnostico is null";
  1006.             logError(logCore, msg);
  1007.             if (this.msgContext.isGestioneRisposta()) {
  1008.                 this.msgContext.setMessageResponse(this.generatoreErrore.build(pddContext, IntegrationFunctionError.GOVWAY_NOT_INITIALIZED,
  1009.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1010.                         get5XX_ErroreProcessamento(msg,CodiceErroreIntegrazione.CODICE_501_PDD_NON_INIZIALIZZATA), null, null));
  1011.             }
  1012.             return;
  1013.         }
  1014.         this.msgContext.setMsgDiagnostico(msgDiag); // aggiorno msg diagnostico
  1015.         msgDiag.setPddContext(inRequestContext.getPddContext(), protocolFactory);
  1016.         msgDiag.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI);
  1017.        

  1018.         // set credenziali
  1019.         setCredenziali(credenziali, msgDiag);

  1020.         // inizializzazione risorse statiche
  1021.         try {
  1022.             if (RicezioneContenutiApplicativi.initializeService == false) {
  1023.                 msgDiag.mediumDebug("Inizializzazione risorse statiche...");
  1024.                 RicezioneContenutiApplicativi.initializeService(configurazionePdDReader,className,propertiesReader, logCore);
  1025.             }
  1026.         } catch (Exception e) {
  1027.             msgDiag.logErroreGenerico(e,"InizializzazioneRisorseServizioRicezioneContenutiApplicativi");
  1028.             if (this.msgContext.isGestioneRisposta()) {
  1029.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext, IntegrationFunctionError.GOVWAY_NOT_INITIALIZED,
  1030.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1031.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_501_PDD_NON_INIZIALIZZATA),e,null)));
  1032.             }
  1033.             return;
  1034.         }

  1035.         // Loader classi dinamiche
  1036.         Loader loader = Loader.getInstance();
  1037.         PddPluginLoader pluginLoader = PddPluginLoader.getInstance();
  1038.        
  1039.         // ConnectorInMessage
  1040.         @SuppressWarnings("unused")
  1041.         ConnectorInMessage connectorInMessage = null;
  1042.         if(params!=null){
  1043.             for (int i = 0; i < params.length; i++) {
  1044.                 if(params[i]!=null && (params[i] instanceof ConnectorInMessage) ){
  1045.                     connectorInMessage = (ConnectorInMessage) params[i];
  1046.                     break;
  1047.                 }
  1048.             }
  1049.         }
  1050.        
  1051.         Transaction transaction = null;
  1052.         try{
  1053.             transaction = TransactionContext.getTransaction(idTransazione);
  1054.         }catch(Exception e){
  1055.             msgDiag.logErroreGenerico(e,"getTransaction");
  1056.             if (this.msgContext.isGestioneRisposta()) {
  1057.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext, IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  1058.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1059.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_500_ERRORE_INTERNO),e,null)));
  1060.             }
  1061.             return;
  1062.         }
  1063.        
  1064.        
  1065.        

  1066.         // --------- OPENSPCOOPSTATE ---------
  1067.         OpenSPCoopState openspcoopstate = null;
  1068.         try{ // finally in fondo, vedi  #try-finally-openspcoopstate#
  1069.            
  1070.         msgDiag.mediumDebug("Inizializzazione connessione al database...");
  1071.         try {
  1072.             openspcoopstate = new OpenSPCoopStateful();
  1073.             openspcoopstate.setUseConnection(false); // gestione stateless per default
  1074.             openspcoopstate.initResource(identitaPdD, this.msgContext.getIdModulo(), idTransazione);
  1075.         } catch (Exception e) {
  1076.             msgDiag.logErroreGenerico(e,"openspcoopstate.initResource()");
  1077.             openspcoopstate.releaseResource();
  1078.             if (this.msgContext.isGestioneRisposta()) {
  1079.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.GOVWAY_RESOURCES_NOT_AVAILABLE,
  1080.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1081.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_505_GET_DB_CONNECTION), e,null)));
  1082.             }
  1083.             return;
  1084.         }
  1085.        
  1086.         // Refresh reader
  1087.         registroServiziReader = registroServiziReader.refreshState(openspcoopstate.getStatoRichiesta(),openspcoopstate.getStatoRisposta());
  1088.         configurazionePdDReader = configurazionePdDReader.refreshState(registroServiziReader);
  1089.         msgDiag.updateState(configurazionePdDReader);
  1090.        
  1091.        
  1092.        
  1093.        
  1094.        

  1095.        
  1096.        

  1097.        
  1098.        
  1099.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Identificazione porta delegata e soggetto fruitore...");
  1100.        
  1101.         /* ------------ Identificazione Porta Delegata e SoggettoFruitore */
  1102.         msgDiag.mediumDebug("Identificazione porta delegata e soggetto fruitore...");
  1103.         IDPortaDelegata identificativoPortaDelegata = null;
  1104.         PortaDelegata portaDelegata = null;
  1105.         String nomeUtilizzatoPerErrore = null;
  1106.         try {
  1107.             if(urlProtocolContext.getInterfaceName()!=null) {
  1108.                 identificativoPortaDelegata = new IDPortaDelegata();
  1109.                 identificativoPortaDelegata.setNome(urlProtocolContext.getInterfaceName());
  1110.                 portaDelegata = configurazionePdDReader.getPortaDelegata(identificativoPortaDelegata, requestInfo);
  1111.                 nomeUtilizzatoPerErrore = identificativoPortaDelegata.getNome();
  1112.             }
  1113.             else {
  1114.                 throw new Exception("InterfaceName non presente");
  1115.             }
  1116.         } catch (Exception e) {
  1117.             msgDiag.logErroreGenerico(e,"getPorta");
  1118.             openspcoopstate.releaseResource();
  1119.             if (this.msgContext.isGestioneRisposta()) {
  1120.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  1121.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1122.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_502_IDENTIFICAZIONE_PORTA), e,null)));
  1123.             }
  1124.             return;
  1125.         }

  1126.         // Raccolgo dati
  1127.         IDSoggetto soggettoFruitore = null;
  1128.         try {
  1129.             if(portaDelegata!=null) {
  1130.                 soggettoFruitore = new IDSoggetto(portaDelegata.getTipoSoggettoProprietario(), portaDelegata.getNomeSoggettoProprietario());
  1131.                 soggettoFruitore.setCodicePorta(configurazionePdDReader.getIdentificativoPorta(soggettoFruitore, protocolFactory, requestInfo));
  1132.             }
  1133.         } catch (Exception e) {
  1134.             msgDiag.logErroreGenerico(e,"getIdentificativoPorta");
  1135.             openspcoopstate.releaseResource();
  1136.             if (this.msgContext.isGestioneRisposta()) {
  1137.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  1138.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1139.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_502_IDENTIFICAZIONE_PORTA), e,null)));
  1140.             }
  1141.             return;
  1142.         }
  1143.         if(identificativoPortaDelegata.getIdentificativiFruizione()==null) {
  1144.             identificativoPortaDelegata.setIdentificativiFruizione(new IdentificativiFruizione());
  1145.         }
  1146.         identificativoPortaDelegata.getIdentificativiFruizione().setSoggettoFruitore(soggettoFruitore);
  1147.         if(soggettoFruitore!=null) {
  1148.             identitaPdD = soggettoFruitore; // la PdD Assume l'identita del soggetto
  1149.         }
  1150.         this.msgContext.getProtocol().setDominio(identitaPdD);
  1151.         this.msgContext.setIdentitaPdD(identitaPdD);
  1152.         // che possiede la Porta Delegata ID Porta Delegata
  1153.         this.msgContext.getIntegrazione().setIdPD(identificativoPortaDelegata);
  1154.         // altri contesti
  1155.         msgDiag.setDominio(identitaPdD); // imposto anche il dominio nel msgDiag
  1156.         msgDiag.setFruitore(soggettoFruitore);
  1157.         msgDiag.addKeyword(CostantiPdD.KEY_PORTA_DELEGATA, identificativoPortaDelegata.getNome());
  1158.         msgDiag.addKeywords(soggettoFruitore);
  1159.         proprietaErroreAppl.setDominio(identitaPdD.getCodicePorta()); // imposto
  1160.         // requestInfo
  1161.         requestInfo.setIdentitaPdD(identitaPdD);
  1162.         // anche il dominio per gli errori
  1163.         this.msgContext.setProprietaErroreAppl(proprietaErroreAppl);
  1164.         // GeneratoreErrore
  1165.         this.generatoreErrore.updateDominio(identitaPdD);
  1166.         this.generatoreErrore.updateProprietaErroreApplicativo(proprietaErroreAppl);
  1167.    
  1168.        
  1169.        
  1170.        
  1171.        
  1172.        

  1173.        
  1174.        
  1175.        
  1176.        
  1177.        
  1178.        
  1179.        
  1180.        
  1181.        
  1182.        
  1183.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Lettura header di integrazione...");
  1184.        

  1185.         /* --------------- Header Integrazione --------------- */
  1186.         msgDiag.mediumDebug("Lettura header di integrazione...");
  1187.         HeaderIntegrazione headerIntegrazioneRichiesta = null;
  1188.         if (this.msgContext.getHeaderIntegrazioneRichiesta() != null)
  1189.             headerIntegrazioneRichiesta = this.msgContext.getHeaderIntegrazioneRichiesta(); // prendo quello dell'IntegrationManager
  1190.         else
  1191.             headerIntegrazioneRichiesta = new HeaderIntegrazione(idTransazione);
  1192.         HeaderIntegrazione headerIntegrazioneRisposta = null;
  1193.         String[] tipiIntegrazionePD = null;
  1194.         try {
  1195.             tipiIntegrazionePD = configurazionePdDReader.getTipiIntegrazione(portaDelegata);
  1196.         } catch (Exception e) {
  1197.             msgDiag.logErroreGenerico(e, "getTipiIntegrazione(pd)");
  1198.             openspcoopstate.releaseResource();
  1199.             if (this.msgContext.isGestioneRisposta()) {
  1200.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  1201.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1202.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE), e,null)));
  1203.             }
  1204.             return;
  1205.         }
  1206.         if (tipiIntegrazionePD == null){
  1207.             if(RicezioneContenutiApplicativi.defaultPerProtocolloGestoreIntegrazionePD.containsKey(protocolFactory.getProtocol()))
  1208.                 tipiIntegrazionePD = RicezioneContenutiApplicativi.defaultPerProtocolloGestoreIntegrazionePD.get(protocolFactory.getProtocol());
  1209.             else
  1210.                 tipiIntegrazionePD = RicezioneContenutiApplicativi.defaultGestoriIntegrazionePD;
  1211.         }

  1212.         InRequestPDMessage inRequestPDMessage = new InRequestPDMessage();
  1213.         inRequestPDMessage.setBustaRichiesta(null); // non lo si conosce l'aggiorno appena letto le informazioni dal registro
  1214.         inRequestPDMessage.setMessage(requestMessage);
  1215.         inRequestPDMessage.setUrlProtocolContext(this.msgContext.getUrlProtocolContext());
  1216.         inRequestPDMessage.setPortaDelegata(portaDelegata);
  1217.         inRequestPDMessage.setSoggettoPropeprietarioPortaDelegata(soggettoFruitore);
  1218.         for (int i = 0; i < tipiIntegrazionePD.length; i++) {
  1219.             try {
  1220.                
  1221.                 IGestoreIntegrazionePD gestore = null;
  1222.                 try {
  1223.                     gestore = (IGestoreIntegrazionePD) pluginLoader.newIntegrazionePortaDelegata(tipiIntegrazionePD[i]);
  1224.                 }catch(Exception e){
  1225.                     throw e;
  1226.                 }
  1227.                 if(gestore!=null){
  1228.                     String classType = null;
  1229.                     try {
  1230.                         classType = gestore.getClass().getName();
  1231.                         AbstractCore.init(gestore, pddContext, protocolFactory);
  1232.                     } catch (Exception e) {
  1233.                         throw new Exception(
  1234.                                 "Riscontrato errore durante l'inizializzazione della classe ["+ classType
  1235.                                         + "] da utilizzare per la gestione dell'integrazione delle fruizioni di tipo ["+ tipiIntegrazionePD[i] + "]: " + e.getMessage());
  1236.                     }
  1237.                     gestore.readInRequestHeader(headerIntegrazioneRichiesta,inRequestPDMessage);
  1238.                 }  else {
  1239.                     msgDiag.logErroreGenerico("Lettura Gestore header di integrazione ["
  1240.                                     + tipiIntegrazionePD[i]+ "]  non riuscita: non inizializzato",
  1241.                                     "gestoriIntegrazionePD.get("+tipiIntegrazionePD[i]+")");
  1242.                 }
  1243.             } catch (Exception e) {
  1244.                 logDebug(logCore, "Errore durante la lettura dell'header di integrazione ["+ tipiIntegrazionePD[i]
  1245.                                 + "]: "+ e.getMessage(),e);
  1246.                 msgDiag.addKeyword(CostantiPdD.KEY_TIPO_HEADER_INTEGRAZIONE,tipiIntegrazionePD[i]);
  1247.                 msgDiag.addKeywordErroreProcessamento(e);
  1248.                 msgDiag.logPersonalizzato("headerIntegrazione.letturaFallita");
  1249.             }
  1250.         }


  1251.        
  1252.        

  1253.        
  1254.        
  1255.        
  1256.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Raccolta dati Gestione CORS ...");
  1257.         // NOTA: i dati CORS sono memorizzati solamente nella porta principale e non in quelle di eventuali azioni delegate.
  1258.         //       deve quindi essere recuperata prima di sostituire la pd con una piรน specifica
  1259.         CorsConfigurazione cors = null;
  1260.         HttpServletRequest httpServletRequest = null;
  1261.         boolean effettuareGestioneCORS = false;
  1262.         try {
  1263.             if(requestInfo!=null && requestInfo.getProtocolContext()!=null) {
  1264.                 httpServletRequest = requestInfo.getProtocolContext().getHttpServletRequest();  
  1265.             }
  1266.            
  1267.             if(httpServletRequest!=null && HttpRequestMethod.OPTIONS.name().equalsIgnoreCase(httpServletRequest.getMethod())) {
  1268.                
  1269.                 Object nomePortaObject = pddContext.getObject(CostantiPdD.NOME_PORTA_INVOCATA);
  1270.                 String nomePortaS = null;
  1271.                 if(nomePortaObject instanceof String) {
  1272.                     nomePortaS = (String) nomePortaObject;
  1273.                 }
  1274.                 PortaDelegata pdDefault = null;
  1275.                 if(nomePortaS!=null) {
  1276.                     IDPortaDelegata idPDdefault = new IDPortaDelegata();
  1277.                     idPDdefault.setNome(nomePortaS);
  1278.                     pdDefault = configurazionePdDReader.getPortaDelegataSafeMethod(idPDdefault, requestInfo);
  1279.                 }
  1280.                 if(pdDefault!=null) {
  1281.                     cors = configurazionePdDReader.getConfigurazioneCORS(pdDefault);
  1282.                 }
  1283.                 else if(portaDelegata!=null) {
  1284.                     cors = configurazionePdDReader.getConfigurazioneCORS(portaDelegata);
  1285.                 }
  1286.                 else {
  1287.                     cors = configurazionePdDReader.getConfigurazioneCORS();
  1288.                 }
  1289.             }
  1290.             else {
  1291.                 cors = new CorsConfigurazione();
  1292.                 cors.setStato(StatoFunzionalita.DISABILITATO);
  1293.             }
  1294.         } catch (Exception e) {
  1295.             msgDiag.logErroreGenerico(e, "configurazionePdDReader.getConfigurazioneCORS(pd)");
  1296.             openspcoopstate.releaseResource();
  1297.             if (this.msgContext.isGestioneRisposta()) {
  1298.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  1299.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1300.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE), e,null)));
  1301.             }
  1302.             return;
  1303.         }
  1304.        
  1305.        
  1306.        
  1307.        
  1308.        
  1309.        
  1310.        
  1311.        
  1312.        
  1313.        
  1314.        
  1315.        
  1316.        
  1317.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Lettura servizio associato alla PD invocata...");
  1318.        
  1319.        
  1320.        

  1321.         /*
  1322.          * ------------- Lettura azione associato alla PD invocata ed eventuale aggiornamento della pd utilizzata ------------
  1323.          */
  1324.         msgDiag.mediumDebug("Lettura azione associato alla PD invocata...");
  1325.         String idModuloInAttesa = null;
  1326.         if (this.msgContext.isGestioneRisposta())
  1327.             idModuloInAttesa = this.msgContext.getIdModulo();
  1328.         RichiestaDelegata richiestaDelegata = new RichiestaDelegata(
  1329.                 identificativoPortaDelegata, null,
  1330.                 idModuloInAttesa, proprietaErroreAppl, identitaPdD);
  1331.         richiestaDelegata.setIntegrazione(this.msgContext.getIntegrazione());
  1332.         richiestaDelegata.setProtocol(this.msgContext.getProtocol());
  1333.         IDServizio idServizio = null;
  1334.         try {
  1335.             if(portaDelegata==null) {
  1336.                 throw new Exception("PortaDelgata non trovata");
  1337.             }
  1338.             IDSoggetto soggettoErogatore = new IDSoggetto(portaDelegata.getSoggettoErogatore().getTipo(),portaDelegata.getSoggettoErogatore().getNome());
  1339.             idServizio = IDServizioFactory.getInstance().getIDServizioFromValues(portaDelegata.getServizio().getTipo(),portaDelegata.getServizio().getNome(),
  1340.                     soggettoErogatore, portaDelegata.getServizio().getVersione());
  1341.             if(requestInfo.getIdServizio()!=null && requestInfo.getIdServizio().getAzione()!=null){
  1342.                 // gia identificata
  1343.                 idServizio.setAzione(requestInfo.getIdServizio().getAzione());
  1344.                 // aggiorno anche codice porta erogatore gia' identificato
  1345.                 if(requestInfo.getIdServizio().getSoggettoErogatore()!=null) {
  1346.                     idServizio.getSoggettoErogatore().setCodicePorta(requestInfo.getIdServizio().getSoggettoErogatore().getCodicePorta());
  1347.                 }
  1348.             }
  1349.             else{
  1350.                 idServizio.setAzione(configurazionePdDReader.getAzione(portaDelegata, urlProtocolContext, requestInfo, requestMessage, null,
  1351.                         headerIntegrazioneRichiesta, this.msgContext.getIdModulo().endsWith(IntegrationManager.ID_MODULO), protocolFactory));
  1352.             }

  1353.         } catch (IdentificazioneDinamicaException e) {
  1354.            
  1355.             boolean throwFault = true;
  1356.             if(StatoFunzionalita.ABILITATO.equals(cors.getStato()) && this.msgContext.isGestioneRisposta()) {
  1357.                 throwFault = false;
  1358.             }
  1359.             if(throwFault) {
  1360.            
  1361.                 pddContext.addObject(org.openspcoop2.core.constants.Costanti.OPERAZIONE_NON_INDIVIDUATA, "true");
  1362.                
  1363.                 msgDiag.addKeywordErroreProcessamento(e);
  1364.                 msgDiag.logPersonalizzato("identificazioneDinamicaAzioneNonRiuscita");
  1365.                 openspcoopstate.releaseResource();
  1366.                 if (this.msgContext.isGestioneRisposta()) {
  1367.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.OPERATION_UNDEFINED,
  1368.                             ErroriIntegrazione.ERRORE_403_AZIONE_NON_IDENTIFICATA.getErroreIntegrazione(),e,null)));
  1369.                 }
  1370.                 return;
  1371.             }
  1372.             else {
  1373.                 effettuareGestioneCORS = true;
  1374.             }
  1375.                
  1376.         } catch (Exception e) {
  1377.             msgDiag.addKeywordErroreProcessamento(e);
  1378.             msgDiag.logPersonalizzato("identificazioneDinamicaAzioneNonRiuscita");
  1379.             logError(logCore, msgDiag.getMessaggio_replaceKeywords("identificazioneDinamicaAzioneNonRiuscita"),e);
  1380.             openspcoopstate.releaseResource();
  1381.             if (this.msgContext.isGestioneRisposta()) {
  1382.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  1383.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1384.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE), e,null)));
  1385.             }
  1386.             return;
  1387.         }
  1388.         try {
  1389.             if(idServizio!=null && idServizio.getSoggettoErogatore()!=null &&
  1390.                     idServizio.getSoggettoErogatore().getCodicePorta()==null) {
  1391.                 idServizio.getSoggettoErogatore().setCodicePorta(registroServiziReader.getDominio(idServizio.getSoggettoErogatore(), null, protocolFactory, requestInfo));
  1392.             }
  1393.                        
  1394.             // aggiorno idServizio
  1395.             richiestaDelegata.setIdServizio(idServizio);
  1396.             if(identificativoPortaDelegata.getIdentificativiFruizione()!=null) {
  1397.                 identificativoPortaDelegata.getIdentificativiFruizione().setIdServizio(idServizio);
  1398.             }
  1399.        
  1400.             // aggiorno informazioni dell'header di integrazione della risposta
  1401.             headerIntegrazioneRisposta = new HeaderIntegrazione(idTransazione);
  1402.             if(soggettoFruitore!=null) {
  1403.                 headerIntegrazioneRisposta.getBusta().setTipoMittente(soggettoFruitore.getTipo());
  1404.                 headerIntegrazioneRisposta.getBusta().setMittente(soggettoFruitore.getNome());
  1405.             }
  1406.             headerIntegrazioneRisposta.getBusta().setTipoDestinatario(richiestaDelegata.getIdServizio().getSoggettoErogatore().getTipo());
  1407.             headerIntegrazioneRisposta.getBusta().setDestinatario(richiestaDelegata.getIdServizio().getSoggettoErogatore().getNome());
  1408.             headerIntegrazioneRisposta.getBusta().setTipoServizio(richiestaDelegata.getIdServizio().getTipo());
  1409.             headerIntegrazioneRisposta.getBusta().setServizio(richiestaDelegata.getIdServizio().getNome());
  1410.             headerIntegrazioneRisposta.getBusta().setVersioneServizio(richiestaDelegata.getIdServizio().getVersione());
  1411.             headerIntegrazioneRisposta.getBusta().setAzione(richiestaDelegata.getIdServizio().getAzione());
  1412.             if (headerIntegrazioneRichiesta!=null && headerIntegrazioneRichiesta.getBusta() != null
  1413.                     && headerIntegrazioneRichiesta.getBusta().getRiferimentoMessaggio() != null) {
  1414.                 // per profilo asincrono asimmetrico e simmetrico
  1415.                 headerIntegrazioneRisposta.getBusta().setRiferimentoMessaggio(headerIntegrazioneRichiesta.getBusta().getRiferimentoMessaggio());
  1416.             }
  1417.         } catch (Exception e) {
  1418.             msgDiag.logErroreGenerico(e, "configurazionePdDReader.letturaDatiServizioServizioNonRiuscita(pd)");
  1419.             openspcoopstate.releaseResource();
  1420.             if (this.msgContext.isGestioneRisposta()) {
  1421.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  1422.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1423.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE), e,null)));
  1424.             }
  1425.             return;
  1426.         }
  1427.         msgDiag.setServizio(richiestaDelegata.getIdServizio());
  1428.         msgDiag.addKeywords(richiestaDelegata.getIdServizio());
  1429.        
  1430.        
  1431.        
  1432.        
  1433.        
  1434.         // Gestione CORS
  1435.        
  1436.         if(!effettuareGestioneCORS && StatoFunzionalita.ABILITATO.equals(cors.getStato()) &&
  1437.                 richiestaDelegata!=null && richiestaDelegata.getIdServizio()!=null &&
  1438.                 richiestaDelegata.getIdServizio().getAzione()==null) {
  1439.             if(ServiceBinding.REST.equals(requestInfo.getIntegrationServiceBinding())) {
  1440.                 // in rest una risorsa deve essere riconsociuta
  1441.                 if(StatoFunzionalita.ABILITATO.equals(cors.getStato()) && this.msgContext.isGestioneRisposta()) {
  1442.                     effettuareGestioneCORS = true;
  1443.                 }
  1444.             }
  1445.             else {
  1446.                 boolean azioneErrata = false;
  1447.                 Servizio infoServizio = null;
  1448.                 try {
  1449.                     infoServizio = registroServiziReader.getInfoServizio(soggettoFruitore, richiestaDelegata.getIdServizio(),null,false, true, requestInfo);
  1450.                 } catch (DriverRegistroServiziAzioneNotFound e) {
  1451.                     azioneErrata = true;
  1452.                 } catch (Throwable e) {
  1453.                     // ignore
  1454.                 }
  1455.                 if (infoServizio == null) {
  1456.                     try {
  1457.                         infoServizio = registroServiziReader.getInfoServizioCorrelato(soggettoFruitore,richiestaDelegata.getIdServizio(),null, true, requestInfo);
  1458.                     } catch (DriverRegistroServiziAzioneNotFound e) {
  1459.                         azioneErrata = true;
  1460.                     } catch (Throwable e) {
  1461.                         // ignore
  1462.                     }
  1463.                 }
  1464.                 if(azioneErrata) {
  1465.                     effettuareGestioneCORS = true;
  1466.                 }
  1467.             }
  1468.         }
  1469.        
  1470.         boolean corsTrasparente = false;
  1471.                
  1472.         if(!effettuareGestioneCORS) {
  1473.             if(pddContext.containsKey(CostantiPdD.CORS_PREFLIGHT_REQUEST_SOAP)) {
  1474.                 effettuareGestioneCORS = true;
  1475.             }
  1476.             else {
  1477.                 // devo verificare se si tratta di una azione matched poichรจ รจ stato inserito un tipo http method 'qualsiasi'
  1478.                 if(propertiesReader.isGestioneCORS_resourceHttpMethodQualsiasi_ricezioneContenutiApplicativi()) {
  1479.                     if(cors!=null &&
  1480.                             StatoFunzionalita.ABILITATO.equals(cors.getStato()) &&
  1481.                             TipoGestioneCORS.GATEWAY.equals(cors.getTipo()) &&
  1482.                             this.msgContext.isGestioneRisposta()) {
  1483.                         if(idServizio!=null && idServizio.getAzione()!=null) {
  1484.                             try {
  1485.                                 RegistroServiziManager registroServiziManager = RegistroServiziManager.getInstance();
  1486.                                 AccordoServizioParteSpecifica asps = registroServiziManager.getAccordoServizioParteSpecifica(idServizio, null, false, requestInfo);
  1487.                                 if(asps!=null) {
  1488.                                     AccordoServizioParteComune aspc = registroServiziManager.getAccordoServizioParteComune(IDAccordoFactory.getInstance().getIDAccordoFromUri(asps.getAccordoServizioParteComune()), null, false, false, requestInfo);
  1489.                                     if(aspc!=null && org.openspcoop2.core.registry.constants.ServiceBinding.REST.equals(aspc.getServiceBinding())) {
  1490.                                         if(aspc.sizeResourceList()>0) {
  1491.                                             for (Resource resource : aspc.getResourceList()) {
  1492.                                                 if(idServizio.getAzione().equals(resource.getNome())) {
  1493.                                                     if(resource.getMethod()==null){
  1494.                                                         effettuareGestioneCORS = true;
  1495.                                                     }
  1496.                                                     break;
  1497.                                                 }
  1498.                                             }
  1499.                                         }
  1500.                                     }
  1501.                                 }
  1502.                             }catch(Throwable tIgnore) {
  1503.                                 // ignore
  1504.                             }
  1505.                         }
  1506.                     }
  1507.                 }
  1508.             }
  1509.         }
  1510.        
  1511.         if(effettuareGestioneCORS) {
  1512.            
  1513.             if(TipoGestioneCORS.GATEWAY.equals(cors.getTipo())) {
  1514.                
  1515.                 CORSFilter corsFilter = new CORSFilter(logCore, cors);
  1516.                 try {
  1517.                     CORSWrappedHttpServletResponse res = new CORSWrappedHttpServletResponse(false);
  1518.                     corsFilter.doCORS(httpServletRequest, res, CORSRequestType.PRE_FLIGHT, true);
  1519.                     if(this.msgContext.getResponseHeaders()==null) {
  1520.                         this.msgContext.setResponseHeaders(new HashMap<>());
  1521.                     }
  1522.                     this.msgContext.getResponseHeaders().putAll(res.getHeadersValues());
  1523.                     this.msgContext.setMessageResponse(res.buildMessage());
  1524.                     pddContext.addObject(org.openspcoop2.core.constants.Costanti.CORS_PREFLIGHT_REQUEST_VIA_GATEWAY, "true");
  1525.                 }catch(Exception e) {
  1526.                     // un eccezione non dovrebbe succedere
  1527.                     msgDiag.logErroreGenerico(e, "gestioneCORS(pd)");
  1528.                     openspcoopstate.releaseResource();
  1529.                     if (this.msgContext.isGestioneRisposta()) {
  1530.                         this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  1531.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1532.                                 get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE), e,null)));
  1533.                     }
  1534.                     return;
  1535.                 }
  1536.                
  1537.                 openspcoopstate.releaseResource();
  1538.                 return;
  1539.                    
  1540.             }
  1541.             else {
  1542.                
  1543.                 pddContext.addObject(org.openspcoop2.core.constants.Costanti.CORS_PREFLIGHT_REQUEST_TRASPARENTE, "true");
  1544.                 corsTrasparente = true;
  1545.                
  1546.             }
  1547.            
  1548.         }
  1549.        
  1550.        
  1551.        
  1552.        
  1553.        

  1554.        
  1555.        
  1556.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Autorizzazione canale ...");
  1557.         ConfigurazioneCanaliNodo configurazioneCanaliNodo = null;
  1558.         try {  
  1559.             configurazioneCanaliNodo = configurazionePdDReader.getConfigurazioneCanaliNodo();
  1560.         } catch (Exception e) {
  1561.             msgDiag.logErroreGenerico(e, "configurazionePdDReader.getConfigurazioneCanaliNodo()");
  1562.             openspcoopstate.releaseResource();
  1563.             if (this.msgContext.isGestioneRisposta()) {
  1564.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  1565.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1566.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE), e,null)));
  1567.             }
  1568.             return;
  1569.         }
  1570.         boolean canaleNonAutorizzato = false;
  1571.         try {
  1572.             if(configurazioneCanaliNodo!=null && configurazioneCanaliNodo.isEnabled()) {
  1573.            
  1574.                 msgDiag.addKeyword(CostantiPdD.KEY_DETAILS, "");
  1575.                 msgDiag.logPersonalizzato("autorizzazioneCanale.inCorso");
  1576.                
  1577.                 String canaleApiInvocata = null;
  1578.                 if(portaDelegata!=null) {
  1579.                     String canalePorta = portaDelegata.getCanale();
  1580.                     if(canalePorta!=null && !"".equals(canalePorta)) {
  1581.                         canaleApiInvocata = canalePorta;
  1582.                     }
  1583.                     else {
  1584.                         try {
  1585.                             AccordoServizioParteSpecifica asps = registroServiziReader.getAccordoServizioParteSpecifica(idServizio, null, false, requestInfo);
  1586.                             if(asps!=null) {
  1587.                                 AccordoServizioParteComune aspc = registroServiziReader.getAccordoServizioParteComune(IDAccordoFactory.getInstance().getIDAccordoFromUri(asps.getAccordoServizioParteComune()), null, false, false, requestInfo);
  1588.                                 if(aspc!=null) {
  1589.                                     String canaleApi = aspc.getCanale();
  1590.                                     if(canaleApi!=null && !"".equals(canaleApi)) {
  1591.                                         canaleApiInvocata = canaleApi;
  1592.                                     }
  1593.                                 }
  1594.                             }
  1595.                         }catch(DriverRegistroServiziNotFound notFound) {
  1596.                             // saranno segnalati altri errori dovuti al non riconoscimento del servizio
  1597.                         }
  1598.                     }
  1599.                    
  1600.                     if(canaleApiInvocata==null || "".equals(canaleApiInvocata)) {
  1601.                         canaleApiInvocata = configurazioneCanaliNodo.getCanaleDefault();
  1602.                     }
  1603.                    
  1604.                     if(!configurazioneCanaliNodo.getCanaliNodo().contains(canaleApiInvocata)) {
  1605.                         canaleNonAutorizzato = true;
  1606.                         String dettaglio=" (nodo '"+configurazioneCanaliNodo.getIdNodo()+"':"+configurazioneCanaliNodo.getCanaliNodo()+" api-invocata:"+canaleApiInvocata+")";
  1607.                         msgDiag.addKeyword(CostantiPdD.KEY_DETAILS, dettaglio);
  1608.                         pddContext.addObject(org.openspcoop2.core.constants.Costanti.ERRORE_AUTORIZZAZIONE, "true");
  1609.                         throw new Exception("L'API invocata richiede un canale differente da quelli associati al nodo; invocazione non autorizzata");
  1610.                     }
  1611.                     else {
  1612.                         msgDiag.logPersonalizzato("autorizzazioneCanale.effettuata");
  1613.                     }
  1614.                    
  1615.                 }
  1616. //              else {
  1617. //                  // saranno segnalati altri errori dovuti al non riconoscimento della porta
  1618. //              }
  1619.                
  1620.             }
  1621.         } catch (Exception e) {
  1622.            
  1623.             String msgErrore = e.getMessage();
  1624.            
  1625.             msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, msgErrore);
  1626.             msgDiag.logPersonalizzato("autorizzazioneCanale.fallita");
  1627.            
  1628.             ErroreIntegrazione errore = canaleNonAutorizzato ? ErroriIntegrazione.ERRORE_404_AUTORIZZAZIONE_FALLITA_SA_ANONIMO.getErrore404_AutorizzazioneFallitaServizioApplicativoAnonimo(msgErrore) :
  1629.                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE);
  1630.             IntegrationFunctionError integrationFunctionError = canaleNonAutorizzato ? IntegrationFunctionError.AUTHORIZATION_DENY : IntegrationFunctionError.INTERNAL_REQUEST_ERROR;

  1631.             openspcoopstate.releaseResource();
  1632.             if (this.msgContext.isGestioneRisposta()) {
  1633.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,integrationFunctionError, errore, e,null)));
  1634.             }
  1635.             return;
  1636.         }
  1637.        
  1638.        
  1639.        
  1640.        
  1641.        
  1642.        
  1643.        
  1644.        
  1645.        
  1646.        
  1647.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Identificazione PD specifica per azione del servizio ...");
  1648.        
  1649.         msgDiag.mediumDebug("Lettura azione associato alla PD invocata...");
  1650.         if(richiestaDelegata.getIdServizio().getAzione()!=null && portaDelegata!=null) {
  1651.             // verifico se esiste una porta delegata piu' specifica
  1652.             IdentificazionePortaDelegata identificazione = new IdentificazionePortaDelegata(logCore, protocolFactory,
  1653.                     registroServiziReader, configurazionePdDReader, requestInfo,
  1654.                     portaDelegata);
  1655.             String action = richiestaDelegata.getIdServizio().getAzione();
  1656.             if(identificazione.find(action)) {
  1657.                 IDPortaDelegata idPD_action = identificazione.getIDPortaDelegata(action);
  1658.                 if(idPD_action!=null) {
  1659.                    
  1660.                     requestMessage.addContextProperty(CostantiPdD.NOME_PORTA_INVOCATA, portaDelegata.getNome()); // prima di aggiornare la porta delegata
  1661.                    
  1662.                     identificativoPortaDelegata = idPD_action;
  1663.                     portaDelegata = identificazione.getPortaDelegata(action);
  1664.                     nomeUtilizzatoPerErrore = "Configurazione specifica per l'azione '"+action+"', porta '"+ identificativoPortaDelegata.getNome()+"'";
  1665.                                        
  1666.                     // aggiornao dati che possiede la Porta Delegata ID Porta Delegata
  1667.                     this.msgContext.getIntegrazione().setIdPD(identificativoPortaDelegata);
  1668.                     msgDiag.addKeyword(CostantiPdD.KEY_PORTA_DELEGATA, identificativoPortaDelegata.getNome());
  1669.                     msgDiag.updatePorta(identificativoPortaDelegata.getNome(), requestInfo);
  1670.                     richiestaDelegata.setIdPortaDelegata(identificativoPortaDelegata);
  1671.                     if(requestMessage.getTransportRequestContext()!=null) {
  1672.                         requestMessage.getTransportRequestContext().setInterfaceName(identificativoPortaDelegata.getNome());
  1673.                     }
  1674.                    
  1675.                     pddContext.removeObject(org.openspcoop2.core.constants.Costanti.PROPRIETA_CONFIGURAZIONE);
  1676.                     try {
  1677.                         Map<String, String> configProperties = configurazionePdDReader.getProprietaConfigurazione(portaDelegata);
  1678.                         if (configProperties != null && !configProperties.isEmpty()) {
  1679.                            pddContext.addObject(org.openspcoop2.core.constants.Costanti.PROPRIETA_CONFIGURAZIONE, configProperties);
  1680.                         }
  1681.                     }catch(Exception e) {
  1682.                         logError(logCore, "Errore durante la lettura delle proprietร  di configurazione della porta delegata [" + portaDelegata.getNome() + "]: " + e.getMessage(), e);
  1683.                     }
  1684.                 }
  1685.             }else {
  1686.                 pddContext.addObject(org.openspcoop2.core.constants.Costanti.API_NON_INDIVIDUATA, "true");
  1687.                 msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, identificazione.getErroreIntegrazione().getDescrizione(protocolFactory));
  1688.                 msgDiag.logPersonalizzato("portaDelegataNonEsistente");
  1689.                 openspcoopstate.releaseResource();
  1690.                 if (this.msgContext.isGestioneRisposta()) {
  1691.                     IntegrationFunctionError integrationFunctionError = null;
  1692.                     if(CodiceErroreIntegrazione.CODICE_401_PORTA_INESISTENTE.equals(identificazione.getErroreIntegrazione().getCodiceErrore())){
  1693.                         integrationFunctionError = IntegrationFunctionError.API_OUT_UNKNOWN;
  1694.                     }else{
  1695.                         integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  1696.                     }
  1697.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,integrationFunctionError, identificazione.getErroreIntegrazione(),null,null)));
  1698.                 }
  1699.                 return;
  1700.             }
  1701.         }
  1702.        
  1703.        
  1704.        
  1705.        


  1706.        
  1707.        
  1708.        
  1709.        
  1710.         // ------------- Informazioni Integrazione -----------------------------
  1711.        
  1712.         msgDiag.mediumDebug("Aggiungo informazioni di integrazione dinamica nel contesto ...");
  1713.                
  1714.         try {
  1715.             if(portaDelegata!=null) {
  1716.                 configurazionePdDReader.setInformazioniIntegrazioneDinamiche(logCore, urlProtocolContext, pddContext, portaDelegata);
  1717.             }
  1718.         }
  1719.         catch (Exception e) {
  1720.             msgDiag.logErroreGenerico(e, "setInformazioniIntegrazioneDinamiche");
  1721.             openspcoopstate.releaseResource();
  1722.             if (this.msgContext.isGestioneRisposta()) {
  1723.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.BAD_REQUEST,
  1724.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1725.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE), e,null)));
  1726.             }
  1727.             return;
  1728.         }
  1729.        
  1730.        
  1731.        
  1732.        
  1733.        
  1734.        
  1735.        
  1736.         // ------------- Dump richiesta-----------------------------
  1737.        
  1738.         msgDiag.mediumDebug("Dump richiesta ...");
  1739.        
  1740.         DumpConfigurazione dumpConfig = null;
  1741.         try {
  1742.             dumpConfig = configurazionePdDReader.getDumpConfigurazione(portaDelegata);
  1743.             internalObjects.put(CostantiPdD.DUMP_CONFIG, dumpConfig);
  1744.         }
  1745.         catch (Exception e) {
  1746.             msgDiag.logErroreGenerico(e, "readDumpConfigurazione");
  1747.             openspcoopstate.releaseResource();
  1748.             if (this.msgContext.isGestioneRisposta()) {
  1749.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  1750.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1751.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE), e,null)));
  1752.             }
  1753.             return;
  1754.         }
  1755.        
  1756.         Dump dumpApplicativo = new Dump(identitaPdD,
  1757.                 this.msgContext.getIdModulo(), null,
  1758.                 soggettoFruitore, richiestaDelegata.getIdServizio(),
  1759.                 this.msgContext.getTipoPorta(), msgDiag.getPorta(), inRequestContext.getPddContext(),
  1760.                 openspcoopstate.getStatoRichiesta(),openspcoopstate.getStatoRisposta(),
  1761.                 dumpConfig);
  1762.         dumpApplicativo.dumpRichiestaIngresso(requestMessage,inRequestContext.getConnettore().getUrlProtocolContext());
  1763.         internalObjects.put(CostantiPdD.DUMP_RICHIESTA_EFFETTUATO, true);
  1764.        
  1765.        
  1766.        
  1767.        
  1768.        
  1769.        
  1770.        
  1771.        
  1772.        
  1773.        
  1774.        
  1775.        
  1776.        
  1777.        
  1778.        
  1779.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Autenticazione ...");
  1780.        
  1781.        

  1782.         /* --------------- Gestione credenziali --------------- */
  1783.         if(RicezioneContenutiApplicativi.tipiGestoriCredenziali!=null){
  1784.             msgDiag.mediumDebug("Gestione personalizzata delle credenziali...");
  1785.            
  1786.             for (int i = 0; i < RicezioneContenutiApplicativi.tipiGestoriCredenziali.length; i++) {
  1787.                 try {
  1788.                                
  1789.                     IGestoreCredenziali gestore = null;
  1790.                     String classType = null;
  1791.                     try {
  1792.                         classType = className.getGestoreCredenziali(RicezioneContenutiApplicativi.tipiGestoriCredenziali[i]);
  1793.                         gestore = (IGestoreCredenziali)loader.newInstance(classType);
  1794.                         AbstractCore.init(gestore, pddContext, protocolFactory);
  1795.                     } catch (Exception e) {
  1796.                         throw new Exception(
  1797.                                 "Riscontrato errore durante il caricamento della classe ["+ classType
  1798.                                 + "] da utilizzare per la gestione delle credenziali di tipo ["
  1799.                                 + RicezioneContenutiApplicativi.tipiGestoriCredenziali[i]+ "]: " + e.getMessage());
  1800.                     }
  1801.                    
  1802.                     if (gestore != null) {
  1803.                         Credenziali credenzialiRitornate = gestore.elaborazioneCredenziali(identitaPdD, inRequestContext.getConnettore(), requestMessage);
  1804.                         if(credenzialiRitornate==null){
  1805.                             throw new Exception("Credenziali non ritornate");
  1806.                         }
  1807.                         if(inRequestContext.getConnettore().getCredenziali().equals(credenzialiRitornate) == false){
  1808.                             String nuoveCredenziali = credenzialiRitornate.toString();
  1809.                             if(nuoveCredenziali.length()>0) {
  1810.                                 nuoveCredenziali = nuoveCredenziali.substring(0,(nuoveCredenziali.length()-1));
  1811.                             }
  1812.                             msgDiag.addKeyword(CostantiPdD.KEY_NUOVE_CREDENZIALI,nuoveCredenziali);
  1813.                             String identita = gestore.getIdentitaGestoreCredenziali();
  1814.                             if(identita==null){
  1815.                                 identita = "Gestore delle credenziali di tipo "+RicezioneContenutiApplicativi.tipiGestoriCredenziali[i];
  1816.                             }
  1817.                             msgDiag.addKeyword(CostantiPdD.KEY_IDENTITA_GESTORE_CREDENZIALI, identita);
  1818.                             pddContext.addObject(org.openspcoop2.core.constants.Costanti.IDENTITA_GESTORE_CREDENZIALI, identita);
  1819.                             msgDiag.logPersonalizzato("gestoreCredenziali.nuoveCredenziali");
  1820.                             // update credenziali
  1821.                             inRequestContext.getConnettore().setCredenziali(credenzialiRitornate);
  1822.                             credenziali = credenzialiRitornate;
  1823.                             setCredenziali(credenziali, msgDiag);  
  1824.                         }
  1825.                     } else {
  1826.                         throw new Exception("non inizializzato");
  1827.                     }
  1828.                 }
  1829.                 catch (Exception e) {
  1830.                     logError(logCore, "Errore durante l'identificazione delle credenziali ["+ RicezioneContenutiApplicativi.tipiGestoriCredenziali[i]
  1831.                              + "]: "+ e.getMessage(),e);
  1832.                     msgDiag.addKeyword(CostantiPdD.KEY_TIPO_GESTORE_CREDENZIALI,RicezioneContenutiApplicativi.tipiGestoriCredenziali[i]);
  1833.                     msgDiag.addKeywordErroreProcessamento(e);
  1834.                     msgDiag.logPersonalizzato("gestoreCredenziali.errore");
  1835.                     ErroreIntegrazione errore = null;
  1836.                     IntegrationFunctionError integrationFunctionError = null;
  1837.                     String wwwAuthenticateErrorHeader = null;
  1838.                     if(e instanceof GestoreCredenzialiConfigurationException){
  1839.                         errore = ErroriIntegrazione.ERRORE_431_GESTORE_CREDENZIALI_ERROR.
  1840.                                 getErrore431_ErroreGestoreCredenziali(RicezioneContenutiApplicativi.tipiGestoriCredenziali[i], e);
  1841.                         GestoreCredenzialiConfigurationException ge = (GestoreCredenzialiConfigurationException) e;
  1842.                         integrationFunctionError = ge.getIntegrationFunctionError();
  1843.                         pddContext.addObject(org.openspcoop2.core.constants.Costanti.ERRORE_AUTENTICAZIONE, "true");
  1844.                         wwwAuthenticateErrorHeader = ge.getWwwAuthenticateErrorHeader();
  1845.                     }else{
  1846.                         errore = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1847.                                 get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_548_GESTORE_CREDENZIALI_NON_FUNZIONANTE);
  1848.                         integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  1849.                     }
  1850.                     openspcoopstate.releaseResource();
  1851.                     if (this.msgContext.isGestioneRisposta()) {
  1852.                         OpenSPCoop2Message errorMsg = this.generatoreErrore.build(pddContext,integrationFunctionError, errore,e,null);
  1853.                         if(wwwAuthenticateErrorHeader!=null) {
  1854.                             errorMsg.forceTransportHeader(HttpConstants.AUTHORIZATION_RESPONSE_WWW_AUTHENTICATE, wwwAuthenticateErrorHeader);
  1855.                         }
  1856.                         this.msgContext.setMessageResponse(errorMsg);
  1857.                     }
  1858.                     return;
  1859.                 }
  1860.             }
  1861.         }
  1862.        
  1863.        
  1864.        
  1865.        
  1866.        
  1867.        
  1868.        
  1869.        
  1870.        
  1871.        
  1872.        
  1873.        
  1874.        
  1875.        
  1876.        
  1877.         /* ------------ GestioneToken ------------- */
  1878.    
  1879.         RicezioneContenutiApplicativiGestioneToken gestioneToken = new RicezioneContenutiApplicativiGestioneToken(msgDiag, logCore,
  1880.                 portaDelegata, identificativoPortaDelegata,
  1881.                 requestMessage,
  1882.                 this.msgContext, this.generatoreErrore, inRequestContext,
  1883.                 configurazionePdDReader,
  1884.                 pddContext, idTransazione,
  1885.                 openspcoopstate, transaction, requestInfo,
  1886.                 protocolFactory,
  1887.                 identitaPdD);
  1888.    
  1889.         GestioneTokenAutenticazione gestioneTokenAutenticazione = null;
  1890.         String token = null;
  1891.         if(!gestioneToken.process()) {
  1892.             return;
  1893.         }
  1894.         gestioneTokenAutenticazione = gestioneToken.getGestioneTokenAutenticazione();
  1895.         token = gestioneToken.getToken();
  1896.        
  1897.        
  1898.        
  1899.        
  1900.        
  1901.        
  1902.        
  1903.        
  1904.        
  1905.        
  1906.         /* ------------ Autenticazione ------------- */
  1907.        
  1908.         RicezioneContenutiApplicativiGestioneAutenticazione gestioneAutenticazione = new RicezioneContenutiApplicativiGestioneAutenticazione(msgDiag, logCore,
  1909.                 portaDelegata, identificativoPortaDelegata,
  1910.                 soggettoFruitore, credenziali, gestioneTokenAutenticazione, richiestaDelegata, proprietaErroreAppl,
  1911.                 requestMessage,
  1912.                 this.msgContext, this.generatoreErrore, inRequestContext, headerIntegrazioneRichiesta,
  1913.                 configurazionePdDReader, registroServiziReader,
  1914.                 pddContext, idTransazione, identitaPdD,
  1915.                 openspcoopstate, transaction, requestInfo,
  1916.                 protocolFactory);
  1917.        
  1918.         IDServizioApplicativo idApplicativoToken = null;
  1919.         ServizioApplicativo sa = null;
  1920.         String servizioApplicativo = null;
  1921.         InformazioniToken informazioniTokenNormalizzate = null;
  1922.        
  1923.         if(!gestioneAutenticazione.process()) {
  1924.             return;
  1925.         }
  1926.        
  1927.         idApplicativoToken = gestioneAutenticazione.getIdApplicativoToken();
  1928.         sa = gestioneAutenticazione.getSa();
  1929.         servizioApplicativo = gestioneAutenticazione.getServizioApplicativo();
  1930.         informazioniTokenNormalizzate = gestioneAutenticazione.getInformazioniTokenNormalizzate();
  1931.        
  1932.        
  1933.        
  1934.        

  1935.        
  1936.        
  1937.        
  1938.         /* --------------- Verifica tipo soggetto fruitore e tipo servizio rispetto al canale utilizzato --------------- */
  1939.         msgDiag.mediumDebug("Verifica canale utilizzato...");
  1940.         List<String> tipiSoggettiSupportatiCanale = protocolFactory.createProtocolConfiguration().getTipiSoggetti();
  1941.         List<String> tipiServiziSupportatiCanale = protocolFactory.createProtocolConfiguration().getTipiServizi(requestMessage.getServiceBinding());
  1942.         // Nota: se qualche informazione e' null verranno segnalati altri errori
  1943.         if(soggettoFruitore!=null && soggettoFruitore.getTipo()!=null &&
  1944.                 tipiSoggettiSupportatiCanale.contains(soggettoFruitore.getTipo())==false){
  1945.             msgDiag.logPersonalizzato("protocolli.tipoSoggetto.fruitore.unsupported");
  1946.             openspcoopstate.releaseResource();
  1947.             if (this.msgContext.isGestioneRisposta()) {
  1948.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.NOT_SUPPORTED_BY_PROTOCOL,
  1949.                         ErroriIntegrazione.ERRORE_436_TIPO_SOGGETTO_FRUITORE_NOT_SUPPORTED_BY_PROTOCOL.
  1950.                         getErrore436_TipoSoggettoFruitoreNotSupportedByProtocol(soggettoFruitore,protocolFactory),null,null)));
  1951.             }
  1952.             return;
  1953.         }
  1954.         if(richiestaDelegata!=null && richiestaDelegata.getIdServizio()!=null &&
  1955.                 richiestaDelegata.getIdServizio().getSoggettoErogatore()!=null &&
  1956.                 richiestaDelegata.getIdServizio().getSoggettoErogatore().getTipo()!=null &&
  1957.                 tipiSoggettiSupportatiCanale.contains(richiestaDelegata.getIdServizio().getSoggettoErogatore().getTipo())==false){
  1958.             msgDiag.logPersonalizzato("protocolli.tipoSoggetto.erogatore.unsupported");
  1959.             openspcoopstate.releaseResource();
  1960.             if (this.msgContext.isGestioneRisposta()) {
  1961.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.NOT_SUPPORTED_BY_PROTOCOL,
  1962.                         ErroriIntegrazione.ERRORE_437_TIPO_SOGGETTO_EROGATORE_NOT_SUPPORTED_BY_PROTOCOL.
  1963.                         getErrore437_TipoSoggettoErogatoreNotSupportedByProtocol(richiestaDelegata.getIdServizio().getSoggettoErogatore(),protocolFactory),null,null)));
  1964.             }
  1965.             return;
  1966.         }
  1967.         if(richiestaDelegata!=null && richiestaDelegata.getIdServizio()!=null &&
  1968.                 richiestaDelegata.getIdServizio().getTipo()!=null &&
  1969.                 tipiServiziSupportatiCanale.contains(richiestaDelegata.getIdServizio().getTipo())==false){
  1970.             msgDiag.logPersonalizzato("protocolli.tipoServizio.unsupported");
  1971.             openspcoopstate.releaseResource();
  1972.             if (this.msgContext.isGestioneRisposta()) {
  1973.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.NOT_SUPPORTED_BY_PROTOCOL,
  1974.                         ErroriIntegrazione.ERRORE_438_TIPO_SERVIZIO_NOT_SUPPORTED_BY_PROTOCOL.
  1975.                         getErrore438_TipoServizioNotSupportedByProtocol(requestMessage.getServiceBinding(),
  1976.                                 richiestaDelegata.getIdServizio(),protocolFactory),null,null)));
  1977.             }
  1978.             return;
  1979.         }
  1980.         if(idApplicativoToken!=null && idApplicativoToken.getIdSoggettoProprietario()!=null &&
  1981.                 idApplicativoToken.getIdSoggettoProprietario().getTipo()!=null &&
  1982.                 tipiSoggettiSupportatiCanale.contains(idApplicativoToken.getIdSoggettoProprietario().getTipo())==false){
  1983.             msgDiag.logPersonalizzato("protocolli.tipoSoggetto.applicativoToken.unsupported");
  1984.             openspcoopstate.releaseResource();
  1985.             if (this.msgContext.isGestioneRisposta()) {
  1986.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.NOT_SUPPORTED_BY_PROTOCOL,
  1987.                         ErroriIntegrazione.ERRORE_449_TIPO_SOGGETTO_APPLICATIVO_TOKEN_NOT_SUPPORTED_BY_PROTOCOL.
  1988.                             getErrore449_TipoSoggettoApplicativoTokenNotSupportedByProtocol(idApplicativoToken,protocolFactory),null,null)));
  1989.             }
  1990.             return;
  1991.         }
  1992.        
  1993.        
  1994.        
  1995.        
  1996.        
  1997.        
  1998.        
  1999.         /*
  2000.          * ---------------- Verifico che il servizio di RicezioneContenutiApplicativi sia abilitato ---------------------
  2001.          */
  2002.         boolean serviceIsEnabled = false;
  2003.         boolean portaEnabled = false;
  2004.         Exception serviceIsEnabledExceptionProcessamento = null;
  2005.         try{
  2006.             serviceIsEnabled = StatoServiziPdD.isEnabledPortaDelegata(soggettoFruitore, richiestaDelegata.getIdServizio());
  2007.             if(serviceIsEnabled){
  2008.                 portaEnabled = configurazionePdDReader.isPortaAbilitata(portaDelegata);
  2009.             }
  2010.         }catch(Exception e){
  2011.             serviceIsEnabledExceptionProcessamento = e;
  2012.         }
  2013.         if (!serviceIsEnabled || !portaEnabled  || serviceIsEnabledExceptionProcessamento!=null) {
  2014.             ErroreIntegrazione errore = null;
  2015.             IntegrationFunctionError integrationFunctionError = IntegrationFunctionError.API_SUSPEND;
  2016.             if(serviceIsEnabledExceptionProcessamento!=null){
  2017.                 logError(logCore, "["+ RicezioneContenutiApplicativi.ID_MODULO+ "] Identificazione stato servizio di ricezione contenuti applicativi non riuscita: "+serviceIsEnabledExceptionProcessamento.getMessage(),serviceIsEnabledExceptionProcessamento);
  2018.                 msgDiag.logErroreGenerico("Identificazione stato servizio di ricezione contenuti applicativi non riuscita", "PD");
  2019.                 errore = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreIntegrazione();
  2020.                 integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  2021.             }else{
  2022.                
  2023.                 pddContext.addObject(org.openspcoop2.core.constants.Costanti.ERRORE_SOSPENSIONE, "true");
  2024.                                
  2025.                 String msg = "Servizio di ricezione contenuti applicativi disabilitato";
  2026.                 if(serviceIsEnabled){
  2027.                     msg = "Porta Delegata ["+nomeUtilizzatoPerErrore+"] disabilitata";
  2028.                     errore = ErroriIntegrazione.ERRORE_446_PORTA_SOSPESA.getErroreIntegrazione();
  2029.                 }
  2030.                 else {
  2031.                     errore = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2032.                             get5XX_ErroreProcessamento(msg,CodiceErroreIntegrazione.CODICE_550_PD_SERVICE_NOT_ACTIVE);
  2033.                 }
  2034.                 logError(logCore, "["+ RicezioneContenutiApplicativi.ID_MODULO+ "] "+msg);
  2035.                 msgDiag.logErroreGenerico(msg, "PD");
  2036.             }
  2037.             openspcoopstate.releaseResource();
  2038.             if (this.msgContext.isGestioneRisposta()) {
  2039.                 OpenSPCoop2Message errorOpenSPCoopMsg = this.generatoreErrore.build(pddContext,integrationFunctionError,
  2040.                         errore,serviceIsEnabledExceptionProcessamento,null);
  2041.                 if(IntegrationFunctionError.API_SUSPEND.equals(integrationFunctionError) &&
  2042.                         propertiesReader.isEnabledServiceUnavailableRetryAfterPDSuspend() &&
  2043.                         propertiesReader.getServiceUnavailableRetryAfterSecondsPDSuspend()!=null &&
  2044.                         propertiesReader.getServiceUnavailableRetryAfterSecondsPDSuspend()>0) {
  2045.                     int seconds = propertiesReader.getServiceUnavailableRetryAfterSecondsPDSuspend();
  2046.                     if(propertiesReader.getServiceUnavailableRetryAfterSecondsRandomBackoffPDSuspend()!=null &&
  2047.                             propertiesReader.getServiceUnavailableRetryAfterSecondsRandomBackoffPDSuspend()>0) {
  2048.                         seconds = seconds + ServicesUtils.getRandom().nextInt(propertiesReader.getServiceUnavailableRetryAfterSecondsRandomBackoffPDSuspend());
  2049.                     }
  2050.                     errorOpenSPCoopMsg.forceTransportHeader(HttpConstants.RETRY_AFTER, seconds+"");
  2051.                 }
  2052.                 this.msgContext.setMessageResponse(errorOpenSPCoopMsg);
  2053.             }
  2054.             return;
  2055.         }
  2056.        
  2057.        
  2058.        
  2059.        
  2060.        
  2061.        
  2062.        
  2063.        
  2064.        
  2065.        
  2066.         /* ------------ Gestione Attribute Authority ------------- */
  2067.        
  2068.         msgDiag.mediumDebug("Gestione Attribute Authority...");
  2069.         List<AttributeAuthority> attributeAuthorities = null;
  2070.         if(portaDelegata!=null) {
  2071.             attributeAuthorities = portaDelegata.getAttributeAuthorityList();
  2072.         }
  2073.         this.msgContext.getIntegrazione().setAttributeAuthoritiesFromObjectList(attributeAuthorities);
  2074.        
  2075.         if (attributeAuthorities == null || attributeAuthorities.isEmpty()) {

  2076.             msgDiag.logPersonalizzato("gestioneAADisabilitata");
  2077.            
  2078.         } else {

  2079.             transaction.getTempiElaborazione().startAttributeAuthority();
  2080.            
  2081.             try {
  2082.                 msgDiag.logPersonalizzato("gestioneAAInCorso");
  2083.                
  2084.                 org.openspcoop2.pdd.core.token.attribute_authority.pd.DatiInvocazionePortaDelegata datiInvocazione = new org.openspcoop2.pdd.core.token.attribute_authority.pd.DatiInvocazionePortaDelegata();
  2085.                 datiInvocazione.setInfoConnettoreIngresso(inRequestContext.getConnettore());
  2086.                 datiInvocazione.setState(openspcoopstate.getStatoRichiesta());
  2087.                 datiInvocazione.setIdModulo(inRequestContext.getIdModulo());
  2088.                 datiInvocazione.setMessage(requestMessage);
  2089.                 Busta busta = new Busta(protocolFactory.getProtocol());
  2090.                 if(soggettoFruitore!=null) {
  2091.                     busta.setTipoMittente(soggettoFruitore.getTipo());
  2092.                     busta.setMittente(soggettoFruitore.getNome());
  2093.                 }
  2094.                 if(richiestaDelegata!=null && richiestaDelegata.getIdServizio()!=null) {
  2095.                     if(richiestaDelegata.getIdServizio().getSoggettoErogatore()!=null) {
  2096.                         busta.setTipoDestinatario(richiestaDelegata.getIdServizio().getSoggettoErogatore().getTipo());
  2097.                         busta.setDestinatario(richiestaDelegata.getIdServizio().getSoggettoErogatore().getNome());
  2098.                     }
  2099.                     busta.setTipoServizio(richiestaDelegata.getIdServizio().getTipo());
  2100.                     busta.setServizio(richiestaDelegata.getIdServizio().getNome());
  2101.                     busta.setVersioneServizio(richiestaDelegata.getIdServizio().getVersione());
  2102.                     busta.setAzione(richiestaDelegata.getIdServizio().getAzione());
  2103.                     if(sa!=null) {
  2104.                         busta.setServizioApplicativoFruitore(sa.getNome());
  2105.                     }
  2106.                 }
  2107.                 datiInvocazione.setBusta(busta);
  2108.                 datiInvocazione.setRequestInfo(requestInfo);
  2109.                 datiInvocazione.setIdPD(identificativoPortaDelegata);
  2110.                 datiInvocazione.setPd(portaDelegata);      
  2111.                
  2112.                 GestioneAttributeAuthority gestioneAAEngine = new GestioneAttributeAuthority(logCore, idTransazione, pddContext, protocolFactory);
  2113.                 List<InformazioniAttributi> esitiValidiRecuperoAttributi = new ArrayList<InformazioniAttributi>();
  2114.                
  2115.                 for (AttributeAuthority aa : attributeAuthorities) {
  2116.                    
  2117.                     try {
  2118.                         msgDiag.addKeyword(CostantiPdD.KEY_ATTRIBUTE_AUTHORITY_NAME, aa.getNome());
  2119.                         msgDiag.addKeyword(CostantiPdD.KEY_ATTRIBUTE_AUTHORITY_ENDPOINT, "-");
  2120.                        
  2121.                         PolicyAttributeAuthority policyAttributeAuthority = configurazionePdDReader.getPolicyAttributeAuthority(false, aa.getNome(), requestInfo);
  2122.                         datiInvocazione.setPolicyAttributeAuthority(policyAttributeAuthority);
  2123.                
  2124.                         GestoreToken.validazioneConfigurazione(policyAttributeAuthority); // assicura che la configurazione sia corretta
  2125.                        
  2126.                         msgDiag.addKeyword(CostantiPdD.KEY_ATTRIBUTE_AUTHORITY_ENDPOINT, policyAttributeAuthority.getEndpoint());
  2127.                        
  2128.                         msgDiag.logPersonalizzato("gestioneAAInCorso.retrieve");
  2129.                        
  2130.                         EsitoRecuperoAttributi esitoRecuperoAttributi = gestioneAAEngine.readAttributes(datiInvocazione);
  2131.                         if(esitoRecuperoAttributi.isValido()) {
  2132.                            
  2133.                             StringBuilder attributiRecuperati = new StringBuilder();
  2134.                             if(esitoRecuperoAttributi.getInformazioniAttributi()!=null &&
  2135.                                     esitoRecuperoAttributi.getInformazioniAttributi().getAttributes()!=null &&
  2136.                                     !esitoRecuperoAttributi.getInformazioniAttributi().getAttributes().isEmpty()) {
  2137.                                 for (String attrName : esitoRecuperoAttributi.getInformazioniAttributi().getAttributesNames()) {
  2138.                                     if(attributiRecuperati.length()>0) {
  2139.                                         attributiRecuperati.append(",");
  2140.                                     }
  2141.                                     attributiRecuperati.append(attrName);
  2142.                                 }
  2143.                             }
  2144.                             msgDiag.addKeyword(CostantiPdD.KEY_ATTRIBUTES, attributiRecuperati.toString());
  2145.                            
  2146.                             if(esitoRecuperoAttributi.isInCache()) {
  2147.                                 msgDiag.logPersonalizzato("gestioneAAInCorso.retrieve.completataSuccesso.inCache");
  2148.                             }
  2149.                             else {
  2150.                                 msgDiag.logPersonalizzato("gestioneAAInCorso.retrieve.completataSuccesso");
  2151.                             }
  2152.                            
  2153.                             esitiValidiRecuperoAttributi.add(esitoRecuperoAttributi.getInformazioniAttributi());
  2154.                         }
  2155.                         else {
  2156.                            
  2157.                             msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, esitoRecuperoAttributi.getDetails());
  2158.                             msgDiag.logPersonalizzato("gestioneAAInCorso.retrieve.fallita");
  2159.        
  2160.                             String msgErrore = "processo di gestione dell'attribute authority ["+ aa.getNome() + "] fallito: " + esitoRecuperoAttributi.getDetails();
  2161.                             if(esitoRecuperoAttributi.getEccezioneProcessamento()!=null) {
  2162.                                 logError(logCore, msgErrore,esitoRecuperoAttributi.getEccezioneProcessamento());
  2163.                             }
  2164.                             else {
  2165.                                 logError(logCore, msgErrore);
  2166.                             }                          
  2167.                         }
  2168.                        
  2169.                     } catch (Throwable e) {
  2170.                        
  2171.                         msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, e.getMessage());
  2172.                         msgDiag.logPersonalizzato("gestioneAAInCorso.retrieve.fallita");
  2173.                         String msgErrore = "processo di gestione dell'attribute authority ["+ aa.getNome() + "] fallito: " + e.getMessage();
  2174.                         logError(logCore, msgErrore,e);
  2175.                        
  2176.                     }
  2177.                 }
  2178.                
  2179.                 InformazioniAttributi informazioniAttributiNormalizzati = null;
  2180.                 if(esitiValidiRecuperoAttributi!=null && esitiValidiRecuperoAttributi.size()>0) {
  2181.                     informazioniAttributiNormalizzati = GestoreToken.normalizeInformazioniAttributi(esitiValidiRecuperoAttributi, attributeAuthorities);
  2182.                     informazioniAttributiNormalizzati.setValid(true);
  2183.                 }
  2184.                 if(informazioniAttributiNormalizzati!=null) {
  2185.                     pddContext.addObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_ATTRIBUTI_INFORMAZIONI_NORMALIZZATE, informazioniAttributiNormalizzati);
  2186.                    
  2187.                     if(informazioniTokenNormalizzate!=null) {
  2188.                         informazioniTokenNormalizzate.setAa(informazioniAttributiNormalizzati);
  2189.                     }
  2190.                     else {
  2191.                         transaction.setInformazioniAttributi(informazioniAttributiNormalizzati);
  2192.                     }
  2193.                 }
  2194.                
  2195.                 msgDiag.logPersonalizzato("gestioneAACompletata");
  2196.                
  2197.             } catch (Throwable e) {
  2198.                
  2199.                 msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, e.getMessage());
  2200.                 msgDiag.logPersonalizzato("gestioneAAFallita");
  2201.                 logError(logCore, "processo di gestione delle attribute authorities fallito: " + e.getMessage(),e);
  2202.                
  2203.             }
  2204.             finally {
  2205.                 transaction.getTempiElaborazione().endAttributeAuthority();
  2206.             }
  2207.            
  2208.         }
  2209.        
  2210.        
  2211.        
  2212.        
  2213.        
  2214.        
  2215.        
  2216.        
  2217.        
  2218.        
  2219.        
  2220.        
  2221.        
  2222.        
  2223.        
  2224.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Inizializzazione connessione al database...");
  2225.        
  2226.        
  2227.        
  2228.         /*
  2229.          * ---------------- Inizializzazione Contesto di gestione della Richiesta ---------------------
  2230.          */
  2231.         String idMessageRequest = null;
  2232.        
  2233.         // Correlazione Applicativa
  2234.         msgDiag.mediumDebug("Gestione correlazione applicativa...");
  2235.         CorrelazioneApplicativa correlazionePD = null;
  2236.         try {
  2237.             correlazionePD = configurazionePdDReader.getCorrelazioneApplicativa(portaDelegata);
  2238.         } catch (Exception e) {
  2239.             msgDiag.logErroreGenerico(e,"getCorrelazioneApplicativa(pd)");
  2240.             openspcoopstate.releaseResource();
  2241.             if (this.msgContext.isGestioneRisposta()) {
  2242.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  2243.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2244.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),e,null)));
  2245.             }
  2246.             return;
  2247.         }
  2248.        
  2249.         Busta busta = null;
  2250.         try {
  2251.             busta = new Busta(protocolFactory.getProtocol());
  2252.             if(soggettoFruitore!=null) {
  2253.                 busta.setTipoMittente(soggettoFruitore.getTipo());
  2254.                 busta.setMittente(soggettoFruitore.getNome());
  2255.             }
  2256.             if(richiestaDelegata!=null && richiestaDelegata.getIdServizio()!=null) {
  2257.                 if(richiestaDelegata.getIdServizio().getSoggettoErogatore()!=null) {
  2258.                     busta.setTipoDestinatario(richiestaDelegata.getIdServizio().getSoggettoErogatore().getTipo());
  2259.                     busta.setDestinatario(richiestaDelegata.getIdServizio().getSoggettoErogatore().getNome());
  2260.                 }
  2261.                 busta.setTipoServizio(richiestaDelegata.getIdServizio().getTipo());
  2262.                 busta.setServizio(richiestaDelegata.getIdServizio().getNome());
  2263.                 busta.setVersioneServizio(richiestaDelegata.getIdServizio().getVersione());
  2264.                 busta.setAzione(richiestaDelegata.getIdServizio().getAzione());
  2265.                 if(sa!=null) {
  2266.                     busta.setServizioApplicativoFruitore(sa.getNome());
  2267.                 }
  2268.             }
  2269.         }catch(Throwable t) {
  2270.             // ignore
  2271.         }
  2272.        
  2273.         GestoreCorrelazioneApplicativaConfig caConfig = new GestoreCorrelazioneApplicativaConfig();
  2274.         caConfig.setState(openspcoopstate.getStatoRichiesta());
  2275.         caConfig.setAlog(logCore);
  2276.         caConfig.setSoggettoFruitore(richiestaDelegata.getIdSoggettoFruitore());
  2277.         caConfig.setIdServizio(richiestaDelegata.getIdServizio());
  2278.         caConfig.setBusta(busta);
  2279.         caConfig.setServizioApplicativo(servizioApplicativo);
  2280.         caConfig.setProtocolFactory(protocolFactory);
  2281.         caConfig.setTransaction(transaction);
  2282.         caConfig.setPddContext(pddContext);
  2283.         caConfig.setPd(portaDelegata);
  2284.         GestoreCorrelazioneApplicativa correlazioneApplicativa = new GestoreCorrelazioneApplicativa(caConfig);
  2285.        
  2286.         boolean correlazioneEsistente = false;
  2287.         String idCorrelazioneApplicativa = null;
  2288.         if (correlazionePD != null) {
  2289.             try {
  2290.                 correlazioneApplicativa
  2291.                         .verificaCorrelazione(correlazionePD, urlProtocolContext,requestMessage,headerIntegrazioneRichiesta,
  2292.                                 this.msgContext.getIdModulo().endsWith(IntegrationManager.ID_MODULO));
  2293.                 idCorrelazioneApplicativa = correlazioneApplicativa.getIdCorrelazione();
  2294.                
  2295.                 if(correlazioneApplicativa.isRiusoIdentificativo()) {
  2296.                    
  2297.                     if(openspcoopstate.resourceReleased()) {
  2298.                         // inizializzo
  2299.                         openspcoopstate.setUseConnection(true);
  2300.                         openspcoopstate.initResource(identitaPdD, this.msgContext.getIdModulo(), idTransazione);
  2301.                         correlazioneApplicativa.updateState(openspcoopstate.getStatoRichiesta());
  2302.                     }
  2303.                    
  2304.                     correlazioneEsistente = correlazioneApplicativa.verificaCorrelazioneIdentificativoRichiesta();
  2305.                 }
  2306.                
  2307.                 if (correlazioneEsistente) {
  2308.                     // Aggiornamento id richiesta
  2309.                     idMessageRequest = correlazioneApplicativa.getIdBustaCorrelato();

  2310.                     // Aggiornamento Informazioni Protocollo
  2311.                     msgDiag.setIdMessaggioRichiesta(idMessageRequest);
  2312.                    
  2313.                     // MsgDiagnostico
  2314.                     msgDiag.addKeyword(CostantiPdD.KEY_ID_CORRELAZIONE_APPLICATIVA, idCorrelazioneApplicativa);
  2315.                     msgDiag.addKeyword(CostantiPdD.KEY_ID_MESSAGGIO_RICHIESTA, idMessageRequest);
  2316.                     msgDiag.logPersonalizzato("correlazioneApplicativaEsistente");
  2317.                 }
  2318.             } catch (Exception e) {
  2319.                
  2320.                 pddContext.addObject(org.openspcoop2.core.constants.Costanti.ERRORE_CORRELAZIONE_APPLICATIVA_RICHIESTA, "true");
  2321.                
  2322.                 msgDiag.logErroreGenerico(e,"CorrelazioneApplicativa");
  2323.                 logError(logCore, "Riscontrato errore durante il controllo di correlazione applicativa: "+ e.getMessage(),e);
  2324.                
  2325.                 ErroreIntegrazione errore = null;
  2326.                 if(correlazioneApplicativa!=null){
  2327.                     errore = correlazioneApplicativa.getErrore();
  2328.                 }
  2329.                 if(errore==null){
  2330.                     errore = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2331.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_529_CORRELAZIONE_APPLICATIVA_RICHIESTA_NON_RIUSCITA);
  2332.                 }

  2333.                 openspcoopstate.releaseResource();
  2334.                 if (this.msgContext.isGestioneRisposta()) {
  2335.                     IntegrationFunctionError integrationFunctionError = null;
  2336.                     if(CodiceErroreIntegrazione.CODICE_416_CORRELAZIONE_APPLICATIVA_RICHIESTA_ERRORE.equals(errore.getCodiceErrore())){
  2337.                         integrationFunctionError = IntegrationFunctionError.APPLICATION_CORRELATION_IDENTIFICATION_REQUEST_FAILED;
  2338.                     }
  2339.                     else{
  2340.                         integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  2341.                     }
  2342.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,integrationFunctionError,errore,e,null)));
  2343.                 }
  2344.                 return;
  2345.             }
  2346.         }

  2347.         if (correlazioneEsistente == false) {

  2348.             // Costruzione ID.
  2349.             msgDiag.mediumDebug("Costruzione identificativo...");
  2350.             try {
  2351.                
  2352.                 Imbustamento imbustatore = new Imbustamento(logCore, protocolFactory,openspcoopstate.getStatoRichiesta());
  2353.                 idMessageRequest =
  2354.                     imbustatore.buildID(identitaPdD,
  2355.                             (String) this.msgContext.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE),
  2356.                             propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  2357.                             propertiesReader.getGestioneSerializableDBCheckInterval(),
  2358.                             RuoloMessaggio.RICHIESTA);
  2359.                 if (idMessageRequest == null) {
  2360.                     throw new Exception("Identificativo non costruito.");
  2361.                 }
  2362.                 // Aggiornamento Informazioni Protocollo
  2363.                 msgDiag.setIdMessaggioRichiesta(idMessageRequest);
  2364.                
  2365.             } catch (Exception e) {
  2366.                 msgDiag.logErroreGenerico(e,"imbustatore.buildID(idMessageRequest)");
  2367.                 openspcoopstate.releaseResource();
  2368.                 if (this.msgContext.isGestioneRisposta()) {
  2369.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  2370.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2371.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_507_COSTRUZIONE_IDENTIFICATIVO), e,null)));
  2372.                 }
  2373.                 return;
  2374.             }
  2375.             msgDiag.addKeyword(CostantiPdD.KEY_ID_MESSAGGIO_RICHIESTA, idMessageRequest);
  2376.            
  2377.             // Creazione Correlazione Applicativa
  2378.             if (correlazionePD!=null && idCorrelazioneApplicativa!=null && correlazioneApplicativa.isRiusoIdentificativo()) {
  2379.                 msgDiag.mediumDebug("Applicazione correlazione applicativa...");
  2380.                 try {
  2381.                     // Applica correlazione
  2382.                     correlazioneApplicativa.applicaCorrelazione(correlazionePD,idCorrelazioneApplicativa, idMessageRequest);
  2383.                                                
  2384.                     // MsgDiagnostico
  2385.                     msgDiag.addKeyword(CostantiPdD.KEY_ID_CORRELAZIONE_APPLICATIVA, idCorrelazioneApplicativa);
  2386.                     msgDiag.logPersonalizzato("correlazioneApplicativaInstaurata");
  2387.                 } catch (Exception e) {
  2388.                     msgDiag.logErroreGenerico(e,"CreazioneCorrelazioneApplicativa");
  2389.                    
  2390.                     ErroreIntegrazione errore = null;
  2391.                     if(correlazioneApplicativa!=null){
  2392.                         errore = correlazioneApplicativa.getErrore();
  2393.                     }
  2394.                     if(errore==null){
  2395.                         errore = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2396.                                 get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_529_CORRELAZIONE_APPLICATIVA_RICHIESTA_NON_RIUSCITA);
  2397.                     }
  2398.                    
  2399.                     openspcoopstate.releaseResource();
  2400.                     if (this.msgContext.isGestioneRisposta()) {
  2401.                         IntegrationFunctionError integrationFunctionError = null;
  2402.                         if(CodiceErroreIntegrazione.CODICE_416_CORRELAZIONE_APPLICATIVA_RICHIESTA_ERRORE.equals(errore.getCodiceErrore())){
  2403.                             integrationFunctionError = IntegrationFunctionError.APPLICATION_CORRELATION_IDENTIFICATION_REQUEST_FAILED;
  2404.                         }
  2405.                         else{
  2406.                             integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  2407.                         }
  2408.                         this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,integrationFunctionError,errore,null,null)));
  2409.                     }
  2410.                     return;
  2411.                 }
  2412.             }
  2413.         }
  2414.         richiestaDelegata.setIdCorrelazioneApplicativa(idCorrelazioneApplicativa);
  2415.         msgDiag.setIdCorrelazioneApplicativa(idCorrelazioneApplicativa);
  2416.         this.msgContext.getIntegrazione().setIdCorrelazioneApplicativa(idCorrelazioneApplicativa);
  2417.         this.msgContext.setIdMessage(idMessageRequest);
  2418.         this.msgContext.getProtocol().setIdRichiesta(idMessageRequest);
  2419.        
  2420.        
  2421.        
  2422.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Gestione header integrazione della risposta...");
  2423.        
  2424.        
  2425.         /*
  2426.          * ------- Imposta Risposta dell'Header Trasporto o se l'invocazione e' stata attiva dall'IntegrationManager -------
  2427.          */
  2428.         msgDiag.mediumDebug("Gestione header integrazione della risposta...");
  2429.         headerIntegrazioneRisposta.getBusta().setID(idMessageRequest);
  2430.         boolean containsHeaderIntegrazioneTrasporto = false;
  2431.         for (String gestore : defaultGestoriIntegrazionePD) {
  2432.             if(CostantiConfigurazione.HEADER_INTEGRAZIONE_TRASPORTO.equals(gestore)){
  2433.                 containsHeaderIntegrazioneTrasporto = true;
  2434.             }
  2435.         }
  2436.         if (containsHeaderIntegrazioneTrasporto
  2437.                 || this.msgContext.getIdModulo().startsWith(RicezioneContenutiApplicativi.ID_MODULO+ IntegrationManager.ID_MODULO)) {
  2438.             try {
  2439.                 Map<String, List<String>> propertiesIntegrazioneRisposta = new HashMap<>();

  2440.                 IGestoreIntegrazionePD gestore = null;
  2441.                 try {
  2442.                     gestore = (IGestoreIntegrazionePD) pluginLoader.newIntegrazionePortaDelegata(CostantiConfigurazione.HEADER_INTEGRAZIONE_TRASPORTO);
  2443.                 }catch(Exception e){
  2444.                     throw e;
  2445.                 }
  2446.                 if(gestore!=null){
  2447.                     String classType = null;
  2448.                     try {
  2449.                         classType = gestore.getClass().getName();
  2450.                         AbstractCore.init(gestore, pddContext, protocolFactory);
  2451.                     } catch (Exception e) {
  2452.                         throw new Exception(
  2453.                                 "Riscontrato errore durante l'inizializzazione della classe ["+ classType
  2454.                                         + "] da utilizzare per la gestione dell'integrazione delle fruizioni di tipo ["+ CostantiConfigurazione.HEADER_INTEGRAZIONE_TRASPORTO + "]: " + e.getMessage());
  2455.                     }

  2456.                     OutResponsePDMessage outResponsePDMessage = new OutResponsePDMessage();
  2457.                     outResponsePDMessage.setPortaDelegata(portaDelegata);
  2458.                     outResponsePDMessage.setHeaders(propertiesIntegrazioneRisposta);
  2459.                     outResponsePDMessage.setServizio(richiestaDelegata.getIdServizio());
  2460.                     outResponsePDMessage.setSoggettoMittente(soggettoFruitore);
  2461.                     gestore.setOutResponseHeader(headerIntegrazioneRisposta, outResponsePDMessage);
  2462.                     this.msgContext.setResponseHeaders(propertiesIntegrazioneRisposta);
  2463.                 }
  2464.             } catch (Exception e) {
  2465.                 msgDiag.logErroreGenerico(e,"setHeaderIntegrazioneRisposta");
  2466.             }
  2467.         }

  2468.        
  2469.        
  2470.        
  2471.        
  2472.        

  2473.         /*
  2474.           * --------- Informazioni protocollo ----------
  2475.          */
  2476.         IBustaBuilder<?> bustaBuilder = protocolFactory.createBustaBuilder(openspcoopstate.getStatoRichiesta());
  2477.         idServizio = richiestaDelegata.getIdServizio();
  2478.         this.msgContext.getProtocol().setFruitore(soggettoFruitore);    
  2479.         this.msgContext.getProtocol().setErogatore(idServizio.getSoggettoErogatore());      
  2480.         this.msgContext.getProtocol().setTipoServizio(idServizio.getTipo());
  2481.         this.msgContext.getProtocol().setServizio(idServizio.getNome());
  2482.         this.msgContext.getProtocol().setVersioneServizio(idServizio.getVersione());
  2483.         this.msgContext.getProtocol().setAzione(idServizio.getAzione());
  2484.         this.msgContext.getProtocol().setIdRichiesta(idMessageRequest);
  2485.        
  2486.        
  2487.        
  2488.        
  2489.         /*
  2490.           * --------- Dati di identificazione ----------
  2491.          */
  2492.        
  2493.         IDServizioApplicativo idServizioApplicativo = new IDServizioApplicativo();
  2494.         idServizioApplicativo.setNome(servizioApplicativo);
  2495.         idServizioApplicativo.setIdSoggettoProprietario(soggettoFruitore);
  2496.        
  2497.        
  2498.        
  2499.        

  2500.        
  2501.    
  2502.        
  2503.        
  2504.        
  2505.         /* -------------- Identificazione servizio ------------------ */
  2506.         String infoSearch = null;
  2507.         try{
  2508.             infoSearch = IDServizioFactory.getInstance().getUriFromIDServizio(idServizio);
  2509.         }catch(Exception e){
  2510.             infoSearch = idServizio.toString(false);
  2511.         }
  2512.         if (idServizio.getAzione() != null)
  2513.             infoSearch = infoSearch + " azione " + idServizio.getAzione();
  2514.        
  2515.         // Cerco nome del registro su cui cercare
  2516.         msgDiag.addKeyword(CostantiPdD.KEY_INFO_SERVIZIO_BUSTA,infoSearch );
  2517.         msgDiag.mediumDebug("Ricerca nome registro ["+infoSearch+"]...");
  2518.         String nomeRegistroForSearch = null;
  2519.         try {
  2520.             nomeRegistroForSearch = configurazionePdDReader.getRegistroForImbustamento(soggettoFruitore, idServizio, false, requestInfo);
  2521.         } catch (Exception e) {
  2522.             logError(logCore, "Connettore associato al servizio non trovato: "+e.getMessage(),e);
  2523.             msgDiag.addKeywordErroreProcessamento(e,"connettore associato al servizio non trovato");
  2524.             msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_IMBUSTAMENTO,"registroServizi.ricercaServizioFallita");
  2525.             openspcoopstate.releaseResource();
  2526.             if (this.msgContext.isGestioneRisposta()) {
  2527.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  2528.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2529.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_514_ROUTING_CONFIGURATION_ERROR), e,null)));
  2530.             }
  2531.             return;
  2532.         }

  2533.        
  2534.         // Gestisco riferimento asincrono
  2535.         String riferimentoServizioCorrelato_ricercaSolamenteServizioCorrelato = null;
  2536.         boolean supportoProfiliAsincroni = protocolConfig.isSupportato(requestInfo.getProtocolServiceBinding(),ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO)
  2537.                 || protocolConfig.isSupportato(requestInfo.getProtocolServiceBinding(),ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO);
  2538.         if(supportoProfiliAsincroni) {
  2539.             if (headerIntegrazioneRichiesta.getBusta() != null && headerIntegrazioneRichiesta.getBusta().getRiferimentoMessaggio() != null)
  2540.                 riferimentoServizioCorrelato_ricercaSolamenteServizioCorrelato = headerIntegrazioneRichiesta.getBusta().getRiferimentoMessaggio();      
  2541.             if(riferimentoServizioCorrelato_ricercaSolamenteServizioCorrelato==null){
  2542.                 // FIX compatibilita integrazione asincroni con versioni precedente a 1.4
  2543.                 // L'integrazione era possibile anche tramite info integrazione 'Collaborazione'
  2544.                 if(propertiesReader.isIntegrazioneAsincroniConIdCollaborazioneEnabled()){
  2545.                     if (headerIntegrazioneRichiesta.getBusta() != null && headerIntegrazioneRichiesta.getBusta().getIdCollaborazione() != null){
  2546.                         // utilizzo l'informazione come integrazione asincrona SOLO se il servizio e' correlato.
  2547.                         Servizio infoServizioTmpVerificaCorrelato = null;
  2548.                         try{
  2549.                             infoServizioTmpVerificaCorrelato = registroServiziReader.getInfoServizioCorrelato(soggettoFruitore,idServizio, nomeRegistroForSearch, true, requestInfo);
  2550.                         }catch(Exception e){
  2551.                             logDebug(logCore, "Verifica servizio ["+infoSearch+"] se e' correlato, fallita: "+e.getMessage());
  2552.                             try{
  2553.                                 infoServizioTmpVerificaCorrelato = registroServiziReader.getInfoServizioAzioneCorrelata(soggettoFruitore, idServizio,nomeRegistroForSearch, true, requestInfo);
  2554.                             }catch(Exception eCorrelato){
  2555.                                 logDebug(logCore, "Verifica servizio ["+infoSearch+"] se e' correlato rispetto all'azione, fallita: "+e.getMessage());
  2556.                             }
  2557.                         }
  2558.                         if(infoServizioTmpVerificaCorrelato!=null){
  2559.                             // Il servizio e' correlato!
  2560.                             riferimentoServizioCorrelato_ricercaSolamenteServizioCorrelato = headerIntegrazioneRichiesta.getBusta().getIdCollaborazione();
  2561.                         }
  2562.                     }  
  2563.                 }
  2564.             }
  2565.         }
  2566.         if (riferimentoServizioCorrelato_ricercaSolamenteServizioCorrelato != null) {
  2567.             infoSearch = "Servizio correlato " + infoSearch;
  2568.         } else {
  2569.             infoSearch = "Servizio " + infoSearch;
  2570.         }
  2571.         infoSearch = "Ricerca nel registro dei servizi di: " + infoSearch;
  2572.         if (riferimentoServizioCorrelato_ricercaSolamenteServizioCorrelato != null)
  2573.             infoSearch = infoSearch + " (idServizioCorrelato: "+ riferimentoServizioCorrelato_ricercaSolamenteServizioCorrelato + ")";
  2574.         msgDiag.addKeyword(CostantiPdD.KEY_INFO_SERVIZIO_BUSTA,infoSearch );
  2575.         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_IMBUSTAMENTO,"registroServizi.ricercaServizioInCorso");
  2576.        
  2577.         // Effettuo ricerca
  2578.         boolean isServizioCorrelato = false;
  2579.         String invocazioneAzioneErrata = null;
  2580.         String portTypeErrato = null;
  2581.         boolean ricercaConErrore = false;
  2582.         boolean servizioCorrelatoNonTrovato = false;
  2583.         boolean servizioNonTrovato = false;
  2584.         Servizio infoServizio = null;
  2585.         Exception eServiceNotFound = null;
  2586.         try {
  2587.             // RiferimentoServizioCorrelato presente: cerco solo come servizio
  2588.             // correlato.
  2589.             if (riferimentoServizioCorrelato_ricercaSolamenteServizioCorrelato != null) {

  2590.                 String erroreRicerca = null;

  2591.                 // Ricerca come servizio correlato
  2592.                 msgDiag.mediumDebug("Ricerca servizio correlato ...");
  2593.                 try {
  2594.                     infoServizio = registroServiziReader.getInfoServizioCorrelato(soggettoFruitore,idServizio, nomeRegistroForSearch, true, requestInfo);
  2595.                     isServizioCorrelato = true;
  2596.                 } catch (DriverRegistroServiziAzioneNotFound e) {
  2597.                     boolean throwFault = true;
  2598.                     if(corsTrasparente) {
  2599.                         try {
  2600.                             infoServizio = registroServiziReader.getInfoServizioCorrelato(soggettoFruitore,idServizio, nomeRegistroForSearch, false, requestInfo);
  2601.                             isServizioCorrelato = true;
  2602.                             throwFault = false;
  2603.                         }catch(Throwable ignore) {
  2604.                             // ignore
  2605.                         }
  2606.                     }
  2607.                     if(throwFault) {
  2608.                         invocazioneAzioneErrata = e.getMessage();
  2609.                         throw e;
  2610.                     }
  2611.                 } catch (DriverRegistroServiziNotFound e) {
  2612.                     erroreRicerca = "\nRicerca come servizio correlato-> "+ e.getMessage();
  2613.                 }

  2614.                 // Ricerca come servizio e azione correlata se ho un profilo
  2615.                 // asincrono asimmetrico (check del profilo interno al metodo)
  2616.                 if (infoServizio == null && (idServizio.getAzione() != null)) {
  2617.                     msgDiag.mediumDebug("Ricerca servizio con azione correlata...");
  2618.                     try {
  2619.                         infoServizio = registroServiziReader.getInfoServizioAzioneCorrelata(soggettoFruitore, idServizio,nomeRegistroForSearch, true, requestInfo);
  2620.                         isServizioCorrelato = true;
  2621.                     } catch (DriverRegistroServiziAzioneNotFound e) {
  2622.                         boolean throwFault = true;
  2623.                         if(corsTrasparente) {
  2624.                             try {
  2625.                                 infoServizio = registroServiziReader.getInfoServizioAzioneCorrelata(soggettoFruitore, idServizio,nomeRegistroForSearch, false, requestInfo);
  2626.                                 isServizioCorrelato = true;
  2627.                                 throwFault = false;
  2628.                             }catch(Throwable ignore) {
  2629.                                 // ignore
  2630.                             }
  2631.                         }
  2632.                         if(throwFault) {
  2633.                             invocazioneAzioneErrata = e.getMessage();
  2634.                             throw e;
  2635.                         }
  2636.                     } catch (DriverRegistroServiziNotFound e) {
  2637.                         erroreRicerca = erroreRicerca+ "\nRicerca come servizio correlato -> "+ e.getMessage();
  2638.                     }
  2639.                 }

  2640.                 // Se non trovato genero errore
  2641.                 msgDiag.highDebug("Controllo dati individuati ...");
  2642.                 if (infoServizio == null && erroreRicerca == null)
  2643.                     throw new DriverRegistroServiziNotFound(
  2644.                             "Servizio Correlato non trovato ne tramite la normale ricerca, ne tramite la ricerca per azione correlata (solo se profilo e' asincrono asimmetrico)");
  2645.                 else if (infoServizio == null)
  2646.                     throw new DriverRegistroServiziNotFound(erroreRicerca);

  2647.             }

  2648.             // RiferimentoServizioCorrelato non presente: cerco sia come
  2649.             // servizio, che casomai come servizio correlato.
  2650.             else {
  2651.                 String erroreRicerca = null;

  2652.                 // Ricerca come servizio
  2653.                 msgDiag.mediumDebug("Ricerca servizio ...");
  2654.                 try {
  2655.                     infoServizio = registroServiziReader.getInfoServizio(soggettoFruitore, idServizio,nomeRegistroForSearch,true, true, requestInfo);
  2656.                 } catch (DriverRegistroServiziAzioneNotFound e) {
  2657.                     boolean throwFault = true;
  2658.                     if(corsTrasparente) {
  2659.                         try {
  2660.                             infoServizio = registroServiziReader.getInfoServizio(soggettoFruitore, idServizio,nomeRegistroForSearch,true, false, requestInfo);
  2661.                             throwFault = false;
  2662.                         }catch(Throwable ignore) {
  2663.                             // ignore
  2664.                         }
  2665.                     }
  2666.                     if(throwFault) {
  2667.                         invocazioneAzioneErrata = e.getMessage();
  2668.                         throw e;
  2669.                     }
  2670.                 } catch (DriverRegistroServiziNotFound e) {
  2671.                     erroreRicerca = "\nRicerca come servizio -> "+ e.getMessage();
  2672.                 }

  2673.                 // Ricerca come servizio correlato
  2674.                 if (infoServizio == null) {
  2675.                     msgDiag.mediumDebug("Ricerca servizio correlato...");
  2676.                     try {
  2677.                         infoServizio = registroServiziReader.getInfoServizioCorrelato(soggettoFruitore,idServizio, nomeRegistroForSearch, true, requestInfo);
  2678.                         isServizioCorrelato = true;
  2679.                     } catch (DriverRegistroServiziAzioneNotFound e) {
  2680.                         boolean throwFault = true;
  2681.                         if(corsTrasparente) {
  2682.                             try {
  2683.                                 infoServizio = registroServiziReader.getInfoServizioCorrelato(soggettoFruitore,idServizio, nomeRegistroForSearch, false, requestInfo);
  2684.                                 isServizioCorrelato = true;
  2685.                                 throwFault = false;
  2686.                             }catch(Throwable ignore) {
  2687.                                 // ignore
  2688.                             }
  2689.                         }
  2690.                         if(throwFault) {
  2691.                             invocazioneAzioneErrata = e.getMessage();
  2692.                             throw e;
  2693.                         }
  2694.                     } catch (DriverRegistroServiziNotFound e) {
  2695.                         erroreRicerca = erroreRicerca+ "\nRicerca come servizio correlato -> "+ e.getMessage();
  2696.                     }
  2697.                 }

  2698.                 // Se non trovato genero errore
  2699.                 if (infoServizio == null && erroreRicerca == null)
  2700.                     throw new DriverRegistroServiziNotFound(
  2701.                             "Servizio non trovato ne tramite la normale ricerca, ne tramite la ricerca per servizio correlato");
  2702.                 else if (infoServizio == null)
  2703.                     throw new DriverRegistroServiziNotFound(erroreRicerca);

  2704.             }
  2705.         } catch (DriverRegistroServiziNotFound e) {
  2706.             eServiceNotFound = e;
  2707.             msgDiag.addKeywordErroreProcessamento(e);
  2708.             msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_IMBUSTAMENTO,"registroServizi.ricercaServizioFallita");
  2709.             servizioNonTrovato = true;
  2710.         } catch (DriverRegistroServiziAzioneNotFound e) {
  2711.             eServiceNotFound = e;
  2712.             msgDiag.addKeywordErroreProcessamento(e);
  2713.             msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_IMBUSTAMENTO,"registroServizi.ricercaServizioFallita");
  2714.             // viene impostata la variabile invocazioneAzioneErrata
  2715.         } catch (DriverRegistroServiziPortTypeNotFound e) {
  2716.             eServiceNotFound = e;
  2717.             msgDiag.addKeywordErroreProcessamento(e,"configurazione registro dei servizi errata");
  2718.             msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_IMBUSTAMENTO,"registroServizi.ricercaServizioFallita");
  2719.             portTypeErrato = "Configurazione del registro dei Servizi errata: "+ e.getMessage();
  2720.         } catch(DriverRegistroServiziCorrelatoNotFound e){
  2721.             eServiceNotFound = e;
  2722.             msgDiag.addKeywordErroreProcessamento(e,"correlazione asincrona non rilevata");
  2723.             msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_IMBUSTAMENTO,"registroServizi.ricercaServizioFallita");
  2724.             servizioCorrelatoNonTrovato = true;
  2725.         }
  2726.         catch (Exception e) {
  2727.             eServiceNotFound = e;
  2728.             msgDiag.addKeywordErroreProcessamento(e,"errore generale");
  2729.             msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_IMBUSTAMENTO,"registroServizi.ricercaServizioFallita");
  2730.             logError(logCore, "Ricerca servizio fallita",e);
  2731.             ricercaConErrore = true;
  2732.         }

  2733.         // Segnalo eventuali errori di servizio non trovato / errato
  2734.         if (infoServizio == null) {
  2735.             if (servizioNonTrovato == false && ricercaConErrore == false && servizioCorrelatoNonTrovato==false && invocazioneAzioneErrata == null) {
  2736.                 msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO , "servizio non esistente" );
  2737.                 msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_IMBUSTAMENTO,"registroServizi.ricercaServizioFallita");
  2738.                 servizioNonTrovato = true;
  2739.             }
  2740.             ErroreIntegrazione erroreIntegrazione = null;
  2741.             IntegrationFunctionError integrationFunctionError = null;
  2742.             if (invocazioneAzioneErrata != null) {
  2743.                
  2744.                 String azione = "";
  2745.                 if(idServizio.getAzione()!=null) {
  2746.                     azione = "(azione:"+ idServizio.getAzione()+ ") ";
  2747.                 }
  2748.                
  2749.                 pddContext.addObject(org.openspcoop2.core.constants.Costanti.OPERAZIONE_NON_INDIVIDUATA, "true");
  2750.                
  2751.                 erroreIntegrazione = ErroriIntegrazione.ERRORE_423_SERVIZIO_CON_AZIONE_SCORRETTA.
  2752.                         getErrore423_ServizioConAzioneScorretta(azione+ invocazioneAzioneErrata);
  2753.                 integrationFunctionError = IntegrationFunctionError.OPERATION_UNDEFINED;
  2754.             } else if (portTypeErrato != null) {
  2755.                 erroreIntegrazione = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2756.                         get5XX_ErroreProcessamento(portTypeErrato, CodiceErroreIntegrazione.CODICE_540_REGISTRO_SERVIZI_MAL_CONFIGURATO);
  2757.                 integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  2758.             } else if (servizioNonTrovato) {
  2759.                 erroreIntegrazione = ErroriIntegrazione.ERRORE_405_SERVIZIO_NON_TROVATO.getErroreIntegrazione();
  2760.                 integrationFunctionError = IntegrationFunctionError.NOT_FOUND;
  2761.             } else if (ricercaConErrore) {
  2762.                 erroreIntegrazione = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2763.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_534_REGISTRO_DEI_SERVIZI_NON_DISPONIBILE);
  2764.                 integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  2765.             } else if (servizioCorrelatoNonTrovato){
  2766.                 erroreIntegrazione = ErroriIntegrazione.ERRORE_408_SERVIZIO_CORRELATO_NON_TROVATO.getErroreIntegrazione();
  2767.                 //integrationFunctionError = IntegrationFunctionError.CORRELATION_INFORMATION_NOT_FOUND; in questo caso si tratta di un errore nella configurazione
  2768.                 integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  2769.             }
  2770.             else {
  2771.                 erroreIntegrazione = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2772.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_500_ERRORE_INTERNO);
  2773.                 integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  2774.             }
  2775.             openspcoopstate.releaseResource();
  2776.             if (this.msgContext.isGestioneRisposta()) {
  2777.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,integrationFunctionError,erroreIntegrazione,eServiceNotFound,null)));
  2778.             }
  2779.             return;
  2780.         }
  2781.         msgDiag.highDebug("Ricerca servizio terminata");
  2782.         infoServizio.setCorrelato(isServizioCorrelato);
  2783.         this.msgContext.getProtocol().setProfiloCollaborazione(infoServizio.getProfiloDiCollaborazione(),null); // il valore verra' serializzato solo successivamente nella busta
  2784.         msgDiag.addKeyword(CostantiPdD.KEY_PROFILO_COLLABORAZIONE, traduttore.toString(infoServizio.getProfiloDiCollaborazione()));
  2785.         if(infoServizio!=null && infoServizio.getIdAccordo()!=null){
  2786.             this.msgContext.getProtocol().setIdAccordo(infoServizio.getIdAccordo());
  2787.             richiestaDelegata.setIdAccordo(infoServizio.getIdAccordo());
  2788.             try{
  2789.                 idServizio.setUriAccordoServizioParteComune(IDAccordoFactory.getInstance().getUriFromIDAccordo(infoServizio.getIdAccordo()));
  2790.             }catch(Exception e){
  2791.                 // ignore
  2792.             }
  2793.         }
  2794.         msgDiag.highDebug("Convert infoServizio to Busta ...");
  2795.         Busta bustaRichiesta = infoServizio.convertToBusta(protocolFactory.getProtocol(), soggettoFruitore);
  2796.         if(sa!=null) {
  2797.             bustaRichiesta.setServizioApplicativoFruitore(sa.getNome());
  2798.         }
  2799.         msgDiag.highDebug("Convert infoServizio to Busta terminata");
  2800.         inRequestPDMessage.setBustaRichiesta(bustaRichiesta);
  2801.        
  2802.         // Aggiorno eventuale valore dipendete dal profilo (PDC)
  2803.         if(this.msgContext.getProtocol()!=null && idServizio.getVersione()!=null) {
  2804.             if(this.msgContext.getProtocol().getVersioneServizio()==null) {
  2805.                 this.msgContext.getProtocol().setVersioneServizio(idServizio.getVersione());
  2806.             }
  2807.             else if(this.msgContext.getProtocol().getVersioneServizio().intValue()!=idServizio.getVersione().intValue()) {
  2808.                 this.msgContext.getProtocol().setVersioneServizio(idServizio.getVersione());
  2809.             }
  2810.         }
  2811.        

  2812.        
  2813.        
  2814.        
  2815.        
  2816.        
  2817.        
  2818.         /* ------------ Autorizzazione ------------- */
  2819.        
  2820.         String tipoAutorizzazione = null;
  2821.         String tipoAutorizzazioneContenuto = null;
  2822.         try {
  2823.             tipoAutorizzazione = configurazionePdDReader.getAutorizzazione(portaDelegata);
  2824.             tipoAutorizzazioneContenuto = configurazionePdDReader.getAutorizzazioneContenuto(portaDelegata);
  2825.         } catch (Exception e) {
  2826.             msgDiag.logErroreGenerico(e, "letturaAutenticazioneTokenAutorizzazione");
  2827.             logError(logCore, msgDiag.getMessaggio_replaceKeywords("letturaAutenticazioneTokenAutorizzazione"),e);
  2828.             openspcoopstate.releaseResource();
  2829.             if (this.msgContext.isGestioneRisposta()) {
  2830.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  2831.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2832.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE), e,null)));
  2833.             }
  2834.             return;
  2835.         }
  2836.        
  2837.         DatiInvocazionePortaDelegata datiInvocazione = new DatiInvocazionePortaDelegata();
  2838.         datiInvocazione.setBusta(bustaRichiesta);
  2839.         datiInvocazione.setToken(token);
  2840.         datiInvocazione.setPddContext(pddContext);
  2841.         datiInvocazione.setInfoConnettoreIngresso(inRequestContext.getConnettore());
  2842.         datiInvocazione.setIdServizio(richiestaDelegata.getIdServizio());
  2843.         datiInvocazione.setState(openspcoopstate.getStatoRichiesta());
  2844.         datiInvocazione.setIdPD(identificativoPortaDelegata);
  2845.         datiInvocazione.setPd(portaDelegata);      
  2846.         datiInvocazione.setIdServizioApplicativo(idServizioApplicativo);
  2847.         datiInvocazione.setServizioApplicativo(sa);
  2848.        
  2849.        
  2850.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Autorizzazione del servizio applicativo...");
  2851.        

  2852.         msgDiag.mediumDebug("Autorizzazione del servizio applicativo...");
  2853.         this.msgContext.getIntegrazione().setTipoAutorizzazione(tipoAutorizzazione);
  2854.         if(tipoAutorizzazione!=null){
  2855.             msgDiag.addKeyword(CostantiPdD.KEY_TIPO_AUTORIZZAZIONE, tipoAutorizzazione);
  2856.         }
  2857.         if (CostantiConfigurazione.AUTORIZZAZIONE_NONE.equalsIgnoreCase(tipoAutorizzazione) == false) {
  2858.            
  2859.             transaction.getTempiElaborazione().startAutorizzazione();
  2860.             try {
  2861.            
  2862.                 msgDiag.logPersonalizzato("autorizzazioneInCorso");
  2863.                
  2864.                 ErroreIntegrazione errore = null;
  2865.                 Exception eAutorizzazione = null;
  2866.                 OpenSPCoop2Message errorMessageAutorizzazione = null;
  2867.                 String wwwAuthenticateErrorHeader = null;
  2868.                 boolean detailsSet = false;
  2869.                 IntegrationFunctionError integrationFunctionError = null;
  2870.                 try {                      
  2871.                     EsitoAutorizzazionePortaDelegata esito =
  2872.                             GestoreAutorizzazione.verificaAutorizzazionePortaDelegata(tipoAutorizzazione, datiInvocazione, pddContext, protocolFactory, requestMessage, logCore);
  2873.                     CostantiPdD.addKeywordInCache(msgDiag, esito.isEsitoPresenteInCache(),
  2874.                             pddContext, CostantiPdD.KEY_INFO_IN_CACHE_FUNZIONE_AUTORIZZAZIONE);
  2875.                     if(esito.getDetails()==null){
  2876.                         msgDiag.addKeyword(CostantiPdD.KEY_DETAILS, "");
  2877.                     }else{
  2878.                         msgDiag.addKeyword(CostantiPdD.KEY_DETAILS, " ("+esito.getDetails()+")");
  2879.                     }
  2880.                     detailsSet = true;
  2881.                     if (esito.isAutorizzato() == false) {
  2882.                         errore = esito.getErroreIntegrazione();
  2883.                         eAutorizzazione = esito.getEccezioneProcessamento();
  2884.                         errorMessageAutorizzazione = esito.getErrorMessage();
  2885.                         wwwAuthenticateErrorHeader = esito.getWwwAuthenticateErrorHeader();
  2886.                         integrationFunctionError = esito.getIntegrationFunctionError();
  2887.                         pddContext.addObject(org.openspcoop2.core.constants.Costanti.ERRORE_AUTORIZZAZIONE, "true");
  2888.                     }
  2889.                     else{
  2890.                         msgDiag.logPersonalizzato("autorizzazioneEffettuata");
  2891.                     }
  2892.                    
  2893.                 } catch (Exception e) {
  2894.                     CostantiPdD.addKeywordInCache(msgDiag, false,
  2895.                             pddContext, CostantiPdD.KEY_INFO_IN_CACHE_FUNZIONE_AUTORIZZAZIONE);
  2896.                     errore = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2897.                             get5XX_ErroreProcessamento("processo di autorizzazione ["
  2898.                                     + tipoAutorizzazione + "] fallito, " + e.getMessage(),CodiceErroreIntegrazione.CODICE_504_AUTORIZZAZIONE);
  2899.                     eAutorizzazione = e;
  2900.                     logError(logCore, "processo di autorizzazione ["
  2901.                             + tipoAutorizzazione + "] fallito, " + e.getMessage(),e);
  2902.                 }
  2903.                 if (errore != null) {
  2904.                     if(!detailsSet) {
  2905.                         msgDiag.addKeyword(CostantiPdD.KEY_DETAILS, "");
  2906.                     }
  2907.                     String descrizioneErrore = null;
  2908.                     try{
  2909.                         descrizioneErrore = errore.getDescrizione(protocolFactory);
  2910.                         msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, descrizioneErrore);
  2911.                     }catch(Exception e){
  2912.                         logError(logCore, "getDescrizione Error:"+e.getMessage(),e);
  2913.                     }
  2914.                     msgDiag.logPersonalizzato("servizioApplicativoFruitore.nonAutorizzato");
  2915.                     String errorMsg =  "Riscontrato errore durante il processo di Autorizzazione per il messaggio con identificativo ["+idMessageRequest+"]: "+descrizioneErrore;
  2916.                     if(eAutorizzazione!=null){
  2917.                         logError(logCore, errorMsg,eAutorizzazione);
  2918.                     }
  2919.                     else{
  2920.                         logError(logCore, errorMsg);
  2921.                     }
  2922.                     openspcoopstate.releaseResource();
  2923.    
  2924.                     if (this.msgContext.isGestioneRisposta()) {
  2925.                        
  2926.                         if(errorMessageAutorizzazione!=null) {
  2927.                             this.msgContext.setMessageResponse(errorMessageAutorizzazione);
  2928.                         }
  2929.                         else {
  2930.                        
  2931.                             if(CodiceErroreIntegrazione.CODICE_404_AUTORIZZAZIONE_FALLITA.equals(errore.getCodiceErrore()) ||
  2932.                                     CodiceErroreIntegrazione.CODICE_445_TOKEN_AUTORIZZAZIONE_FALLITA.equals(errore.getCodiceErrore())){
  2933.                                 if(integrationFunctionError==null) {
  2934.                                     integrationFunctionError = IntegrationFunctionError.AUTHORIZATION;
  2935.                                 }
  2936.                             }else{
  2937.                                 if(integrationFunctionError==null) {
  2938.                                     integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  2939.                                 }
  2940.                             }
  2941.                            
  2942.                             OpenSPCoop2Message errorOpenSPCoopMsg = (this.generatoreErrore.build(pddContext,integrationFunctionError,errore,
  2943.                                     eAutorizzazione,null));
  2944.    
  2945.                             if(wwwAuthenticateErrorHeader!=null) {
  2946.                                 errorOpenSPCoopMsg.forceTransportHeader(HttpConstants.AUTHORIZATION_RESPONSE_WWW_AUTHENTICATE, wwwAuthenticateErrorHeader);
  2947.                             }
  2948.                            
  2949.                             this.msgContext.setMessageResponse(errorOpenSPCoopMsg);
  2950.                            
  2951.                         }
  2952.                     }
  2953.                     return;
  2954.                 }
  2955.             }finally {
  2956.                 transaction.getTempiElaborazione().endAutorizzazione();
  2957.             }
  2958.         }
  2959.         else{
  2960.             msgDiag.logPersonalizzato("autorizzazioneDisabilitata");
  2961.         }
  2962.        
  2963.        
  2964.        
  2965.        
  2966.        
  2967.        
  2968.        
  2969.        
  2970.    
  2971.        
  2972.        
  2973.        
  2974.         /* -------- Controlli Header di Integrazione ------------- */
  2975.        
  2976.         if(infoServizio.getIdRiferimentoRichiesta() &&
  2977.                 protocolConfig.isIntegrationInfoRequired(TipoPdD.DELEGATA, requestInfo.getProtocolServiceBinding(),FunzionalitaProtocollo.RIFERIMENTO_ID_RICHIESTA)) {
  2978.             String riferimentoRichiesta = null;
  2979.             if (headerIntegrazioneRichiesta!=null &&
  2980.                     headerIntegrazioneRichiesta.getBusta() != null && headerIntegrazioneRichiesta.getBusta().getRiferimentoMessaggio() != null) {
  2981.                 riferimentoRichiesta = headerIntegrazioneRichiesta.getBusta().getRiferimentoMessaggio();
  2982.                 this.msgContext.getProtocol().setRiferimentoAsincrono(riferimentoRichiesta);
  2983.             }
  2984.             if(riferimentoRichiesta==null) {
  2985.                 StringBuilder bf = new StringBuilder();
  2986.                 for (int i = 0; i < tipiIntegrazionePD.length; i++) {
  2987.                     if(i>0) {
  2988.                         bf.append(",");
  2989.                     }
  2990.                     bf.append(tipiIntegrazionePD[i]);
  2991.                 }
  2992.                 msgDiag.addKeyword(CostantiPdD.KEY_TIPI_INTEGRAZIONE ,bf.toString() );
  2993.                 msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI,"riferimentoIdRichiesta.nonFornito");
  2994.                 ErroreIntegrazione erroreIntegrazione = ErroriIntegrazione.ERRORE_442_RIFERIMENTO_ID_MESSAGGIO.getErroreIntegrazione();
  2995.                 IntegrationFunctionError integrationFunctionError = IntegrationFunctionError.CORRELATION_INFORMATION_NOT_FOUND;
  2996.                
  2997.                 openspcoopstate.releaseResource();
  2998.                 if (this.msgContext.isGestioneRisposta()) {
  2999.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,integrationFunctionError,erroreIntegrazione,null,null)));
  3000.                 }
  3001.                 return;
  3002.                
  3003.             }
  3004.         }
  3005.        
  3006.        
  3007.        
  3008.        
  3009.        
  3010.         /* -------- Profilo di Gestione ------------- */
  3011.         try {
  3012.             String profiloGestione = registroServiziReader.getProfiloGestioneFruizioneServizio(idServizio,nomeRegistroForSearch, requestInfo);
  3013.             richiestaDelegata.setProfiloGestione(profiloGestione);
  3014.             msgDiag.mediumDebug("Profilo di gestione ["+ RicezioneContenutiApplicativi.ID_MODULO+ "] della busta: " + profiloGestione);
  3015.         } catch (Exception e) {
  3016.             msgDiag.addKeywordErroreProcessamento(e,"analisi del profilo di gestione fallita");
  3017.             msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_IMBUSTAMENTO,"registroServizi.ricercaServizioFallita");
  3018.             logError(logCore, "Identificazione Profilo Gestione fallita",e);
  3019.             openspcoopstate.releaseResource();
  3020.             if (this.msgContext.isGestioneRisposta()) {
  3021.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  3022.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3023.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),e,null)));
  3024.             }
  3025.             return;
  3026.         }
  3027.        
  3028.        
  3029.        
  3030.        
  3031.         /* -------- OpenSPCoop2Message Update ------------- */
  3032.         try {
  3033.             msgDiag.mediumDebug("Aggiornamento del messaggio");
  3034.             requestMessage = protocolFactory.createProtocolManager().updateOpenSPCoop2MessageRequest(requestMessage, bustaRichiesta,
  3035.                     protocolFactory.getCachedRegistryReader(registroServiziReader, requestInfo));
  3036.         } catch (Exception e) {
  3037.             msgDiag.addKeywordErroreProcessamento(e,"Aggiornamento messaggio fallito");
  3038.             msgDiag.logErroreGenerico(e,"ProtocolManager.updateOpenSPCoop2Message");
  3039.             logError(logCore, "ProtocolManager.updateOpenSPCoop2Message error: "+e.getMessage(),e);
  3040.             openspcoopstate.releaseResource();
  3041.             if (this.msgContext.isGestioneRisposta()) {
  3042.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  3043.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3044.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),e,null)));
  3045.             }
  3046.             return;
  3047.         }
  3048.        
  3049.        
  3050.        
  3051.        
  3052.         /* -------- Indirizzi Risposta  ------------- */
  3053.        
  3054.         String indirizzoFruitore = null;
  3055.         String indirizzoErogatore = null;
  3056.         IProtocolConfiguration protocolConfiguration = protocolFactory.createProtocolConfiguration();
  3057.         if(protocolConfiguration.isSupportoIndirizzoRisposta()){
  3058.             try {
  3059.                 Connettore connettoreFruitore = null;
  3060.                 try{
  3061.                     connettoreFruitore = registroServiziReader.getConnettore(soggettoFruitore, nomeRegistroForSearch, requestInfo);
  3062.                 }catch(org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound dNotFound){
  3063.                     // ignore
  3064.                 }
  3065.                 if(connettoreFruitore!=null && !CostantiConfigurazione.DISABILITATO.equals(connettoreFruitore.getTipo())){
  3066.                     if(connettoreFruitore.getProperties()!=null && connettoreFruitore.getProperties().containsKey(CostantiConnettori.CONNETTORE_LOCATION)){
  3067.                         indirizzoFruitore = connettoreFruitore.getProperties().get(CostantiConnettori.CONNETTORE_LOCATION);
  3068.                     }
  3069.                 }
  3070.                 msgDiag.mediumDebug("Indirizzo Risposta del soggetto fruitore ["+ soggettoFruitore+ "]: " + indirizzoFruitore);
  3071.                
  3072.                 Connettore connettoreErogatore = null;
  3073.                 try{
  3074.                     connettoreErogatore = registroServiziReader.getConnettore(idServizio.getSoggettoErogatore(), nomeRegistroForSearch, requestInfo);
  3075.                 }catch(org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound dNotFound){
  3076.                     // ignore
  3077.                 }
  3078.                 if(connettoreErogatore!=null && !CostantiConfigurazione.DISABILITATO.equals(connettoreErogatore.getTipo())){
  3079.                     if(connettoreErogatore.getProperties()!=null && connettoreErogatore.getProperties().containsKey(CostantiConnettori.CONNETTORE_LOCATION)){
  3080.                         indirizzoErogatore = connettoreErogatore.getProperties().get(CostantiConnettori.CONNETTORE_LOCATION);
  3081.                     }
  3082.                 }
  3083.                 msgDiag.mediumDebug("Indirizzo Risposta del soggetto erogatore ["+ idServizio.getSoggettoErogatore()+ "]: " + indirizzoErogatore);
  3084.                
  3085.             } catch (Exception e) {
  3086.                 msgDiag.addKeywordErroreProcessamento(e,"recupero degli indirizzi di risposta per i soggetti fallita");
  3087.                 msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_IMBUSTAMENTO,"registroServizi.ricercaServizioFallita");
  3088.                 logError(logCore, "Identificazione Indirizzo Risposta fallita",e);
  3089.                 openspcoopstate.releaseResource();
  3090.                 if (this.msgContext.isGestioneRisposta()) {
  3091.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  3092.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3093.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),e,null)));
  3094.                 }
  3095.                 return;
  3096.             }
  3097.             this.msgContext.getProtocol().setIndirizzoFruitore(indirizzoFruitore);
  3098.             this.msgContext.getProtocol().setIndirizzoErogatore(indirizzoErogatore);
  3099.         }
  3100.        
  3101.        
  3102.         /* ---- Ricerca registro dei servizi terminata con successo --- */
  3103.         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_IMBUSTAMENTO,"registroServizi.ricercaServizioEffettuata");
  3104.        
  3105.        
  3106.        

  3107.        
  3108.        
  3109.        
  3110.        
  3111.        
  3112.        
  3113.        
  3114.        
  3115.        
  3116.        
  3117.        
  3118.        
  3119.        
  3120.        
  3121.         // ------------- in-protocol-handler -----------------------------
  3122.         try{
  3123.             InRequestProtocolContext inRequestProtocolContext = new InRequestProtocolContext(inRequestContext);
  3124.             if(inRequestProtocolContext.getStato()==null) {
  3125.                 inRequestProtocolContext.setStato(openspcoopstate.getStatoRichiesta());
  3126.             }
  3127.             if(inRequestProtocolContext.getConnettore()!=null){
  3128.                 inRequestProtocolContext.getConnettore().setCredenziali(credenziali);
  3129.             }
  3130.             inRequestProtocolContext.setProtocollo(this.msgContext.getProtocol());
  3131.             inRequestProtocolContext.setIntegrazione(this.msgContext.getIntegrazione());
  3132.             GestoreHandlers.inRequestProtocol(inRequestProtocolContext, msgDiag, logCore);
  3133.         }catch(Exception e){        
  3134.             ErroreIntegrazione erroreIntegrazione = null;
  3135.             IntegrationFunctionError integrationFunctionError = null;
  3136.             if(e instanceof HandlerException){
  3137.                 HandlerException he = (HandlerException) e;
  3138.                 if(he.isEmettiDiagnostico()){
  3139.                     msgDiag.logErroreGenerico(e,he.getIdentitaHandler());
  3140.                 }
  3141.                 logError(logCore, "Gestione InRequestProtocolHandler non riuscita ("+he.getIdentitaHandler()+"): "  + he);
  3142.                 if(this.msgContext.isGestioneRisposta()){
  3143.                     erroreIntegrazione = he.convertToErroreIntegrazione();
  3144.                     integrationFunctionError = he.getIntegrationFunctionError();
  3145.                 }
  3146.             }else{
  3147.                 msgDiag.logErroreGenerico(e,"InvocazioneInRequestHandler");
  3148.                 logError(logCore, "Gestione InRequestProtocolHandler non riuscita: "    + e);
  3149.             }
  3150.             openspcoopstate.releaseResource();
  3151.             if (this.msgContext.isGestioneRisposta()) {
  3152.                 if(erroreIntegrazione==null){
  3153.                     erroreIntegrazione = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3154.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_558_HANDLER_IN_PROTOCOL_REQUEST);
  3155.                 }
  3156.                 if(integrationFunctionError==null) {
  3157.                     integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  3158.                 }
  3159.                 OpenSPCoop2Message responseMessageError = this.generatoreErrore.build(pddContext,integrationFunctionError,erroreIntegrazione,e,null);
  3160.                 if(e instanceof HandlerException){
  3161.                     HandlerException he = (HandlerException) e;
  3162.                     he.customized(responseMessageError);
  3163.                 }
  3164.                 this.msgContext.setMessageResponse(responseMessageError);
  3165.             }
  3166.             return;
  3167.         }
  3168.        
  3169.        
  3170.        
  3171.        
  3172.        
  3173.        
  3174.        
  3175.        
  3176.        
  3177.        
  3178.        
  3179.        
  3180.        
  3181.         /* -------------------------- Implementazione PdD Soggetti busta -------------------------------*/
  3182.         String implementazionePdDMittente = null;
  3183.         String implementazionePdDDestinatario = null;
  3184.         String idPdDMittente = null;
  3185.         String idPdDDestinatario = null;
  3186.         msgDiag.mediumDebug("Ricerca implementazione della porta di dominio dei soggetti...");
  3187.         try{
  3188.             implementazionePdDMittente = registroServiziReader.getImplementazionePdD(soggettoFruitore, null, requestInfo);
  3189.             implementazionePdDDestinatario = registroServiziReader.getImplementazionePdD(idServizio.getSoggettoErogatore(), null, requestInfo);
  3190.             idPdDMittente = registroServiziReader.getIdPortaDominio(soggettoFruitore, null, requestInfo);
  3191.             idPdDDestinatario = registroServiziReader.getIdPortaDominio(idServizio.getSoggettoErogatore(), null, requestInfo);
  3192.         }catch(Exception e){
  3193.             msgDiag.logErroreGenerico(e,"ricercaImplementazioniPdD");
  3194.             openspcoopstate.releaseResource();
  3195.             if (this.msgContext.isGestioneRisposta()) {
  3196.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  3197.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3198.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_534_REGISTRO_DEI_SERVIZI_NON_DISPONIBILE),e,null)));
  3199.             }
  3200.             return;
  3201.         }
  3202.         msgDiag.mediumDebug("ImplementazionePdD soggetto ("+soggettoFruitore.toString()+") e' ["+implementazionePdDMittente+"], soggetto ("
  3203.                 +idServizio.getSoggettoErogatore().toString()+") e' ["+implementazionePdDDestinatario+"]");
  3204.        
  3205.        
  3206.        
  3207.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Controllo validazione xsd abilitata/disabilitata...");
  3208.        
  3209.        
  3210.        
  3211.         /* ------------ Validazione Contenuti Applicativi ------------- */
  3212.         msgDiag.mediumDebug("Controllo validazione xsd abilitata/disabilitata...");
  3213.         ValidazioneContenutiApplicativi validazioneContenutoApplicativoApplicativo = null;
  3214.         List<Proprieta> proprietaPorta = null;
  3215.         try {
  3216.             validazioneContenutoApplicativoApplicativo = configurazionePdDReader.getTipoValidazioneContenutoApplicativo(portaDelegata,implementazionePdDDestinatario, true);
  3217.             proprietaPorta = portaDelegata.getProprietaList();
  3218.         } catch (Exception e) {
  3219.             msgDiag.logErroreGenerico(e,"getTipoValidazioneContenutoApplicativo(pd,"+implementazionePdDDestinatario+")");
  3220.             openspcoopstate.releaseResource();
  3221.             if (this.msgContext.isGestioneRisposta()) {
  3222.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  3223.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3224.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),e,null)));
  3225.             }
  3226.             return;
  3227.         }
  3228.         if(validazioneContenutoApplicativoApplicativo!=null && validazioneContenutoApplicativoApplicativo.getTipo()!=null){
  3229.             String tipo = ValidatoreMessaggiApplicativi.getTipo(validazioneContenutoApplicativoApplicativo);
  3230.             this.msgContext.getIntegrazione().setTipoValidazioneContenuti(tipo);
  3231.             msgDiag.addKeyword(CostantiPdD.KEY_TIPO_VALIDAZIONE_CONTENUTI, tipo);
  3232.             msgDiag.addKeyword(CostantiPdD.KEY_DETAILS_VALIDAZIONE_CONTENUTI,"");
  3233.         }
  3234.         if (
  3235.                 (validazioneContenutoApplicativoApplicativo!=null)
  3236.                 &&
  3237.                 (
  3238.                         CostantiConfigurazione.STATO_CON_WARNING_ABILITATO.equals(validazioneContenutoApplicativoApplicativo.getStato())
  3239.                         ||
  3240.                         CostantiConfigurazione.STATO_CON_WARNING_WARNING_ONLY.equals(validazioneContenutoApplicativoApplicativo.getStato())
  3241.                 )
  3242.             ) {

  3243.             transaction.getTempiElaborazione().startValidazioneRichiesta();
  3244.             ByteArrayInputStream binXSD = null;
  3245.             try {
  3246.                 msgDiag.logPersonalizzato("validazioneContenutiApplicativiRichiestaInCorso");
  3247.                
  3248.                 boolean readInterface = CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_INTERFACE.equals(validazioneContenutoApplicativoApplicativo.getTipo());
  3249.                        
  3250.                 if(ServiceBinding.SOAP.equals(requestMessage.getServiceBinding())){
  3251.                
  3252.                     // Accept mtom message
  3253.                     List<MtomXomReference> xomReferences = null;
  3254.                     if(StatoFunzionalita.ABILITATO.equals(validazioneContenutoApplicativoApplicativo.getAcceptMtomMessage())){
  3255.                         msgDiag.mediumDebug("Validazione xsd della richiesta (mtomFastUnpackagingForXSDConformance)...");
  3256.                         if(ServiceBinding.SOAP.equals(requestMessage.getServiceBinding())==false){
  3257.                             throw new Exception("Funzionalita 'AcceptMtomMessage' valida solamente per Service Binding SOAP");
  3258.                         }
  3259.                         xomReferences = requestMessage.castAsSoap().mtomFastUnpackagingForXSDConformance();
  3260.                     }
  3261.                    
  3262.                     // Init Validatore
  3263.                     msgDiag.mediumDebug("Validazione xsd della richiesta (initValidator)...");
  3264.                     ValidatoreMessaggiApplicativi validatoreMessaggiApplicativi = new ValidatoreMessaggiApplicativi(
  3265.                             registroServiziReader, richiestaDelegata.getIdServizio(), requestMessage,readInterface,
  3266.                             propertiesReader.isValidazioneContenutiApplicativiRpcLiteralXsiTypeGestione(),
  3267.                             proprietaPorta,
  3268.                             pddContext);
  3269.                
  3270.                     // Validazione WSDL
  3271.                     if (CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_INTERFACE.equals(validazioneContenutoApplicativoApplicativo.getTipo())
  3272.                         || CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_OPENSPCOOP.equals(validazioneContenutoApplicativoApplicativo.getTipo())) {
  3273.                         msgDiag.mediumDebug("Validazione wsdl della richiesta ...");
  3274.                         validatoreMessaggiApplicativi.validateWithWsdlLogicoImplementativo(true);
  3275.                     }
  3276.                    
  3277.                     // Validazione XSD
  3278.                     msgDiag.mediumDebug("Validazione xsd della richiesta (validazione)...");
  3279.                     validatoreMessaggiApplicativi.validateWithWsdlDefinitorio(true);
  3280.    
  3281.                     // Validazione WSDL (Restore Original Document)
  3282.                     if (CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_INTERFACE.equals(validazioneContenutoApplicativoApplicativo.getTipo())
  3283.                         || CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_OPENSPCOOP.equals(validazioneContenutoApplicativoApplicativo.getTipo())) {
  3284.                         if(propertiesReader.isValidazioneContenutiApplicativiRpcLiteralXsiTypeGestione() &&
  3285.                                 propertiesReader.isValidazioneContenutiApplicativiRpcLiteralXsiTypeRipulituraDopoValidazione()){
  3286.                             msgDiag.mediumDebug("Ripristino elementi modificati per supportare validazione wsdl della richiesta ...");
  3287.                             validatoreMessaggiApplicativi.restoreOriginalDocument(true);
  3288.                         }
  3289.                     }
  3290.                    
  3291.                     // Ripristino struttura messaggio con xom
  3292.                     if(xomReferences!=null && xomReferences.size()>0){
  3293.                         msgDiag.mediumDebug("Validazione xsd della richiesta (mtomRestoreAfterXSDConformance)...");
  3294.                         if(ServiceBinding.SOAP.equals(requestMessage.getServiceBinding())==false){
  3295.                             throw new Exception("Funzionalita 'AcceptMtomMessage' valida solamente per Service Binding SOAP");
  3296.                         }
  3297.                         requestMessage.castAsSoap().mtomRestoreAfterXSDConformance(xomReferences);
  3298.                     }
  3299.                    
  3300.                 }
  3301.                 else {
  3302.                    
  3303.                     // Init Validatore
  3304.                     msgDiag.mediumDebug("Validazione della richiesta (initValidator)...");
  3305.                     ValidatoreMessaggiApplicativiRest validatoreMessaggiApplicativi =
  3306.                         new ValidatoreMessaggiApplicativiRest(registroServiziReader, richiestaDelegata.getIdServizio(), requestMessage, readInterface, proprietaPorta,
  3307.                                 protocolFactory, pddContext);
  3308.                    
  3309.                     if(CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_XSD.equals(validazioneContenutoApplicativoApplicativo.getTipo()) &&
  3310.                             requestMessage.castAsRest().hasContent()) {
  3311.                        
  3312.                         // Validazione XSD
  3313.                         msgDiag.mediumDebug("Validazione xsd della richiesta ...");
  3314.                         validatoreMessaggiApplicativi.validateWithSchemiXSD(true);
  3315.                        
  3316.                     }
  3317.                     else {
  3318.                        
  3319.                         // Validazione Interface
  3320.                         validatoreMessaggiApplicativi.validateRequestWithInterface(false);
  3321.                        
  3322.                     }
  3323.                    
  3324.                 }
  3325.                
  3326.                 msgDiag.logPersonalizzato("validazioneContenutiApplicativiRichiestaEffettuata");
  3327.                
  3328.             } catch (ValidatoreMessaggiApplicativiException ex) {
  3329.                 msgDiag.addKeywordErroreProcessamento(ex);
  3330.                 logError(logCore, "[ValidazioneContenutiApplicativi Richiesta] "+ex.getMessage(),ex);
  3331.                 if (CostantiConfigurazione.STATO_CON_WARNING_WARNING_ONLY.equals(validazioneContenutoApplicativoApplicativo.getStato())) {
  3332.                     msgDiag.logPersonalizzato("validazioneContenutiApplicativiRichiestaNonRiuscita.warningOnly");
  3333.                 }
  3334.                 else {
  3335.                     msgDiag.logPersonalizzato("validazioneContenutiApplicativiRichiestaNonRiuscita");
  3336.                 }
  3337.                 if (CostantiConfigurazione.STATO_CON_WARNING_WARNING_ONLY.equals(validazioneContenutoApplicativoApplicativo.getStato()) == false) {
  3338.                    
  3339.                     pddContext.addObject(org.openspcoop2.core.constants.Costanti.ERRORE_VALIDAZIONE_RICHIESTA, "true");
  3340.                    
  3341.                     // validazione abilitata
  3342.                     openspcoopstate.releaseResource();
  3343.                     if (this.msgContext.isGestioneRisposta()) {
  3344.                         IntegrationFunctionError integrationFunctionError = null;
  3345.                         if(ex.getErrore()!=null &&
  3346.                                 (
  3347.                                         //CodiceErroreIntegrazione.CODICE_417_COSTRUZIONE_VALIDATORE_TRAMITE_INTERFACCIA_FALLITA.equals(ex.getErrore().getCodiceErrore()) ||
  3348.                                         CodiceErroreIntegrazione.CODICE_418_VALIDAZIONE_RICHIESTA_TRAMITE_INTERFACCIA_FALLITA.equals(ex.getErrore().getCodiceErrore())
  3349.                                 )
  3350.                             ){
  3351.                             integrationFunctionError = IntegrationFunctionError.INVALID_REQUEST_CONTENT;
  3352.                         }
  3353.                         else{
  3354.                             integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  3355.                         }
  3356.                         this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,integrationFunctionError, ex.getErrore(),ex,null)));
  3357.                     }
  3358.                     return;
  3359.                 }
  3360.             } catch (Exception ex) {
  3361.                 msgDiag.addKeywordErroreProcessamento(ex);
  3362.                 logError(logCore, "Riscontrato errore durante la validazione xsd della richiesta applicativa",ex);
  3363.                 if (CostantiConfigurazione.STATO_CON_WARNING_WARNING_ONLY.equals(validazioneContenutoApplicativoApplicativo.getStato())) {
  3364.                     msgDiag.logPersonalizzato("validazioneContenutiApplicativiRichiestaNonRiuscita.warningOnly");
  3365.                 }
  3366.                 else {
  3367.                     msgDiag.logPersonalizzato("validazioneContenutiApplicativiRichiestaNonRiuscita");
  3368.                 }
  3369.                 if (CostantiConfigurazione.STATO_CON_WARNING_WARNING_ONLY.equals(validazioneContenutoApplicativoApplicativo.getStato()) == false) {
  3370.                    
  3371.                     pddContext.addObject(org.openspcoop2.core.constants.Costanti.ERRORE_VALIDAZIONE_RICHIESTA, "true");
  3372.                    
  3373.                     // validazione abilitata
  3374.                     openspcoopstate.releaseResource();
  3375.                     if (this.msgContext.isGestioneRisposta()) {
  3376.                         this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  3377.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3378.                                 get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_531_VALIDAZIONE_TRAMITE_INTERFACCIA_FALLITA),ex,null)));
  3379.                     }
  3380.                     return;
  3381.                 }
  3382.             } finally {
  3383.                 transaction.getTempiElaborazione().endValidazioneRichiesta();
  3384.                 if (binXSD != null) {
  3385.                     try {
  3386.                         binXSD.close();
  3387.                     } catch (Exception e) {
  3388.                         // ignore
  3389.                     }
  3390.                 }
  3391.             }
  3392.         }
  3393.         else{
  3394.             msgDiag.logPersonalizzato("validazioneContenutiApplicativiRichiestaDisabilitata");
  3395.         }

  3396.        
  3397.        
  3398.        
  3399.        
  3400.        
  3401.        
  3402.        
  3403.        
  3404.        
  3405.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Autorizzazione del servizio applicativo...");
  3406.        
  3407.        
  3408.        
  3409.         /* ------------ Autorizzazione per Contenuto ------------- */
  3410.         msgDiag.mediumDebug("Autorizzazione del servizio applicativo...");
  3411.         this.msgContext.getIntegrazione().setTipoAutorizzazioneContenuto(tipoAutorizzazioneContenuto);
  3412.         if(tipoAutorizzazioneContenuto!=null){
  3413.             msgDiag.addKeyword(CostantiPdD.KEY_TIPO_AUTORIZZAZIONE_CONTENUTO, tipoAutorizzazioneContenuto);
  3414.         }
  3415.         if (CostantiConfigurazione.AUTORIZZAZIONE_NONE.equalsIgnoreCase(tipoAutorizzazioneContenuto) == false) {
  3416.            
  3417.             transaction.getTempiElaborazione().startAutorizzazioneContenuti();
  3418.             try {
  3419.            
  3420.                 msgDiag.logPersonalizzato("autorizzazioneContenutiApplicativiInCorso");
  3421.                
  3422.                 ErroreIntegrazione errore = null;
  3423.                 Exception eAutorizzazione = null;
  3424.                 boolean detailsSet = false;
  3425.                 IntegrationFunctionError integrationFunctionError = null;
  3426.                 try {
  3427.                     // Controllo Autorizzazione
  3428.                     EsitoAutorizzazionePortaDelegata esito =
  3429.                             GestoreAutorizzazione.verificaAutorizzazioneContenutoPortaDelegata(tipoAutorizzazioneContenuto, datiInvocazione, pddContext, protocolFactory, requestMessage, logCore);
  3430.                     CostantiPdD.addKeywordInCache(msgDiag, esito.isEsitoPresenteInCache(),
  3431.                             pddContext, CostantiPdD.KEY_INFO_IN_CACHE_FUNZIONE_AUTORIZZAZIONE_CONTENUTI);
  3432.                     if(esito.getDetails()==null){
  3433.                         msgDiag.addKeyword(CostantiPdD.KEY_DETAILS, "");
  3434.                     }else{
  3435.                         msgDiag.addKeyword(CostantiPdD.KEY_DETAILS, " ("+esito.getDetails()+")");
  3436.                     }
  3437.                     detailsSet = true;
  3438.                     if (esito.isAutorizzato() == false) {
  3439.                         errore = esito.getErroreIntegrazione();
  3440.                         eAutorizzazione = esito.getEccezioneProcessamento();
  3441.                         integrationFunctionError = esito.getIntegrationFunctionError();
  3442.                         pddContext.addObject(org.openspcoop2.core.constants.Costanti.ERRORE_AUTORIZZAZIONE, "true");
  3443.                     }
  3444.                     else{
  3445.                         msgDiag.logPersonalizzato("autorizzazioneContenutiApplicativiEffettuata");
  3446.                     }
  3447.                 } catch (Exception e) {
  3448.                     CostantiPdD.addKeywordInCache(msgDiag, false,
  3449.                             pddContext, CostantiPdD.KEY_INFO_IN_CACHE_FUNZIONE_AUTORIZZAZIONE_CONTENUTI);
  3450.                     String msgErroreAutorizzazione = "processo di autorizzazione ["
  3451.                             + tipoAutorizzazioneContenuto + "] fallito, " + e.getMessage();
  3452.                     errore = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3453.                             get5XX_ErroreProcessamento(msgErroreAutorizzazione, CodiceErroreIntegrazione.CODICE_542_AUTORIZZAZIONE_CONTENUTO);
  3454.                     eAutorizzazione = e;
  3455.                     logError(logCore, msgErroreAutorizzazione,e);
  3456.                 }
  3457.                 if (errore != null) {
  3458.                     if(!detailsSet) {
  3459.                         msgDiag.addKeyword(CostantiPdD.KEY_DETAILS, "");
  3460.                     }
  3461.                     msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, errore.getDescrizione(protocolFactory));
  3462.                     msgDiag.logPersonalizzato("servizioApplicativoFruitore.contenuto.nonAutorizzato");
  3463.                     openspcoopstate.releaseResource();
  3464.    
  3465.                     if (this.msgContext.isGestioneRisposta()) {
  3466.                         if(CodiceErroreIntegrazione.CODICE_404_AUTORIZZAZIONE_FALLITA.equals(errore.getCodiceErrore()) ||
  3467.                                 CodiceErroreIntegrazione.CODICE_428_AUTORIZZAZIONE_CONTENUTO_FALLITA.equals(errore.getCodiceErrore())){
  3468.                             if(integrationFunctionError==null) {
  3469.                                 integrationFunctionError = IntegrationFunctionError.CONTENT_AUTHORIZATION_DENY;
  3470.                             }
  3471.                         }else{
  3472.                             if(integrationFunctionError==null) {
  3473.                                 integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  3474.                             }
  3475.                         }
  3476.                         this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,integrationFunctionError,errore,
  3477.                                 eAutorizzazione,null)));
  3478.                     }
  3479.                     return;
  3480.                 }
  3481.             }finally {
  3482.                 transaction.getTempiElaborazione().endAutorizzazioneContenuti();
  3483.             }
  3484.         }
  3485.         else{
  3486.             msgDiag.logPersonalizzato("autorizzazioneContenutiApplicativiDisabilitata");
  3487.         }
  3488.        
  3489.        
  3490.        
  3491.        
  3492.        
  3493.        
  3494.        
  3495.        
  3496.        
  3497.        
  3498.        
  3499.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Controllo tipo di invocazione (riferimento/normale)...");
  3500.        
  3501.        
  3502.        
  3503.         /*
  3504.          * ------------ Check tipo di invocazione PD (x riferimento) -------------
  3505.          */
  3506.         msgDiag.mediumDebug("Controllo tipo di invocazione (riferimento/normale)...");
  3507.         boolean invocazionePDPerRiferimento = false;
  3508.         try {
  3509.             invocazionePDPerRiferimento = configurazionePdDReader.invocazionePortaDelegataPerRiferimento(sa);
  3510.         } catch (Exception e) {
  3511.             msgDiag.logErroreGenerico(e,"invocazionePortaDelegataPerRiferimento(sa)");
  3512.             openspcoopstate.releaseResource();
  3513.             if (this.msgContext.isGestioneRisposta()) {
  3514.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  3515.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3516.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),e,null)));
  3517.             }
  3518.             return;
  3519.         }
  3520.         if (invocazionePDPerRiferimento) {
  3521.             if (this.msgContext.isInvocazionePDPerRiferimento() == false) {
  3522.                 msgDiag.logPersonalizzato("portaDelegataInvocabilePerRiferimento.riferimentoNonPresente");
  3523.                 openspcoopstate.releaseResource();
  3524.                 if (this.msgContext.isGestioneRisposta()) {
  3525.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.BAD_REQUEST,
  3526.                             ErroriIntegrazione.ERRORE_412_PD_INVOCABILE_SOLO_PER_RIFERIMENTO.
  3527.                             getErroreIntegrazione(),null,null)));
  3528.                 }
  3529.                 return;
  3530.             }
  3531.            
  3532.             try {
  3533.                 if(openspcoopstate.resourceReleased()) {
  3534.                     // inizializzo
  3535.                     openspcoopstate.setUseConnection(true);
  3536.                     openspcoopstate.initResource(identitaPdD, this.msgContext.getIdModulo(), idTransazione);
  3537.                 }
  3538.             }catch (Exception e) {
  3539.                 msgDiag.logErroreGenerico(e,"openspcoopstate.initResource() 'invocazionePerRiferimento'");
  3540.                 openspcoopstate.releaseResource();
  3541.                 if (this.msgContext.isGestioneRisposta()) {
  3542.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.GOVWAY_RESOURCES_NOT_AVAILABLE,
  3543.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3544.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_505_GET_DB_CONNECTION), e,null)));
  3545.                 }
  3546.                 return;
  3547.             }
  3548.            
  3549.             // eventuale sbustamento delle informazioni di protocollo se richieste dal servizio applicativo
  3550.             GestoreMessaggi gestoreMessaggio = new GestoreMessaggi(openspcoopstate, true,this.msgContext.getIdInvocazionePDPerRiferimento(),Costanti.INBOX,msgDiag,this.msgContext.getPddContext());
  3551.             try{
  3552.                 boolean sbustamento_informazioni_protocollo =
  3553.                         gestoreMessaggio.sbustamentoInformazioniProtocollo(servizioApplicativo,false);
  3554.                 if(sbustamento_informazioni_protocollo){
  3555.                     // attachments non gestiti!
  3556.                     ProprietaManifestAttachments proprietaManifest = propertiesReader.getProprietaManifestAttachments("standard");
  3557.                     proprietaManifest.setGestioneManifest(false);
  3558.                     ProtocolMessage protocolMessage = bustaBuilder.sbustamento(requestMessage, pddContext,
  3559.                             bustaRichiesta, RuoloMessaggio.RICHIESTA, proprietaManifest,
  3560.                             FaseSbustamento.PRE_INVIO_RICHIESTA_PER_RIFERIMENTO, requestInfo.getIntegrationServiceBinding(), requestInfo.getBindingConfig());
  3561.                     if(protocolMessage!=null) {
  3562.                         requestMessage = protocolMessage.getMessage(); // updated
  3563.                     }
  3564.                 }
  3565.             }catch(Exception e){
  3566.                 msgDiag.logErroreGenerico(e,"invocazionePortaDelegataPerRiferimento.sbustamentoProtocolHeader()");
  3567.                 openspcoopstate.releaseResource();
  3568.                 if (this.msgContext.isGestioneRisposta()) {
  3569.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  3570.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3571.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),e,null)));
  3572.                 }
  3573.                 return;    
  3574.             }
  3575.            
  3576.         } else {
  3577.             if (this.msgContext.isInvocazionePDPerRiferimento()) {
  3578.                 msgDiag.logPersonalizzato("portaDelegataInvocabileNormalmente.riferimentoPresente");
  3579.                 openspcoopstate.releaseResource();
  3580.                 if (this.msgContext.isGestioneRisposta()) {
  3581.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.BAD_REQUEST,
  3582.                             ErroriIntegrazione.ERRORE_413_PD_INVOCABILE_SOLO_SENZA_RIFERIMENTO.
  3583.                             getErroreIntegrazione(),null,null)));
  3584.                 }
  3585.                 return;
  3586.             }
  3587.         }

  3588.        
  3589.        
  3590.        
  3591.        
  3592.        
  3593.        
  3594.        
  3595.        
  3596.        
  3597.        
  3598.        
  3599.        
  3600.        
  3601.        
  3602.        
  3603.        
  3604.        
  3605.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Controllo non esistenza di una busta ...");
  3606.        
  3607.        
  3608.        
  3609.        
  3610.         /* ------------ Controllo che il messaggio non contenga una busta */
  3611.         msgDiag.mediumDebug("Controllo non esistenza di una busta ...");
  3612.         ValidazioneSintattica validatoreSintattico = new ValidazioneSintattica(pddContext, openspcoopstate.getStatoRichiesta(),requestMessage, protocolFactory);
  3613.         boolean esisteProtocolloMsgRichiesta = false;
  3614.         boolean esisteProtocolloMsgRichiestaExit = false;
  3615.         try{
  3616.             esisteProtocolloMsgRichiesta = validatoreSintattico.
  3617.                     verifyProtocolPresence(this.msgContext.getTipoPorta(),infoServizio.getProfiloDiCollaborazione(),RuoloMessaggio.RICHIESTA);
  3618.         } catch (Exception e){
  3619.             msgDiag.logErroreGenerico(e,"controlloEsistenzaBusta");
  3620.             openspcoopstate.releaseResource();
  3621.             if (this.msgContext.isGestioneRisposta()) {
  3622.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  3623.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3624.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),e,null)));
  3625.             }
  3626.             esisteProtocolloMsgRichiestaExit = true;
  3627.         } finally {
  3628.             if(esisteProtocolloMsgRichiesta) {
  3629.                 msgDiag.logPersonalizzato("richiestaContenenteBusta");
  3630.                 openspcoopstate.releaseResource();
  3631.                 if (this.msgContext.isGestioneRisposta()) {
  3632.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTEROPERABILITY_PROFILE_REQUEST_ALREADY_EXISTS,
  3633.                             ErroriIntegrazione.ERRORE_420_BUSTA_PRESENTE_RICHIESTA_APPLICATIVA.
  3634.                             getErroreIntegrazione(),null,null)));
  3635.                 }
  3636.                 esisteProtocolloMsgRichiestaExit = true;
  3637.             }
  3638.             // *** GB ***
  3639.             if(validatoreSintattico!=null){
  3640.                 validatoreSintattico.setHeaderSOAP(null);
  3641.             }
  3642.             validatoreSintattico = null;
  3643.             // *** GB ***
  3644.         }
  3645.         if(esisteProtocolloMsgRichiestaExit) {
  3646.             return;
  3647.         }
  3648.        
  3649.        
  3650.        
  3651.        
  3652.        
  3653.        
  3654.        
  3655.        
  3656.        
  3657.        
  3658.        
  3659.        
  3660.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Recupero configurazione per salvataggio risposta in cache ...");
  3661.         msgDiag.mediumDebug("Recupero configurazione per salvataggio risposta in cache ...");
  3662.         try{
  3663.             ResponseCachingConfigurazione responseCachingConfig = configurazionePdDReader.getConfigurazioneResponseCaching(portaDelegata);
  3664.             if(responseCachingConfig!=null && StatoFunzionalita.ABILITATO.equals(responseCachingConfig.getStato())) {
  3665.                
  3666.                 transaction.getTempiElaborazione().startResponseCachingCalcoloDigest();
  3667.                 try {
  3668.                
  3669.                     msgDiag.mediumDebug("Calcolo digest per salvataggio risposta ...");
  3670.                    
  3671.                     HashGenerator hashGenerator = new HashGenerator(propertiesReader.getCachingResponseDigestAlgorithm());
  3672.                     String digest = hashGenerator.buildKeyCache(requestMessage, requestInfo, responseCachingConfig);
  3673.                     requestMessage.addContextProperty(CostantiPdD.RESPONSE_CACHE_REQUEST_DIGEST, digest);
  3674.                
  3675.                 }finally {
  3676.                     transaction.getTempiElaborazione().endResponseCachingCalcoloDigest();
  3677.                 }
  3678.             }
  3679.         } catch (Exception e){
  3680.             msgDiag.logErroreGenerico(e,"calcoloDigestSalvataggioRisposta");
  3681.             openspcoopstate.releaseResource();
  3682.             if (this.msgContext.isGestioneRisposta()) {
  3683.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  3684.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3685.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_561_DIGEST_REQUEST),e,null)));
  3686.             }
  3687.             return;
  3688.         }
  3689.        
  3690.        
  3691.        
  3692.        
  3693.        
  3694.        
  3695.        
  3696.        
  3697.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Update/Delete Header di integrazione se necessario");
  3698.        
  3699.        
  3700.        
  3701.        
  3702.        
  3703.         /*
  3704.          * ------- Update/Delete Header di integrazione se necessario -------
  3705.          */
  3706.         // L'header di integrazione SOAP non e' cancellato se presente.
  3707.         // Deve allora essere aggiornato ai valori letti
  3708.        
  3709.         for (int i = 0; i < tipiIntegrazionePD.length; i++) {
  3710.             try {
  3711.                 IGestoreIntegrazionePD gestore = null;
  3712.                 try {
  3713.                     gestore = (IGestoreIntegrazionePD) pluginLoader.newIntegrazionePortaDelegata(tipiIntegrazionePD[i]);
  3714.                 }catch(Exception e){
  3715.                     throw e;
  3716.                 }
  3717.                 if(gestore!=null){
  3718.                     String classType = null;
  3719.                     try {
  3720.                         classType = gestore.getClass().getName();
  3721.                         AbstractCore.init(gestore, pddContext, protocolFactory);
  3722.                     } catch (Exception e) {
  3723.                         throw new Exception(
  3724.                                 "Riscontrato errore durante l'inizializzazione della classe ["+ classType
  3725.                                         + "] da utilizzare per la gestione dell'integrazione delle fruizioni (Update/Delete) di tipo ["+ tipiIntegrazionePD[i] + "]: " + e.getMessage());
  3726.                     }
  3727.                     if (gestore instanceof IGestoreIntegrazionePDSoap) {
  3728.                         if(propertiesReader.deleteHeaderIntegrazioneRequestPD()){
  3729.                             // delete
  3730.                             ((IGestoreIntegrazionePDSoap)gestore).deleteInRequestHeader(inRequestPDMessage);
  3731.                         }
  3732.                         else{
  3733.                             // update
  3734.                             String servizioApplicativoDaInserireHeader = null;
  3735.                             if(CostantiPdD.SERVIZIO_APPLICATIVO_ANONIMO.equals(servizioApplicativo)==false){
  3736.                                 servizioApplicativoDaInserireHeader = servizioApplicativo;
  3737.                             }
  3738.                             ((IGestoreIntegrazionePDSoap)gestore).updateInRequestHeader(inRequestPDMessage, idServizio,
  3739.                                     idMessageRequest, servizioApplicativoDaInserireHeader, idCorrelazioneApplicativa);
  3740.                         }
  3741.                     }
  3742.                 }
  3743.             } catch (Exception e) {
  3744.                 if(propertiesReader.deleteHeaderIntegrazioneRequestPD()){
  3745.                     msgDiag.logErroreGenerico(e,"deleteHeaderIntegrazione("+ tipiIntegrazionePD[i]+")");
  3746.                 }else{
  3747.                     msgDiag.logErroreGenerico(e,"updateHeaderIntegrazione("+ tipiIntegrazionePD[i]+")");
  3748.                 }
  3749.                 openspcoopstate.releaseResource();
  3750.                 if (this.msgContext.isGestioneRisposta()) {
  3751.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  3752.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3753.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_541_GESTIONE_HEADER_INTEGRAZIONE),e,null)));
  3754.                 }
  3755.                 return;
  3756.             }
  3757.         }
  3758.        
  3759.        
  3760.        
  3761.        
  3762.        
  3763.        
  3764.        
  3765.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Gestione Funzionalita' speciali per Attachments (Manifest)");
  3766.        
  3767.        
  3768.        
  3769.        
  3770.        
  3771.         /*
  3772.          * ------------ Gestione Funzionalita' speciali per Attachments (Manifest) -------------
  3773.          */
  3774.         boolean allegaBody = false;
  3775.         boolean scartaBody = false;
  3776.         try {
  3777.             allegaBody = configurazionePdDReader.isAllegaBody(portaDelegata);
  3778.             scartaBody = configurazionePdDReader.isScartaBody(portaDelegata);
  3779.         } catch (Exception e) {
  3780.             msgDiag.logErroreGenerico(e,"configurazionePdDReader.isAllega/ScartaBody(pd)");
  3781.             openspcoopstate.releaseResource();
  3782.             if (this.msgContext.isGestioneRisposta()) {
  3783.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  3784.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3785.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),e,null)));
  3786.             }
  3787.             return;
  3788.         }
  3789.         if (scartaBody) {
  3790.             IntegrationFunctionError integrationFunctionError = null;
  3791.             try {
  3792.                 if(ServiceBinding.SOAP.equals(requestMessage.getServiceBinding())==false){
  3793.                     integrationFunctionError = IntegrationFunctionError.NOT_SUPPORTED_BY_PROTOCOL;
  3794.                     throw new Exception("Funzionalita 'ScartaBody' valida solamente per Service Binding SOAP");
  3795.                 }
  3796.                
  3797.                 // E' permesso SOLO per messaggi con attachment
  3798.                 if (requestMessage.castAsSoap().countAttachments() <= 0) {
  3799.                     throw new Exception("La funzionalita' e' permessa solo per messaggi SOAP With Attachments");
  3800.                 }
  3801.             } catch (Exception e) {
  3802.                 msgDiag.addKeywordErroreProcessamento(e);
  3803.                 msgDiag.logPersonalizzato("funzionalitaScartaBodyNonEffettuabile");
  3804.                 openspcoopstate.releaseResource();
  3805.                 if (this.msgContext.isGestioneRisposta()) {
  3806.                     if(integrationFunctionError==null) {
  3807.                         integrationFunctionError = IntegrationFunctionError.BAD_REQUEST;
  3808.                     }
  3809.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,integrationFunctionError,
  3810.                             ErroriIntegrazione.ERRORE_425_SCARTA_BODY.
  3811.                             getErrore425_ScartaBody(e.getMessage()),e,null)));
  3812.                 }
  3813.                 return;
  3814.             }
  3815.         }
  3816.         if (allegaBody) {
  3817.             try {
  3818.                 TunnelSoapUtils.allegaBody(requestMessage, propertiesReader.getHeaderSoapActorIntegrazione());
  3819.             } catch (Exception e) {
  3820.                 msgDiag.addKeywordErroreProcessamento(e);
  3821.                 msgDiag.logPersonalizzato("funzionalitaAllegaBodyNonEffettuabile");
  3822.                 openspcoopstate.releaseResource();
  3823.                 if (this.msgContext.isGestioneRisposta()) {
  3824.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.BAD_REQUEST,
  3825.                             ErroriIntegrazione.ERRORE_424_ALLEGA_BODY.
  3826.                             getErrore424_AllegaBody(e.getMessage()), e,null)));
  3827.                 }
  3828.                 return;
  3829.             }
  3830.         }

  3831.        
  3832.        
  3833.        
  3834.        
  3835.        
  3836.        
  3837.        
  3838.        
  3839.        
  3840.        
  3841.         /* ------------- Modalita' di gestione ---------------------------- */
  3842.        
  3843.         // Versione OneWay
  3844.         boolean oneWayStateless = false;
  3845.         boolean oneWayVersione11 = false;
  3846.         // Versione Sincrono
  3847.         boolean sincronoStateless = false;
  3848.         // Asincrono stateless
  3849.         boolean asincronoStateless = false;
  3850.        
  3851.         // Gestione stateless
  3852.         boolean portaStateless = false; // vero se almeno uno dei precedenti e' vero

  3853.         try {

  3854.             if(propertiesReader.isServerJ2EE()==false){
  3855.                 // Stateless obbligatorio in server di tipo web (non j2ee)
  3856.                 oneWayStateless = true;
  3857.                 sincronoStateless = true;
  3858.                 asincronoStateless = true;
  3859.             }
  3860.             else if (ProfiloDiCollaborazione.ONEWAY.equals(infoServizio.getProfiloDiCollaborazione())) {
  3861.                 oneWayStateless = configurazionePdDReader.isModalitaStateless(portaDelegata, infoServizio.getProfiloDiCollaborazione());
  3862.             } else if (ProfiloDiCollaborazione.SINCRONO.equals(infoServizio.getProfiloDiCollaborazione())) {
  3863.                 sincronoStateless = configurazionePdDReader.isModalitaStateless(portaDelegata, infoServizio.getProfiloDiCollaborazione());
  3864.             } else if(ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(infoServizio.getProfiloDiCollaborazione()) ||
  3865.                     ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(infoServizio.getProfiloDiCollaborazione())){
  3866.                 asincronoStateless = configurazionePdDReader.isModalitaStateless(portaDelegata, infoServizio.getProfiloDiCollaborazione());
  3867.             }

  3868.             oneWayVersione11 = propertiesReader.isGestioneOnewayStateful_1_1()
  3869.                 && ProfiloDiCollaborazione.ONEWAY.equals(infoServizio.getProfiloDiCollaborazione())
  3870.                     && !oneWayStateless;

  3871.             if (oneWayStateless || sincronoStateless || asincronoStateless || oneWayVersione11) {
  3872.                 openspcoopstate = OpenSPCoopState.toStateless(((OpenSPCoopStateful)openspcoopstate), openspcoopstate.isUseConnection());
  3873.                 portaStateless = true;
  3874.                 if(oneWayVersione11==false){
  3875.                     this.msgContext.getIntegrazione().setGestioneStateless(true);
  3876.                 }else{
  3877.                     this.msgContext.getIntegrazione().setGestioneStateless(false);
  3878.                 }
  3879.             }else{
  3880.                 this.msgContext.getIntegrazione().setGestioneStateless(false);
  3881.             }
  3882.            
  3883.             if(!portaStateless || oneWayVersione11) {
  3884.                 if(!openspcoopstate.isUseConnection() &&
  3885.                         (openspcoopstate instanceof OpenSPCoopStateful || oneWayVersione11)) {
  3886.                     if(openspcoopstate.resourceReleased()) {
  3887.                         // inizializzo
  3888.                         openspcoopstate.setUseConnection(true);
  3889.                         openspcoopstate.initResource(identitaPdD, this.msgContext.getIdModulo(), idTransazione);
  3890.                     }
  3891.                 }
  3892.             }

  3893.         } catch (Exception e) {
  3894.             msgDiag.logErroreGenerico(e,"GestioneStatelessStateful");
  3895.             logError(logCore, "Analisi modalita di gestione STATEFUL/STATELESS non riuscita: "+ e);
  3896.             openspcoopstate.releaseResource();
  3897.             if (this.msgContext.isGestioneRisposta()) {
  3898.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  3899.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  3900.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),e,null)));
  3901.             }
  3902.             return;
  3903.         }

  3904.        
  3905.        
  3906.        
  3907.        
  3908.        

  3909.        
  3910.        
  3911.        
  3912.         /* ------------- Modalita' di forward ---------------------------- */
  3913.        
  3914.         // Versione OneWay
  3915.         boolean localForward = false;
  3916.         LocalForwardEngine localForwardEngine = null;
  3917.         LocalForwardParameter localForwardParameter = null;
  3918.         PortaApplicativa pa = null;
  3919.         try {

  3920.             localForward = configurazionePdDReader.isLocalForwardMode(portaDelegata);
  3921.            
  3922.             if(localForward){
  3923.                                
  3924.                 String erroreConfigurazione = null;
  3925.                
  3926.                 String prefix = "( Servizio "+IDServizioFactory.getInstance().getUriFromIDServizio(idServizio)+" ) ";
  3927.                
  3928.                 if(ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(infoServizio.getProfiloDiCollaborazione()) ||
  3929.                         ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(infoServizio.getProfiloDiCollaborazione())){
  3930.                     erroreConfigurazione = "profilo di collaborazione "+infoServizio.getProfiloDiCollaborazione().getEngineValue()+" non supportato";                          
  3931.                 }
  3932.                
  3933.                 if(erroreConfigurazione==null){
  3934.                     if (ProfiloDiCollaborazione.SINCRONO.equals(infoServizio.getProfiloDiCollaborazione())) {
  3935.                         if(sincronoStateless==false){
  3936.                             erroreConfigurazione = "profilo di collaborazione "+infoServizio.getProfiloDiCollaborazione().getEngineValue()+" non supportato nella modalitร  stateful";  
  3937.                         }
  3938.                     }
  3939.                 }
  3940.                
  3941.                 if(erroreConfigurazione==null){
  3942.                     if(configurazionePdDReader.existsSoggetto(idServizio.getSoggettoErogatore(), requestInfo)==false){
  3943.                         erroreConfigurazione = "il soggetto erogatore non risulta essere gestito localmente dalla Porta";
  3944.                     }
  3945.                 }
  3946.                
  3947.                 RichiestaApplicativa ra = null;
  3948.                 IDPortaApplicativa idPA = null;
  3949.                 if(erroreConfigurazione==null){

  3950.                     String nomePA = configurazionePdDReader.getLocalForwardNomePortaApplicativa(portaDelegata);
  3951.                     if(nomePA==null){
  3952.                         try{
  3953.                             List<PortaApplicativa> list = configurazionePdDReader.getPorteApplicative(idServizio, false);
  3954.                             if(list.size()<=0){
  3955.                                 throw new DriverConfigurazioneNotFound("NotFound");
  3956.                             }
  3957.                             if(list.size()>1){
  3958.                                 StringBuilder bf = new StringBuilder();
  3959.                                 for (PortaApplicativa portaApplicativa : list) {
  3960.                                     if(bf.length()>0) {
  3961.                                         bf.append(",");
  3962.                                     }
  3963.                                     bf.append(portaApplicativa.getNome());
  3964.                                 }
  3965.                                 throw new Exception("Esiste piรน di una porta applicativa indirizzabile tramite il servizio ["+idServizio+"] indicato nella porta delegata ["+
  3966.                                         nomeUtilizzatoPerErrore+"]: "+bf.toString());
  3967.                             }
  3968.                             idPA = configurazionePdDReader.convertToIDPortaApplicativa(list.get(0));
  3969.                         }catch(DriverConfigurazioneNotFound n){
  3970.                             erroreConfigurazione = "Non esiste alcuna porta applicativa indirizzabile tramite il servizio ["+idServizio+"] indicato nella porta delegata ["+
  3971.                                     nomeUtilizzatoPerErrore+"]";
  3972.                         }catch(Exception e){
  3973.                             erroreConfigurazione = e.getMessage();
  3974.                         }
  3975.                     }
  3976.                     else{
  3977.                         try{
  3978.                             idPA = configurazionePdDReader.getIDPortaApplicativa(nomePA, requestInfo, protocolFactory);
  3979.                         }catch(Exception e){
  3980.                             erroreConfigurazione = e.getMessage();
  3981.                         }
  3982.                     }
  3983.                 }
  3984.                
  3985.                 if(erroreConfigurazione==null){
  3986.                     ra = new RichiestaApplicativa(soggettoFruitore,idServizio.getSoggettoErogatore(), idPA);
  3987.                     ra.setIntegrazione(this.msgContext.getIntegrazione());
  3988.                     ra.setProtocol(this.msgContext.getProtocol());
  3989.                     pa = configurazionePdDReader.getPortaApplicativaSafeMethod(ra.getIdPortaApplicativa(), requestInfo);
  3990.                     if(pa.sizeServizioApplicativoList()<=0){
  3991.                         erroreConfigurazione = "non risultano registrati servizi applicativi erogatori associati alla porta applicativa ("+pa.getNome()
  3992.                                 +") relativa al servizio richiesto";
  3993.                     }
  3994.                 }
  3995.                
  3996.                
  3997.                 if(erroreConfigurazione!=null){
  3998.                     erroreConfigurazione = prefix + erroreConfigurazione;
  3999.                     msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO,erroreConfigurazione);
  4000.                     msgDiag.logPersonalizzato("localForward.configError");
  4001.                    
  4002.                     openspcoopstate.releaseResource();
  4003.                     if (this.msgContext.isGestioneRisposta()) {
  4004.                         this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  4005.                                 ErroriIntegrazione.ERRORE_435_LOCAL_FORWARD_CONFIG_NON_VALIDA.
  4006.                                 getErrore435_LocalForwardConfigNonValida(erroreConfigurazione),null,null)));
  4007.                     }
  4008.                     return;
  4009.                 }
  4010.                
  4011.                 localForwardParameter = new LocalForwardParameter();
  4012.                 localForwardParameter.setLog(logCore);
  4013.                 localForwardParameter.setConfigurazionePdDReader(configurazionePdDReader);
  4014.                 localForwardParameter.setIdCorrelazioneApplicativa(idCorrelazioneApplicativa);
  4015.                 localForwardParameter.setIdentitaPdD(identitaPdD);
  4016.                 localForwardParameter.setIdModulo(this.msgContext.getIdModulo());
  4017.                 localForwardParameter.setIdRequest(idMessageRequest);
  4018.                 localForwardParameter.setImplementazionePdDDestinatario(implementazionePdDDestinatario);
  4019.                 localForwardParameter.setImplementazionePdDMittente(implementazionePdDMittente);
  4020.                 localForwardParameter.setIdPdDMittente(idPdDMittente);
  4021.                 localForwardParameter.setIdPdDDestinatario(idPdDDestinatario);
  4022.                 localForwardParameter.setInfoServizio(infoServizio);
  4023.                 localForwardParameter.setMsgDiag(msgDiag);
  4024.                 localForwardParameter.setOpenspcoopstate(openspcoopstate);
  4025.                 localForwardParameter.setPddContext(inRequestContext.getPddContext());
  4026.                 localForwardParameter.setProtocolFactory(protocolFactory);
  4027.                 localForwardParameter.setRichiestaDelegata(richiestaDelegata);
  4028.                 localForwardParameter.setStateless(portaStateless);
  4029.                 localForwardParameter.setOneWayVersione11(oneWayVersione11);
  4030.                 localForwardParameter.setIdPortaApplicativaIndirizzata(idPA);
  4031.                
  4032.                 localForwardEngine = new LocalForwardEngine(localForwardParameter);
  4033.                            
  4034.             }
  4035.            
  4036.         } catch (Exception e) {
  4037.             msgDiag.logErroreGenerico(e,"GestioneLocalForward");
  4038.             openspcoopstate.releaseResource();
  4039.             if (this.msgContext.isGestioneRisposta()) {
  4040.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  4041.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  4042.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_554_LOCAL_FORWARD_ERROR),e,null)));
  4043.             }
  4044.             return;
  4045.         }
  4046.        
  4047.        
  4048.         if(localForward){
  4049.             try {
  4050.                 if(localForwardEngine.processRequest(requestMessage)==false){
  4051.                     openspcoopstate.releaseResource();
  4052.                     if (this.msgContext.isGestioneRisposta()) {
  4053.                         this.msgContext.setMessageResponse(localForwardEngine.getResponseMessageError());
  4054.                     }
  4055.                     return;
  4056.                 }
  4057.                 if(localForwardEngine.getRequestMessageAfterProcess()!=null){
  4058.                     // Messaggio aggiornato
  4059.                     requestMessage = localForwardEngine.getRequestMessageAfterProcess();
  4060.                 }
  4061.             } catch (Exception e) {
  4062.                 msgDiag.logErroreGenerico(e,"GestioneLocalForward.processRequest");
  4063.                 openspcoopstate.releaseResource();
  4064.                 if (this.msgContext.isGestioneRisposta()) {
  4065.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,AbstractErrorGenerator.getIntegrationInternalError(pddContext),
  4066.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  4067.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_555_LOCAL_FORWARD_PROCESS_REQUEST_ERROR),e,null)));
  4068.                 }
  4069.                 return;
  4070.             }
  4071.         }
  4072.        
  4073.        
  4074.        
  4075.        
  4076.        
  4077.        
  4078.        
  4079.        
  4080.        
  4081.        
  4082.        
  4083.        
  4084.        
  4085.        
  4086.        
  4087.        
  4088.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Controllo presenza del messaggio gia' in gestione...");
  4089.        
  4090.        
  4091.        
  4092.        
  4093.        
  4094.         /* ---------------- Controllo esistenza messaggio --------------------- */
  4095.         msgDiag.mediumDebug("Controllo presenza del messaggio gia' in gestione...");
  4096.         GestoreMessaggi msgRequest = null;
  4097.         String tipoMessaggio = Costanti.OUTBOX;
  4098.         if(localForward){
  4099.             tipoMessaggio = Costanti.INBOX;
  4100.         }
  4101.         msgRequest = new GestoreMessaggi(openspcoopstate, true,idMessageRequest, tipoMessaggio, msgDiag, inRequestContext.getPddContext());
  4102.         msgRequest.setOneWayVersione11(oneWayVersione11);
  4103.         RepositoryBuste repositoryBuste = new RepositoryBuste(openspcoopstate.getStatoRichiesta(), true, protocolFactory);
  4104.         try {
  4105.             if (msgRequest.existsMessage_noCache()) {

  4106.                 // Se il proprietario attuale e' GestoreMessaggi, forzo
  4107.                 // l'eliminazione e continuo a processare il messaggio.
  4108.                 String proprietarioMessaggio = msgRequest.getProprietario(this.msgContext.getIdModulo());
  4109.                 if (TimerGestoreMessaggi.ID_MODULO.equals(proprietarioMessaggio)) {
  4110.                     msgDiag.logPersonalizzato("messaggioInGestione.marcatoDaEliminare");
  4111.                     String msg = msgDiag.getMessaggio_replaceKeywords("messaggioInGestione.marcatoDaEliminare");
  4112.                     if(propertiesReader.isMsgGiaInProcessamentoUseLock()) {
  4113.                         msgRequest._deleteMessageWithLock(msg,propertiesReader.getMsgGiaInProcessamentoAttesaAttiva(),propertiesReader.getMsgGiaInProcessamentoCheckInterval());
  4114.                     }
  4115.                     else {
  4116.                         msgRequest.deleteMessageByNow();
  4117.                     }
  4118.                 }

  4119.                 // Altrimenti genero errore messaggio precedente ancora in
  4120.                 // processamento
  4121.                 else {
  4122.                     msgDiag.addKeyword(CostantiPdD.KEY_PROPRIETARIO_MESSAGGIO, proprietarioMessaggio);
  4123.                     msgDiag.logPersonalizzato("messaggioInGestione");
  4124.                     pddContext.addObject(org.openspcoop2.core.constants.Costanti.RICHIESTA_DUPLICATA, "true");
  4125.                     openspcoopstate.releaseResource();
  4126.                     if (this.msgContext.isGestioneRisposta()) {
  4127.                         this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.CONFLICT_IN_QUEUE,
  4128.                                 ErroriIntegrazione.ERRORE_537_BUSTA_GIA_RICEVUTA.get537_BustaGiaRicevuta(idMessageRequest),null,null)));
  4129.                     }
  4130.                     return;
  4131.                 }
  4132.             }
  4133.         } catch (Exception e) {
  4134.             msgDiag.logErroreGenerico(e,"ControlloPresenzaMessaggioGiaInGestione");
  4135.             logError(logCore, "Controllo/gestione presenza messaggio gia in gestione non riuscito",e);
  4136.             openspcoopstate.releaseResource();
  4137.             if (this.msgContext.isGestioneRisposta()) {
  4138.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,AbstractErrorGenerator.getIntegrationInternalError(pddContext),
  4139.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  4140.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_537_BUSTA_GIA_RICEVUTA), e,null)));
  4141.             }
  4142.             return;
  4143.         }
  4144.        
  4145.        
  4146.        
  4147.        
  4148.        
  4149.        
  4150.        
  4151.        
  4152.        
  4153.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Registrazione messaggio di richiesta nel RepositoryMessaggi...");
  4154.        
  4155.        
  4156.        
  4157.        
  4158.        
  4159.         /*
  4160.          * ---------------- Creo sessione di gestione del messaggio ricevuto Il
  4161.          * messaggio viene assegnato al modulo 'Imbustamento' (futuro
  4162.          * proprietario) ---------------------
  4163.          */
  4164.         msgDiag.mediumDebug("Registrazione messaggio di richiesta nel RepositoryMessaggi...");
  4165.         IProtocolVersionManager moduleManager = protocolFactory.createProtocolVersionManager(richiestaDelegata.getProfiloGestione());
  4166.         boolean richiestaAsincronaSimmetricaStateless = false;      
  4167.         try {
  4168.            
  4169.             // In caso di richiestaAsincronaSimmetrica e openspcoop stateless,
  4170.             // Devo comunque salvare le informazioni sul msg della richiesta.
  4171.             // Tali informazioni servono per il check nel modulo RicezioneBuste, per verificare di gestire la risposta
  4172.             // solo dopo aver terminato di gestire la richiesta con relativa ricevuta.
  4173.             if(ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(infoServizio.getProfiloDiCollaborazione()) && portaStateless){
  4174.                
  4175.                 if (StatoFunzionalitaProtocollo.ABILITATA.equals(moduleManager.getCollaborazione(infoServizio))) {
  4176.                     // Se presente riferimentoMessaggio utilizzo quello come riferimento asincrono per la risposta.
  4177.                     if (headerIntegrazioneRichiesta.getBusta().getRiferimentoMessaggio() != null) {
  4178.                         richiestaAsincronaSimmetricaStateless = false;
  4179.                     } else if (headerIntegrazioneRichiesta.getBusta().getIdCollaborazione() != null) {
  4180.                         // Utilizzo Collaborazione come riferimentoServizioCorrelato
  4181.                         // Tanto nelle linee guida non possono esistere piu' istanze con la stessa collaborazione, e' stata deprecata.
  4182.                         // Per igni istanza asincrona (richiesta/risposta) la richiesta genera una collaborazione a capostipite
  4183.                         richiestaAsincronaSimmetricaStateless = false;
  4184.                     }else{
  4185.                         richiestaAsincronaSimmetricaStateless = true;
  4186.                     }
  4187.                 } else {
  4188.                     richiestaAsincronaSimmetricaStateless = headerIntegrazioneRichiesta.getBusta().getRiferimentoMessaggio() == null;
  4189.                 }

  4190.             }
  4191.            
  4192.            
  4193.             // Salvataggio messaggio
  4194.             msgRequest.registraMessaggio(requestMessage, dataIngressoRichiesta,
  4195.                     (oneWayStateless || sincronoStateless || asincronoStateless),
  4196.                     idCorrelazioneApplicativa);
  4197.             if(localForward){
  4198.                 msgRequest.aggiornaProprietarioMessaggio(org.openspcoop2.pdd.mdb.ConsegnaContenutiApplicativi.ID_MODULO);
  4199.             }else{
  4200.                 msgRequest.aggiornaProprietarioMessaggio(org.openspcoop2.pdd.mdb.Imbustamento.ID_MODULO);
  4201.             }
  4202.                        
  4203.             if(richiestaAsincronaSimmetricaStateless){
  4204.                 if(openspcoopstate.resourceReleased()) {
  4205.                     // inizializzo
  4206.                     openspcoopstate.setUseConnection(true);
  4207.                     openspcoopstate.initResource(identitaPdD, this.msgContext.getIdModulo(), idTransazione);
  4208.                 }
  4209.                 msgRequest.registraInformazioniMessaggio_statelessEngine(dataIngressoRichiesta, org.openspcoop2.pdd.mdb.Imbustamento.ID_MODULO,
  4210.                         idCorrelazioneApplicativa);
  4211.             }
  4212.            
  4213.         } catch (Exception e) {
  4214.             msgDiag.logErroreGenerico(e,"msgRequest.aggiornaProprietarioMessaggio");
  4215.             msgRequest.deleteMessageFromFileSystem(); // elimino richiesta salvata su fileSystem
  4216.             // Rilascio Connessione DB
  4217.             openspcoopstate.releaseResource();
  4218.             if (this.msgContext.isGestioneRisposta()) {
  4219.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,AbstractErrorGenerator.getIntegrationInternalError(pddContext),
  4220.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  4221.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_508_SAVE_REQUEST_MSG), e,null)));
  4222.             }
  4223.             return;
  4224.         }

  4225.         msgDiag.mediumDebug("Registrazione busta di richiesta nel RepositoryBuste...");
  4226.         try {
  4227.             if( (!portaStateless) || oneWayVersione11){
  4228.                 // E' gia registrata se siamo in un contesto di correlazione applicativa                
  4229.                 if (repositoryBuste.isRegistrata(idMessageRequest,tipoMessaggio)) {
  4230.                     try{
  4231.                         if(localForward){
  4232.                             repositoryBuste.aggiornaBustaIntoInBox(idMessageRequest, soggettoFruitore, richiestaDelegata.getIdServizio(),
  4233.                                     propertiesReader.getRepositoryIntervalloScadenzaMessaggi(),
  4234.                                     infoServizio.getProfiloDiCollaborazione(), infoServizio.getConfermaRicezione(), infoServizio.getInoltro());
  4235.                         }else{
  4236.                             repositoryBuste.aggiornaBustaIntoOutBox(idMessageRequest, soggettoFruitore, richiestaDelegata.getIdServizio(),
  4237.                                     propertiesReader.getRepositoryIntervalloScadenzaMessaggi(),
  4238.                                     infoServizio.getProfiloDiCollaborazione(), infoServizio.getConfermaRicezione(), infoServizio.getInoltro());
  4239.                         }
  4240.                         repositoryBuste.impostaUtilizzoPdD(idMessageRequest,tipoMessaggio);
  4241.                     }catch(Exception e){
  4242.                         if(propertiesReader.isMsgGiaInProcessamentoUseLock()) {
  4243.                             String tipo = Costanti.OUTBOX;
  4244.                             if(localForward){
  4245.                                 tipo = Costanti.INBOX;  
  4246.                             }
  4247.                             String causa = "Aggiornamento dati busta con id ["+idMessageRequest+"] tipo["+tipo+"] non riuscito: "+e.getMessage();
  4248.                             try{
  4249.                                 GestoreMessaggi.acquireLock(msgRequest,TimerLock.newInstance(TipoLock._getLockGestioneRepositoryMessaggi()),msgDiag, causa, propertiesReader.getMsgGiaInProcessamentoAttesaAttiva(), propertiesReader.getMsgGiaInProcessamentoCheckInterval());
  4250.                                 // errore che puo' avvenire a causa del Timer delle Buste (vedi spiegazione in classe GestoreMessaggi.deleteMessageWithLock)
  4251.                                 // Si riesegue tutto il codice isRegistrata e update o create con il lock. Stavolta se avviene un errore non e' dovuto al timer.
  4252.                                 if (repositoryBuste.isRegistrata(idMessageRequest,tipoMessaggio)) {
  4253.                                     if(localForward){
  4254.                                         repositoryBuste.aggiornaBustaIntoInBox(idMessageRequest, soggettoFruitore, richiestaDelegata.getIdServizio(),
  4255.                                                 propertiesReader.getRepositoryIntervalloScadenzaMessaggi(),
  4256.                                                 infoServizio.getProfiloDiCollaborazione(), infoServizio.getConfermaRicezione(), infoServizio.getInoltro());
  4257.                                     }else{
  4258.                                         repositoryBuste.aggiornaBustaIntoOutBox(idMessageRequest, soggettoFruitore, richiestaDelegata.getIdServizio(),
  4259.                                                 propertiesReader.getRepositoryIntervalloScadenzaMessaggi(),
  4260.                                                 infoServizio.getProfiloDiCollaborazione(), infoServizio.getConfermaRicezione(), infoServizio.getInoltro());
  4261.                                     }
  4262.                                     repositoryBuste.impostaUtilizzoPdD(idMessageRequest,tipoMessaggio);
  4263.                                 }
  4264.                                 else {
  4265.                                     if(localForward){
  4266.                                         repositoryBuste.registraBustaIntoInBox(idMessageRequest, soggettoFruitore, richiestaDelegata.getIdServizio(),
  4267.                                                 propertiesReader.getRepositoryIntervalloScadenzaMessaggi(),
  4268.                                                 infoServizio.getProfiloDiCollaborazione(), infoServizio.getConfermaRicezione(), infoServizio.getInoltro());
  4269.                                     }
  4270.                                     else{
  4271.                                         repositoryBuste.registraBustaIntoOutBox(idMessageRequest,soggettoFruitore, richiestaDelegata.getIdServizio(),
  4272.                                                 propertiesReader.getRepositoryIntervalloScadenzaMessaggi(),
  4273.                                                 infoServizio.getProfiloDiCollaborazione(), infoServizio.getConfermaRicezione(), infoServizio.getInoltro());
  4274.                                     }
  4275.                                 }
  4276.                             }finally{
  4277.                                 try{
  4278.                                     GestoreMessaggi.releaseLock(msgRequest,TimerLock.newInstance(TipoLock._getLockGestioneRepositoryMessaggi()),msgDiag, causa);
  4279.                                 }catch(Exception eUnlock){
  4280.                                     // ignore
  4281.                                 }
  4282.                             }
  4283.                         }
  4284.                         else {
  4285.                             throw e;
  4286.                         }
  4287.                     }
  4288.                 } else {
  4289.                     if(localForward){
  4290.                         repositoryBuste.registraBustaIntoInBox(idMessageRequest, soggettoFruitore, richiestaDelegata.getIdServizio(),
  4291.                                 propertiesReader.getRepositoryIntervalloScadenzaMessaggi(),
  4292.                                 infoServizio.getProfiloDiCollaborazione(), infoServizio.getConfermaRicezione(), infoServizio.getInoltro());
  4293.                     }
  4294.                     else{
  4295.                         repositoryBuste.registraBustaIntoOutBox(idMessageRequest,soggettoFruitore, richiestaDelegata.getIdServizio(),
  4296.                                 propertiesReader.getRepositoryIntervalloScadenzaMessaggi(),
  4297.                                 infoServizio.getProfiloDiCollaborazione(), infoServizio.getConfermaRicezione(), infoServizio.getInoltro());
  4298.                     }
  4299.                 }
  4300.                 Integrazione infoIntegrazione = new Integrazione();
  4301.                 infoIntegrazione.setIdModuloInAttesa(this.msgContext.getIdModulo());
  4302.                 infoIntegrazione.setNomePorta(richiestaDelegata.getIdPortaDelegata().getNome());
  4303.                 infoIntegrazione.setServizioApplicativo(richiestaDelegata.getServizioApplicativo());
  4304.                 repositoryBuste.aggiornaInfoIntegrazione(idMessageRequest,tipoMessaggio,infoIntegrazione);
  4305.             }
  4306.         } catch (Exception e) {
  4307.             msgDiag.logErroreGenerico(e,"registrazioneAggiornamentoBusta");
  4308.             msgRequest.deleteMessageFromFileSystem(); // elimino richiesta salvata su fileSystem
  4309.             openspcoopstate.releaseResource();
  4310.             if (this.msgContext.isGestioneRisposta()) {
  4311.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,AbstractErrorGenerator.getIntegrationInternalError(pddContext),
  4312.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  4313.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO), e,null)));
  4314.             }
  4315.             return;
  4316.         }

  4317.        
  4318.        
  4319.        
  4320.        
  4321.        
  4322.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Invio messaggio al modulo di Imbustamento...");
  4323.        
  4324.        
  4325.        
  4326.        
  4327.        
  4328.        
  4329.         /* ------------ Spedizione a modulo Imbustamento/ConsegnaContenutiApplicativi ------------- */
  4330.         String nextModulo = org.openspcoop2.pdd.mdb.Imbustamento.ID_MODULO;
  4331.         if(localForward){
  4332.             msgDiag.addKeyword(CostantiPdD.KEY_PORTA_APPLICATIVA,pa.getNome());
  4333.             if(idServizio.getAzione()==null){
  4334.                 msgDiag.addKeyword(CostantiPdD.KEY_AZIONE_BUSTA_RICHIESTA,"non presente");
  4335.             }
  4336.             msgDiag.logPersonalizzato("localForward.logInfo");
  4337.             nextModulo = ConsegnaContenutiApplicativi.ID_MODULO;
  4338.         }else{
  4339.             msgDiag.mediumDebug("Invio messaggio al modulo di Imbustamento...");
  4340.         }
  4341.         try {
  4342.            
  4343.             // set tipologia di filtro duplicati
  4344.             if(proprietaPorta!=null && !proprietaPorta.isEmpty()) {
  4345.                 boolean filtroDuplicatiTestEnabled = CostantiProprieta.isFiltroDuplicatiTestEnabled(proprietaPorta, false); // filtro duplicati usato per test
  4346.                 if(filtroDuplicatiTestEnabled) {
  4347.                     pddContext.addObject(CostantiPdD.FILTRO_DUPLICATI_TEST, filtroDuplicatiTestEnabled);
  4348.                 }
  4349.             }
  4350.            
  4351.             // Creazione ImbustamentoMessage
  4352.             msgDiag.highDebug("Creazione ObjectMessage for send nell'infrastruttura.");

  4353.             Serializable msgJMS = null;
  4354.            
  4355.             if(localForward){
  4356.            
  4357.                 localForwardParameter.setRepositoryBuste(repositoryBuste);
  4358.                 String portaDelegataAttuale = localForwardParameter.getMsgDiag().getPorta();
  4359.                 localForwardParameter.getMsgDiag().updatePorta(TipoPdD.APPLICATIVA,localForwardParameter.getIdPortaApplicativaIndirizzata().getNome(), requestInfo);
  4360.                 localForwardEngine.updateLocalForwardParameter(localForwardParameter);
  4361.                
  4362.                 localForwardEngine.sendRequest(msgRequest);
  4363.                
  4364.                 // ripristino
  4365.                 localForwardParameter.getMsgDiag().updatePorta(TipoPdD.DELEGATA,portaDelegataAttuale, requestInfo);
  4366.                
  4367.             }
  4368.             else{
  4369.                 imbustamentoMSG.setRichiestaDelegata(richiestaDelegata);
  4370.                 imbustamentoMSG.setInfoServizio(infoServizio);
  4371.                 imbustamentoMSG.setOneWayVersione11(oneWayVersione11);
  4372.                 if (headerIntegrazioneRichiesta.getBusta() != null) {
  4373.                     // RiferimentoServizioCorrelato
  4374.                     String riferimentoServizioCorrelato = moduleManager.getIdCorrelazioneAsincrona(
  4375.                             headerIntegrazioneRichiesta.getBusta().getRiferimentoMessaggio(), headerIntegrazioneRichiesta.getBusta().getIdCollaborazione());
  4376.                     if (riferimentoServizioCorrelato != null) {
  4377.                         // Se presente riferimentoMessaggio utilizzo quello.
  4378.                         imbustamentoMSG.setRiferimentoServizioCorrelato(riferimentoServizioCorrelato);
  4379.                     }
  4380.                     // Collaborazione
  4381.                     if (headerIntegrazioneRichiesta.getBusta().getIdCollaborazione() != null)
  4382.                         imbustamentoMSG.setIdCollaborazione(headerIntegrazioneRichiesta.getBusta().getIdCollaborazione());
  4383.                     // RiferimentoMessaggio
  4384.                     if (headerIntegrazioneRichiesta.getBusta().getRiferimentoMessaggio() != null)
  4385.                         imbustamentoMSG.setIdRiferimentoMessaggio(headerIntegrazioneRichiesta.getBusta().getRiferimentoMessaggio());
  4386.                 }
  4387.                 // Implemnentazione della porta erogatrice
  4388.                 imbustamentoMSG.setImplementazionePdDSoggettoMittente(implementazionePdDMittente);
  4389.                 imbustamentoMSG.setImplementazionePdDSoggettoDestinatario(implementazionePdDDestinatario);
  4390.                 // Indirizzo soggetti
  4391.                 imbustamentoMSG.setIndirizzoSoggettoMittente(indirizzoFruitore);
  4392.                 imbustamentoMSG.setIndirizzoSoggettoDestinatario(indirizzoErogatore);
  4393.                 // PddContext
  4394.                 imbustamentoMSG.setPddContext(inRequestContext.getPddContext());
  4395.            
  4396.                 msgJMS = imbustamentoMSG;
  4397.             }

  4398.             if (!portaStateless) {
  4399.                 logDebug(logCore, RicezioneContenutiApplicativi.ID_MODULO+ " :eseguo send verso "+nextModulo+"...");
  4400.                
  4401.                 String classTypeNodeSender = null;
  4402.                 INodeSender nodeSender = null;
  4403.                 try {
  4404.                     classTypeNodeSender = className.getNodeSender(propertiesReader.getNodeSender());
  4405.                     nodeSender = (INodeSender) loader.newInstance(classTypeNodeSender);
  4406.                 } catch (Exception e) {
  4407.                     throw new Exception(
  4408.                             "Riscontrato errore durante il caricamento della classe ["+ classTypeNodeSender
  4409.                                     + "] da utilizzare per la spedizione nell'infrastruttura: " + e.getMessage());
  4410.                 }
  4411.                
  4412.                 // send JMS solo STATEFUL
  4413.                 nodeSender.send(msgJMS,nextModulo, msgDiag,
  4414.                         identitaPdD, this.msgContext.getIdModulo(), idMessageRequest, msgRequest);
  4415.                 logDebug(logCore, RicezioneContenutiApplicativi.ID_MODULO+ " :send verso "+nextModulo+" effettuata");
  4416.             }

  4417.         } catch (Exception e) {
  4418.             logError(logCore, "Spedizione->"+nextModulo+" non riuscita",e);
  4419.             msgDiag.logErroreGenerico(e,"GenericLib.nodeSender.send("+nextModulo+")");
  4420.             msgRequest.deleteMessageFromFileSystem(); // elimino richiesta salvata precedentemente
  4421.             openspcoopstate.releaseResource();
  4422.             if (this.msgContext.isGestioneRisposta()) {
  4423.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,AbstractErrorGenerator.getIntegrationInternalError(pddContext),
  4424.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  4425.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_512_SEND),e,null)));
  4426.             }
  4427.             return;
  4428.         }

  4429.        
  4430.        
  4431.        
  4432.        
  4433.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Commit delle operazioni per la gestione della richiesta...");
  4434.        
  4435.        
  4436.        
  4437.        
  4438.         /* ------------ Commit/Rilascia connessione al DB ------------- */
  4439.         msgDiag.mediumDebug("Commit delle operazioni per la gestione della richiesta...");
  4440.         try {
  4441.             // Commit
  4442.             openspcoopstate.commit();
  4443.             logDebug(logCore, RicezioneContenutiApplicativi.ID_MODULO+ " :RicezioneContenutiApplicativi commit eseguito");
  4444.         } catch (Exception e) {
  4445.             msgDiag.logErroreGenerico(e,"openspcoopstate.commit");
  4446.             msgRequest.deleteMessageFromFileSystem(); // elimino richiesta salvata precedentemente
  4447.             openspcoopstate.releaseResource();
  4448.             if (this.msgContext.isGestioneRisposta()) {
  4449.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,AbstractErrorGenerator.getIntegrationInternalError(pddContext),
  4450.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  4451.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_506_COMMIT_JDBC),e,null)));
  4452.             }
  4453.             return;
  4454.         }

  4455.         if (!portaStateless) {
  4456.             // Aggiornamento cache messaggio
  4457.             if (msgRequest != null)
  4458.                 msgRequest.addMessaggiIntoCache_readFromTable(RicezioneContenutiApplicativi.ID_MODULO, "richiesta");
  4459.             // Aggiornamento cache proprietario messaggio
  4460.             if (msgRequest != null)
  4461.                 msgRequest.addProprietariIntoCache_readFromTable(RicezioneContenutiApplicativi.ID_MODULO, "richiesta",null, false);

  4462.             // Rilascia connessione al DB
  4463.             msgDiag.mediumDebug("Commit delle operazioni per la gestione della richiesta effettuato, rilascio della connessione...");
  4464.             openspcoopstate.releaseResource();
  4465.         }

  4466.        
  4467.        
  4468.        
  4469.        
  4470.    
  4471.        
  4472.        
  4473.        
  4474.         /* ---------- Parametri Gestione risposta ------------- */
  4475.         RicezioneContenutiApplicativiGestioneRisposta parametriGestioneRisposta =
  4476.             new RicezioneContenutiApplicativiGestioneRisposta();

  4477.         parametriGestioneRisposta.setOpenspcoopstate(openspcoopstate);
  4478.        
  4479.         parametriGestioneRisposta.setRegistroServiziReader(registroServiziReader);
  4480.         parametriGestioneRisposta.setConfigurazionePdDReader(configurazionePdDReader);
  4481.         parametriGestioneRisposta.setMsgDiag(msgDiag);
  4482.         parametriGestioneRisposta.setLogCore(logCore);
  4483.         parametriGestioneRisposta.setPropertiesReader(propertiesReader);
  4484.        
  4485.         parametriGestioneRisposta.setIdentitaPdD(identitaPdD);
  4486.         parametriGestioneRisposta.setIdMessageRequest(idMessageRequest);
  4487.        
  4488.         parametriGestioneRisposta.setHeaderIntegrazioneRichiesta(headerIntegrazioneRichiesta);
  4489.         parametriGestioneRisposta.setHeaderIntegrazioneRisposta(headerIntegrazioneRisposta);
  4490.         parametriGestioneRisposta.setTipiIntegrazionePD(tipiIntegrazionePD);
  4491.        
  4492.         parametriGestioneRisposta.setProprietaErroreAppl(proprietaErroreAppl);
  4493.         parametriGestioneRisposta.setServizioApplicativo(servizioApplicativo);
  4494.        
  4495.         parametriGestioneRisposta.setMsgRequest(msgRequest);
  4496.         parametriGestioneRisposta.setRepositoryBuste(repositoryBuste);
  4497.        
  4498.         parametriGestioneRisposta.setPortaStateless(portaStateless);
  4499.         parametriGestioneRisposta.setOneWayVers11(oneWayVersione11);
  4500.         parametriGestioneRisposta.setRichiestaAsincronaSimmetricaStateless(richiestaAsincronaSimmetricaStateless);

  4501.         parametriGestioneRisposta.setPortaDelegata(portaDelegata);
  4502.         parametriGestioneRisposta.setSoggettoMittente(soggettoFruitore);
  4503.         parametriGestioneRisposta.setIdServizio(idServizio);
  4504.        
  4505.         parametriGestioneRisposta.setLocalForward(localForward);
  4506.        
  4507.         parametriGestioneRisposta.setPddContext(inRequestContext.getPddContext());
  4508.         parametriGestioneRisposta.setProtocolFactory(protocolFactory);
  4509.        
  4510.         parametriGestioneRisposta.setBustaRichiesta(bustaRichiesta);
  4511.        
  4512.        

  4513.        
  4514.        
  4515.        
  4516.         /*
  4517.          * ---------------- STATELESS OR Stateful v11 -------------
  4518.          */
  4519.         if (portaStateless) {
  4520.            
  4521.             //  Durante le invocazioni non deve essere utilizzata la connessione al database
  4522.             ((OpenSPCoopStateless)openspcoopstate).setUseConnection(false);
  4523.             boolean result = comportamentoStateless(parametriGestioneRisposta, imbustamentoMSG);
  4524.             if (!result){
  4525.                 openspcoopstate.releaseResource();
  4526.                 return;
  4527.             }else{
  4528.                 // ripristino utilizzo connessione al database
  4529.                 ((OpenSPCoopStateless)openspcoopstate).setUseConnection(true);
  4530.             }
  4531.         }

  4532.        
  4533.         // refresh risorse con nuovi stati
  4534.         registroServiziReader = registroServiziReader.refreshState(openspcoopstate.getStatoRichiesta(),openspcoopstate.getStatoRisposta());
  4535.         configurazionePdDReader = configurazionePdDReader.refreshState(registroServiziReader);
  4536.         msgDiag.updateState(configurazionePdDReader);
  4537.        
  4538.        
  4539.        
  4540.         Utilities.printFreeMemory("RicezioneContenutiApplicativi - Gestione risposta...");
  4541.        
  4542.        
  4543.         /* ------------ GestioneRisposta non effettuata ------------- */
  4544.         msgDiag.mediumDebug("Gestione risposta...");
  4545.         if (this.msgContext.isGestioneRisposta() == false) {
  4546.             if(portaStateless)
  4547.                 openspcoopstate.releaseResource();
  4548.             return;
  4549.         }

  4550.         gestioneRisposta(parametriGestioneRisposta);
  4551.         msgDiag.mediumDebug("Lavoro Terminato.");

  4552.         }finally{ // try vedi  #try-finally-openspcoopstate#
  4553.             try{
  4554.                 if(openspcoopstate!=null){
  4555.                     openspcoopstate.forceFinallyReleaseResource();
  4556.                 }
  4557.             }catch(Throwable e){
  4558.                 if(msgDiag!=null){
  4559.                     try{
  4560.                         msgDiag.logErroreGenerico(e, "Rilascio risorsa");
  4561.                     }catch(Throwable eLog){
  4562.                         logError(logCore, "Diagnostico errore per Rilascio risorsa: "+eLog.getMessage(),eLog);
  4563.                     }
  4564.                 }
  4565.                 else{
  4566.                     logError(logCore, "Rilascio risorsa: "+e.getMessage(),e);
  4567.                 }
  4568.             }
  4569.         }
  4570.     }

  4571.    
  4572.     private void setCredenziali(Credenziali credenziali,MsgDiagnostico msgDiag){
  4573.         if (credenziali != null) {
  4574.             if (credenziali.getUsername() != null){
  4575.                 msgDiag.setServizioApplicativo("username("+ credenziali.getUsername() + ")");
  4576.             }else if (credenziali.getSubject() != null){
  4577.                 msgDiag.setServizioApplicativo("subject("+ credenziali.getSubject() + ")");
  4578.             }else if (credenziali.getPrincipal() != null){
  4579.                 msgDiag.setServizioApplicativo("principal("+ credenziali.getPrincipal() + ")");
  4580.             }
  4581.             else{
  4582.                 msgDiag.setServizioApplicativo(null);
  4583.             }
  4584.         }
  4585.        
  4586.         String credenzialiFornite = "";
  4587.         if(credenziali!=null){
  4588.             credenzialiFornite = credenziali.toString();
  4589.         }
  4590.         msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI_SA_FRUITORE, credenzialiFornite);
  4591.     }
  4592.    
  4593.    
  4594.     /*
  4595.      * Gestione stateless
  4596.      */
  4597.     private boolean comportamentoStateless(RicezioneContenutiApplicativiGestioneRisposta parametriGestioneRisposta,
  4598.             ImbustamentoMessage imbustamentoMSG)  {

  4599.        
  4600.         /* ------- Lettura parametri ---------- */
  4601.        
  4602.         EsitoLib esito;
  4603.        
  4604.         OpenSPCoopStateless openspcoopstate = (OpenSPCoopStateless) parametriGestioneRisposta.getOpenspcoopstate();
  4605.        
  4606.         ConfigurazionePdDManager configurazionePdDReader = parametriGestioneRisposta.getConfigurazionePdDReader();
  4607.         RegistroServiziManager registroServiziReader = parametriGestioneRisposta.getRegistroServiziReader();
  4608.         MsgDiagnostico msgDiag = parametriGestioneRisposta.getMsgDiag();
  4609.         Logger logCore = parametriGestioneRisposta.getLogCore();
  4610.         OpenSPCoop2Properties propertiesReader = parametriGestioneRisposta.getPropertiesReader();
  4611.        
  4612.         //SOAPVersion versioneSoap = (SOAPVersion) this.msgContext.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.SOAP_VERSION);
  4613.        
  4614.         String idMessageRequest = parametriGestioneRisposta.getIdMessageRequest();
  4615.        
  4616.         //ProprietaErroreApplicativo proprietaErroreAppl = parametriGestioneRisposta.getProprietaErroreAppl();
  4617.        
  4618.         GestoreMessaggi msgRequest = parametriGestioneRisposta.getMsgRequest();
  4619.        
  4620.         //IDSoggetto identitaPdD = parametriGestioneRisposta.getIdentitaPdD();
  4621.        
  4622.         parametriGestioneRisposta.setPortaStateless(true);
  4623.        
  4624.         boolean rinegoziamentoConnessione =
  4625.             propertiesReader.isRinegoziamentoConnessione(this.msgContext.getProtocol().getProfiloCollaborazione()) && (!parametriGestioneRisposta.isOneWayVers11());

  4626.         boolean localForward = parametriGestioneRisposta.isLocalForward();
  4627.        
  4628.         // ID Transazione
  4629.         @SuppressWarnings("unused")
  4630.         String idTransazione = PdDContext.getValue(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE, imbustamentoMSG.getPddContext());
  4631.        
  4632.         PdDContext pddContext = parametriGestioneRisposta.getPddContext();
  4633.        
  4634.         if(localForward){
  4635.            
  4636.            
  4637.             // E' RicezioneContenutiApplicativi se siamo in oneway11 con presa in carico
  4638.             if( ConsegnaContenutiApplicativi.ID_MODULO.equals( ((OpenSPCoopStateless)openspcoopstate).getDestinatarioRequestMsgLib() )
  4639.                     &&
  4640.                  ((OpenSPCoopStateless)openspcoopstate).getDestinatarioResponseMsgLib()==null ){
  4641.                        
  4642.                
  4643.                
  4644.                 /* ------------ Rilascio risorsa se e' presente rinegoziamento delle risorse ------------------ */
  4645.                 // Rinegozio la connessione SOLO se siamo in oneway o sincrono stateless puro (non oneway11)
  4646.                 if( rinegoziamentoConnessione ){
  4647.                     msgDiag.highDebug("ConsegnaContenutiApplicativi stateless (commit) ...");
  4648.                     openspcoopstate.setUseConnection(true);
  4649.                     try{
  4650.                         openspcoopstate.commit();
  4651.                     }catch(Exception e){
  4652.                         // ignore
  4653.                     }
  4654.                     openspcoopstate.releaseResource();
  4655.                     openspcoopstate.setUseConnection(false);
  4656.                 }
  4657.                
  4658.                
  4659.                
  4660.                 /*
  4661.                  * ---------------------- CONSEGNA CONTENUTI APPLICATIVI ------------------
  4662.                  */
  4663.        
  4664.                 ConsegnaContenutiApplicativi consegnaContenutiLib = null;
  4665.                 try {
  4666.                     consegnaContenutiLib = new ConsegnaContenutiApplicativi(logCore);
  4667.                     esito = consegnaContenutiLib.onMessage(openspcoopstate);
  4668.                     if(esito.getStatoInvocazione()==EsitoLib.ERRORE_NON_GESTITO){
  4669.                         if(esito.getErroreNonGestito()!=null)
  4670.                             throw esito.getErroreNonGestito();
  4671.                         else
  4672.                             throw new Exception("Errore non gestito");
  4673.                     }
  4674.                 } catch (Throwable e) {
  4675.                     msgDiag.logErroreGenerico(e,"Stateless.ConsegnaContenutiApplicativi");
  4676.                     logError(logCore, "Errore Generale durante la gestione stateless: "+e.getMessage(),e);
  4677.                     msgRequest.deleteMessageFromFileSystem(); // elimino richiesta salvata precedentemente
  4678.                     openspcoopstate.setUseConnection(true);
  4679.                     openspcoopstate.releaseResource();
  4680.                     if (this.msgContext.isGestioneRisposta()) {
  4681.                         this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,AbstractErrorGenerator.getIntegrationInternalError(pddContext),
  4682.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreIntegrazione(),e,null)));
  4683.                     }
  4684.                     return false;
  4685.                 }
  4686.                
  4687.                 if (esito.getStatoInvocazione() != EsitoLib.OK) {
  4688.                     // ripristino utilizzo connessione al database
  4689.                     openspcoopstate.setUseConnection(true);
  4690.                     gestioneRisposta(parametriGestioneRisposta);
  4691.                     return false;
  4692.                 }
  4693.                
  4694.             }
  4695.    

  4696.            
  4697.         }
  4698.        
  4699.         else{
  4700.             /*------------------------------- IMBUSTAMENTO -------------------------------------------*/
  4701.             msgDiag.highDebug("Imbustamento stateless ...");
  4702.             org.openspcoop2.pdd.mdb.Imbustamento imbustamentoLib = null;
  4703.             openspcoopstate.setMessageLib(imbustamentoMSG);
  4704.             openspcoopstate.setIDMessaggioSessione(idMessageRequest);
  4705.             try {
  4706.                 imbustamentoLib = new org.openspcoop2.pdd.mdb.Imbustamento(logCore);
  4707.                 msgDiag.highDebug("Imbustamento stateless (invoco) ...");
  4708.                 esito = imbustamentoLib.onMessage(openspcoopstate);
  4709.                 msgDiag.highDebug("Imbustamento stateless (analizzo esito) ...");
  4710.                 if(esito.getStatoInvocazione()==EsitoLib.ERRORE_NON_GESTITO){
  4711.                     if(esito.getErroreNonGestito()!=null)
  4712.                         throw esito.getErroreNonGestito();
  4713.                     else
  4714.                         throw new Exception("Errore non gestito");
  4715.                 }
  4716.             } catch (Throwable e) {
  4717.                 msgDiag.logErroreGenerico(e,"Stateless.Imbustamento");
  4718.                 logError(logCore, "Errore Generale durante la gestione stateless: "+e.getMessage(),e);
  4719.                 msgRequest.deleteMessageFromFileSystem(); // elimino richiesta salvata precedentemente
  4720.                 openspcoopstate.setUseConnection(true);
  4721.                 openspcoopstate.releaseResource();
  4722.                 if (this.msgContext.isGestioneRisposta()) {
  4723.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,AbstractErrorGenerator.getIntegrationInternalError(pddContext),
  4724.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreIntegrazione(),e,null)));
  4725.                 }
  4726.                 return false;
  4727.             }
  4728.    
  4729.             // Se la chiamata alla libreria imbustamento non ha dato errori procedo con le altre librerie
  4730.             // Altrimenti faccio gestire l'errore prodotto dalla libreria
  4731.             if (esito.getStatoInvocazione() != EsitoLib.OK) {
  4732.                 // ripristino utilizzo connessione al database
  4733.                 openspcoopstate.setUseConnection(true);
  4734.                 gestioneRisposta(parametriGestioneRisposta);
  4735.                 msgDiag.highDebug("Imbustamento stateless (terminato:false)");
  4736.                 return false;
  4737.             }
  4738.    
  4739.             // Gestione oneway versione 11
  4740.             if (openspcoopstate.getDestinatarioResponseMsgLib() != null
  4741.                     && openspcoopstate.getDestinatarioResponseMsgLib().startsWith(RicezioneContenutiApplicativi.ID_MODULO)
  4742.                     && propertiesReader.isGestioneOnewayStateful_1_1()){
  4743.                 msgDiag.highDebug("Imbustamento stateless (terminato:true)");
  4744.                 return true;
  4745.             }
  4746.    
  4747.             /* ------------ Rilascio risorsa se e' presente rinegoziamento delle risorse ------------------ */
  4748.             // Rinegozio la connessione SOLO se siamo in oneway o sincrono stateless puro (non oneway11)
  4749.             if( rinegoziamentoConnessione ){
  4750.                 msgDiag.highDebug("Imbustamento stateless (commit) ...");
  4751.                 openspcoopstate.setUseConnection(true);
  4752.                 try{
  4753.                     openspcoopstate.commit();
  4754.                 }catch(Exception e){
  4755.                     // ignore
  4756.                 }
  4757.                 openspcoopstate.releaseResource();
  4758.                 openspcoopstate.setUseConnection(false);
  4759.             }
  4760.            
  4761.             msgDiag.highDebug("Imbustamento stateless terminato");
  4762.            
  4763.            
  4764.            
  4765.            
  4766.             /*
  4767.              * ---------------------- INOLTRO BUSTE ------------------
  4768.              */
  4769.    
  4770.             msgDiag.highDebug("InoltroBuste stateless ...");
  4771.             InoltroBuste inoltroBusteLib = null;
  4772.             try {
  4773.                 inoltroBusteLib = new InoltroBuste(logCore);
  4774.                 msgDiag.highDebug("InoltroBuste stateless (invoco) ...");
  4775.                 esito = inoltroBusteLib.onMessage(openspcoopstate);
  4776.                 msgDiag.highDebug("InoltroBuste stateless (analizzo esito) ...");
  4777.                 if(esito.getStatoInvocazione()==EsitoLib.ERRORE_NON_GESTITO){
  4778.                     if(esito.getErroreNonGestito()!=null)
  4779.                         throw esito.getErroreNonGestito();
  4780.                     else
  4781.                         throw new Exception("Errore non gestito");
  4782.                 }
  4783.             } catch (Throwable e) {
  4784.                 msgDiag.logErroreGenerico(e,"Stateless.InoltroBuste");
  4785.                 logError(logCore, "Errore Generale durante la gestione stateless: "+e.getMessage(),e);
  4786.                 msgRequest.deleteMessageFromFileSystem(); // elimino richiesta salvata precedentemente
  4787.                 openspcoopstate.setUseConnection(true);
  4788.                 openspcoopstate.releaseResource();
  4789.                 if (this.msgContext.isGestioneRisposta()) {
  4790.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,AbstractErrorGenerator.getIntegrationInternalError(pddContext),
  4791.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreIntegrazione(),e,null)));
  4792.                 }
  4793.                 return false;
  4794.             }
  4795.            
  4796.             if (esito.getStatoInvocazione() != EsitoLib.OK) {
  4797.                 // ripristino utilizzo connessione al database
  4798.                 openspcoopstate.setUseConnection(true);
  4799.                 gestioneRisposta(parametriGestioneRisposta);
  4800.                 msgDiag.highDebug("InoltroBuste stateless (terminato:false)");
  4801.                 return false;
  4802.             }
  4803.    
  4804.             // Gestione oneway versione 11
  4805.             if (openspcoopstate.getDestinatarioResponseMsgLib()!=null &&
  4806.                     openspcoopstate.getDestinatarioResponseMsgLib().startsWith(
  4807.                     RicezioneContenutiApplicativi.ID_MODULO)){
  4808.                 msgDiag.highDebug("InoltroBuste stateless (terminato:true)");
  4809.                 return true;
  4810.             }
  4811.            
  4812.             msgDiag.highDebug("InoltroBuste stateless terminato");
  4813.            
  4814.            
  4815.            
  4816.            
  4817.    
  4818.             /*--------------- SBUSTAMENTO RISPOSTE ---------------- */
  4819.    
  4820.             msgDiag.highDebug("SbustamentoRisposte stateless ...");
  4821.             SbustamentoRisposte sbustamentoRisposteLib = null;
  4822.             boolean erroreSbustamentoRisposta = false;
  4823.             try {
  4824.                 sbustamentoRisposteLib = new SbustamentoRisposte(logCore);
  4825.                 /* Verifico che non abbia rilasciato la connessione, se si la riprendo */
  4826.                 if( rinegoziamentoConnessione && openspcoopstate.resourceReleased()){
  4827.                     /* per default disabilitato
  4828.                     msgDiag.highDebug("SbustamentoRisposte stateless (initResourceDB) ...");
  4829.                     openspcoopstate.setUseConnection(true);
  4830.                     openspcoopstate.initResource(parametriGestioneRisposta.getIdentitaPdD(), SbustamentoRisposte.ID_MODULO, idTransazione);
  4831.                     openspcoopstate.setUseConnection(false);
  4832.                      */
  4833.                     // update states
  4834.                     registroServiziReader = registroServiziReader.refreshState(openspcoopstate.getStatoRichiesta(),openspcoopstate.getStatoRisposta());
  4835.                     configurazionePdDReader = configurazionePdDReader.refreshState(registroServiziReader);
  4836.                     msgDiag.updateState(configurazionePdDReader);
  4837.                 }
  4838.                 msgDiag.highDebug("SbustamentoRisposte stateless (invoco) ...");
  4839.                 esito = sbustamentoRisposteLib.onMessage(openspcoopstate);
  4840.                 msgDiag.highDebug("SbustamentoRisposte stateless (analizzo esito) ...");
  4841.                 if(esito.getStatoInvocazione()==EsitoLib.ERRORE_NON_GESTITO){
  4842.                     if(esito.getErroreNonGestito()!=null)
  4843.                         throw esito.getErroreNonGestito();
  4844.                     else
  4845.                         throw new Exception("Errore non gestito");
  4846.                 }
  4847.             } catch (Throwable e) {
  4848.                 erroreSbustamentoRisposta = true;
  4849.                 msgDiag.logErroreGenerico(e,"Stateless.SbustamentoRisposte");
  4850.                 logError(logCore, "Errore Generale durante la gestione stateless: "+e.getMessage(),e);
  4851.                 msgRequest.deleteMessageFromFileSystem(); // elimino richiesta salvata precedentemente
  4852.                 openspcoopstate.setUseConnection(true);
  4853.                 openspcoopstate.releaseResource();
  4854.                 if (this.msgContext.isGestioneRisposta()) {
  4855.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,AbstractErrorGenerator.getIntegrationInternalError(pddContext),
  4856.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreIntegrazione(),e,null)));
  4857.                 }
  4858.                 return false;
  4859.             }finally{
  4860.                 /* Se devo rinegoziare la connessione, la rilascio */
  4861.                 if( (rinegoziamentoConnessione) && (erroreSbustamentoRisposta==false) ){
  4862.                     msgDiag.highDebug("SbustamentoRisposte stateless (commit) ...");
  4863.                     openspcoopstate.setUseConnection(true);
  4864.                     try{
  4865.                         openspcoopstate.commit();
  4866.                     }catch(Exception e){
  4867.                         // ignore
  4868.                     }
  4869.                     openspcoopstate.releaseResource();
  4870.                     openspcoopstate.setUseConnection(false);
  4871.                 }
  4872.             }
  4873.    
  4874.             if (esito.getStatoInvocazione() != EsitoLib.OK) {
  4875.                 // ripristino utilizzo connessione al database
  4876.                 openspcoopstate.setUseConnection(true);
  4877.                 gestioneRisposta(parametriGestioneRisposta);
  4878.                 msgDiag.highDebug("SbustamentoRisposte stateless (terminato:false)");
  4879.                 return false;
  4880.             }

  4881.             msgDiag.highDebug("SbustamentoRisposte stateless terminato");
  4882.            
  4883.         }
  4884.        
  4885.        

  4886.         return true;
  4887.     }

  4888.    
  4889.    
  4890.    
  4891.    
  4892.    
  4893.    
  4894.    
  4895.    
  4896.    
  4897.    
  4898.     /*--------------------------------------- GESTIONE RISPOSTA --------------------------- */

  4899.     /* Gestisce le risposte applicative di Ok o di errore */
  4900.     private void gestioneRisposta(RicezioneContenutiApplicativiGestioneRisposta parametriGestioneRisposta){
  4901.            
  4902.            
  4903.         /* ------- Lettura parametri ---------- */
  4904.         IOpenSPCoopState openspcoopstate = parametriGestioneRisposta.getOpenspcoopstate();
  4905.        
  4906.         MsgDiagnostico msgDiag = parametriGestioneRisposta.getMsgDiag();
  4907.         Logger logCore = parametriGestioneRisposta.getLogCore();
  4908.         OpenSPCoop2Properties propertiesReader = parametriGestioneRisposta.getPropertiesReader();
  4909.        
  4910.         IDSoggetto identitaPdD = parametriGestioneRisposta.getIdentitaPdD();
  4911.         String idMessageRequest = parametriGestioneRisposta.getIdMessageRequest();
  4912.        
  4913.         //ProprietaErroreApplicativo proprietaErroreAppl = parametriGestioneRisposta.getProprietaErroreAppl();
  4914.         String servizioApplicativo = parametriGestioneRisposta.getServizioApplicativo();
  4915.        
  4916.         HeaderIntegrazione headerIntegrazioneRichiesta = parametriGestioneRisposta.getHeaderIntegrazioneRichiesta();
  4917.         HeaderIntegrazione headerIntegrazioneRisposta = parametriGestioneRisposta.getHeaderIntegrazioneRisposta();
  4918.         String[] tipiIntegrazionePD = parametriGestioneRisposta.getTipiIntegrazionePD();
  4919.        
  4920.         GestoreMessaggi msgRequest = parametriGestioneRisposta.getMsgRequest();
  4921.         //RepositoryBuste repositoryBuste = parametriGestioneRisposta.getRepositoryBuste();
  4922.        
  4923.         boolean portaStateless = parametriGestioneRisposta.isPortaStateless();
  4924.         boolean oneWayVers11 = parametriGestioneRisposta.isOneWayVers11();
  4925.         boolean richiestaAsincronaSimmetricaStateless = parametriGestioneRisposta.isRichiestaAsincronaSimmetricaStateless();
  4926.        
  4927.         PdDContext pddContext = parametriGestioneRisposta.getPddContext();
  4928.         String idTransazione = PdDContext.getValue(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE, pddContext);
  4929.         RequestInfo requestInfo = (RequestInfo) pddContext.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  4930.        
  4931.         IProtocolFactory<?> protocolFactory = parametriGestioneRisposta.getProtocolFactory();
  4932.        
  4933.         Busta bustaRichiesta = parametriGestioneRisposta.getBustaRichiesta();
  4934.        
  4935.         Loader loader = Loader.getInstance();
  4936.         PddPluginLoader pluginLoader = PddPluginLoader.getInstance();
  4937.        
  4938.         boolean errorOccurs_setResponse = false;

  4939.         /* ------------ GestioneRisposta ------------- */
  4940.         String idMessageResponse = null;
  4941.         String idCollaborazioneResponse = null;
  4942.         ProfiloDiCollaborazione profiloCollaborazione = null;
  4943.         String profiloCollaborazioneValue = null;
  4944.         OpenSPCoop2Message responseMessage = null;
  4945.         String idCorrelazioneApplicativaRisposta = null;
  4946.         //org.openspcoop.pdd.core.TempiAttraversamentoPDD tempiAttraversamentoGestioneMessaggi = null;
  4947.         //org.openspcoop.pdd.core.DimensioneMessaggiAttraversamentoPdD dimensioneMessaggiAttraversamentoGestioneMessaggi = null;
  4948.         try {

  4949.             if (portaStateless || oneWayVers11) {
  4950.                
  4951.                 // Gestione stateless
  4952.                
  4953.                 RicezioneContenutiApplicativiMessage ricezioneContenutiApplicativiMSG =
  4954.                     (RicezioneContenutiApplicativiMessage) ((OpenSPCoopStateless) openspcoopstate).getMessageLib();
  4955.                 idMessageResponse = ricezioneContenutiApplicativiMSG.getIdBustaRisposta();
  4956.                 idCollaborazioneResponse = ricezioneContenutiApplicativiMSG.getIdCollaborazione();
  4957.                 profiloCollaborazione = ricezioneContenutiApplicativiMSG.getProfiloCollaborazione();
  4958.                 profiloCollaborazioneValue = ricezioneContenutiApplicativiMSG.getProfiloCollaborazioneValue();

  4959.                 responseMessage = ((OpenSPCoopStateless) openspcoopstate).getRispostaMsg();
  4960.                
  4961.                 idCorrelazioneApplicativaRisposta = ((OpenSPCoopStateless) openspcoopstate).getIDCorrelazioneApplicativaRisposta();
  4962.                
  4963.                 if(ProfiloDiCollaborazione.ONEWAY.equals(profiloCollaborazione)==false){
  4964.                     this.msgContext.getProtocol().setIdRisposta(idMessageResponse);
  4965.                 }
  4966.                 this.msgContext.getProtocol().setCollaborazione(idCollaborazioneResponse);

  4967.                 //tempiAttraversamentoGestioneMessaggi =
  4968.                 //  ((OpenSPCoopStateless) openspcoopstate).getTempiAttraversamentoPDD();
  4969.                 //dimensioneMessaggiAttraversamentoGestioneMessaggi =
  4970.                 //  ((OpenSPCoopStateless) openspcoopstate).getDimensioneMessaggiAttraversamentoPDD();

  4971.                 // Aggiornamento Informazioni Protocollo
  4972.                 msgDiag.setIdMessaggioRisposta(idMessageResponse);
  4973.                 msgDiag.addKeyword(CostantiPdD.KEY_ID_MESSAGGIO_RISPOSTA, idMessageResponse);
  4974.             }

  4975.             else {

  4976.                 // Gestione stateful
  4977.                
  4978.                 try {
  4979.                     responseMessage = MessageUtilities.buildEmptyMessage(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),
  4980.                             requestInfo.getIntegrationRequestMessageType(), MessageRole.RESPONSE);

  4981.                     String classType = null;
  4982.                     INodeReceiver nodeReceiver = null;
  4983.                     try {
  4984.                         classType = ClassNameProperties.getInstance().getNodeReceiver(propertiesReader.getNodeReceiver());
  4985.                         nodeReceiver = (INodeReceiver) loader.newInstance(classType);
  4986.                     } catch (Exception e) {
  4987.                         throw new Exception(
  4988.                                 "Riscontrato errore durante il caricamento della classe ["+ classType
  4989.                                         + "] da utilizzare per la ricezione dall'infrastruttura: "+ e.getMessage());
  4990.                     }
  4991.                    
  4992.                     msgDiag.mediumDebug("Attesa/lettura risposta...");
  4993.                     RicezioneContenutiApplicativiMessage ricezioneContenutiApplicativiMSG =
  4994.                         (RicezioneContenutiApplicativiMessage) nodeReceiver.receive(
  4995.                                 msgDiag, identitaPdD,this.msgContext.getIdModulo(),idMessageRequest,
  4996.                                     propertiesReader.getNodeReceiverTimeoutRicezioneContenutiApplicativi(),
  4997.                                     propertiesReader.getNodeReceiverCheckInterval());
  4998.                     idMessageResponse = ricezioneContenutiApplicativiMSG.getIdBustaRisposta();
  4999.                     idCollaborazioneResponse = ricezioneContenutiApplicativiMSG.getIdCollaborazione();
  5000.                     profiloCollaborazione = ricezioneContenutiApplicativiMSG.getProfiloCollaborazione();
  5001.                     profiloCollaborazioneValue = ricezioneContenutiApplicativiMSG.getProfiloCollaborazioneValue();

  5002.                     // aggiorno pddContext
  5003.                     pddContext = ricezioneContenutiApplicativiMSG.getPddContext();
  5004.                     if(pddContext!=null){
  5005.                         List<MapKey<String>> enumPddContext = pddContext.keys();
  5006.                         if(enumPddContext!=null && !enumPddContext.isEmpty()) {
  5007.                             for (MapKey<String> key : enumPddContext) {
  5008.                                 //System.out.println("AGGIORNO KEY CONTENTUI ["+key+"]");
  5009.                                 this.msgContext.getPddContext().addObject(key, pddContext.getObject(key));
  5010.                             }
  5011.                         }
  5012.                     }
  5013.                    
  5014.                     if(ProfiloDiCollaborazione.ONEWAY.equals(profiloCollaborazione)==false){
  5015.                         this.msgContext.getProtocol().setIdRisposta(idMessageResponse);
  5016.                     }
  5017.                     this.msgContext.getProtocol().setCollaborazione(idCollaborazioneResponse);

  5018.                 } catch (Exception e) {

  5019.                     logError(logCore, "Gestione risposta ("+ this.msgContext.getIdModulo()+ ") con errore", e);
  5020.                     msgDiag.logErroreGenerico(e,"GestioneRispostaErroreGenerale");
  5021.                    
  5022.                     // per la gestione del timeout ho bisogno di una connessione al database
  5023.                     // In caso di Timeout elimino messaggi di richiesta ancora in processamento.
  5024.                     if (e instanceof NodeTimeoutException) {

  5025.                         // Get Connessione al DB
  5026.                         try {
  5027.                             openspcoopstate.updateResource(idTransazione);
  5028.                         } catch (Exception eDB) {
  5029.                             msgDiag.logErroreGenerico(e,"openspcoopstate.updateResource()");
  5030.                             this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_RESPONSE_ERROR,
  5031.                                     ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  5032.                                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_505_GET_DB_CONNECTION),eDB,
  5033.                                     ((responseMessage!=null && responseMessage.getParseException()!=null)?responseMessage.getParseException():null))));
  5034.                             return;
  5035.                         }

  5036.                         // Eliminazione msg di richiesta
  5037.                         try {
  5038.                             msgDiag.logPersonalizzato("timeoutRicezioneRisposta");
  5039.                             msgRequest.aggiornaProprietarioMessaggio(TimerGestoreMessaggi.ID_MODULO);
  5040.                             openspcoopstate.commit();
  5041.                         } catch (Exception eDel) {
  5042.                             msgDiag.logErroreGenerico(eDel,"EliminazioneMessaggioScadutoTimeoutRicezioneRisposta");
  5043.                         }
  5044.                         // Rilascio connessione
  5045.                         openspcoopstate.releaseResource();
  5046.                     }

  5047.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_RESPONSE_ERROR,
  5048.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  5049.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_513_RECEIVE), e,
  5050.                             ((responseMessage!=null && responseMessage.getParseException()!=null)?responseMessage.getParseException():null))));
  5051.                     return;
  5052.                 }

  5053.                 // Aggiornamento Informazioni Protocollo
  5054.                 msgDiag.setIdMessaggioRisposta(idMessageResponse);
  5055.                 msgDiag.addKeyword(CostantiPdD.KEY_ID_MESSAGGIO_RISPOSTA, idMessageResponse);

  5056.                 /* ------------ Re-ottengo Connessione al DB -------------- */
  5057.                 msgDiag.mediumDebug("Richiesta connessione al database per la gestione della risposta...");
  5058.                 try {
  5059.                     openspcoopstate.updateResource(idTransazione);
  5060.                 } catch (Exception e) {
  5061.                     msgDiag.logErroreGenerico(e,"openspcoopstate.updateResource()");
  5062.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_RESPONSE_ERROR,
  5063.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  5064.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_505_GET_DB_CONNECTION), e,
  5065.                             ((responseMessage!=null && responseMessage.getParseException()!=null)?responseMessage.getParseException():null))));
  5066.                     return;
  5067.                 }
  5068.                 msgRequest.updateOpenSPCoopState(openspcoopstate);

  5069.                 /*
  5070.                  * ------------ Lettura Contenuto Messaggio (mapping in Message) --------------
  5071.                  */
  5072.                 msgDiag.mediumDebug("Lettura messaggio di risposta...");
  5073.                 GestoreMessaggi msgResponse = new GestoreMessaggi(openspcoopstate, false, idMessageResponse, Costanti.INBOX,msgDiag,this.msgContext.pddContext);
  5074.                 try {
  5075.                     responseMessage = msgResponse.getMessage();
  5076.                     if(responseMessage!=null && this.msgContext.getPddContext()!=null) {
  5077.                         Object o = responseMessage.getContextProperty(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO);
  5078.                         if(o!=null && o instanceof Boolean) {
  5079.                             this.msgContext.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO, true);
  5080.                         }
  5081.                         o = responseMessage.getContextProperty(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO_PARSE_EXCEPTION);
  5082.                         if(o!=null && o instanceof ParseException) {
  5083.                             this.msgContext.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO_PARSE_EXCEPTION, o);
  5084.                         }
  5085.                        
  5086.                         o = responseMessage.getContextProperty(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO);
  5087.                         if(o!=null && o instanceof Boolean) {
  5088.                             this.msgContext.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO, true);
  5089.                         }
  5090.                         o = responseMessage.getContextProperty(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO_PARSE_EXCEPTION);
  5091.                         if(o!=null && o instanceof ParseException) {
  5092.                             this.msgContext.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO_PARSE_EXCEPTION, o);
  5093.                         }
  5094.                     }
  5095.                     idCorrelazioneApplicativaRisposta = msgResponse.getIDCorrelazioneApplicativaRisposta();
  5096.                    
  5097.                     /*tempiAttraversamentoGestioneMessaggi = msgResponse.getTempiAttraversamentoPdD();
  5098.                     if (tempiAttraversamentoGestioneMessaggi != null
  5099.                             && (tempiAttraversamentoGestioneMessaggi.getRicezioneMsgIngresso()==null || tempiAttraversamentoGestioneMessaggi.getSpedizioneMessaggioIngresso()==null)) {
  5100.                         TempiAttraversamentoPDD dRichiesta = msgRequest.getTempiAttraversamentoPdD();
  5101.                         if (dRichiesta != null) {
  5102.                             tempiAttraversamentoGestioneMessaggi.setSpedizioneMessaggioIngresso(dRichiesta.getSpedizioneMessaggioIngresso());
  5103.                         }
  5104.                     }
  5105.                    
  5106.                     dimensioneMessaggiAttraversamentoGestioneMessaggi = msgResponse.getDimensioneMessaggiAttraversamentoPdD();*/

  5107.                 } catch (GestoreMessaggiException e) {
  5108.                     msgDiag.logErroreGenerico(e,"msgResponse.getMessage()");
  5109.                     openspcoopstate.releaseResource();
  5110.                     this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_RESPONSE_ERROR,
  5111.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  5112.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_511_READ_RESPONSE_MSG), e,
  5113.                             ((responseMessage!=null && responseMessage.getParseException()!=null)?responseMessage.getParseException():null))));
  5114.                     return;
  5115.                 }

  5116.             }
  5117.         } catch (Exception e) {
  5118.             logError(logCore, "ErroreGenerale", e);
  5119.             msgDiag.logErroreGenerico(e,"ErroreGenerale");
  5120.             openspcoopstate.releaseResource();
  5121.             this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_RESPONSE_ERROR,
  5122.                     ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreIntegrazione(), e,
  5123.                     ((responseMessage!=null && responseMessage.getParseException()!=null)?responseMessage.getParseException():null))
  5124.                     ));
  5125.             errorOccurs_setResponse = true;
  5126.         }

  5127.        
  5128.        
  5129.         /* ---- Aggiorno informazioni correlazione applicativa risposta ---- */
  5130.         msgDiag.setIdCorrelazioneRisposta(idCorrelazioneApplicativaRisposta);
  5131.         if(this.msgContext.getProtocol()!=null){
  5132.             this.msgContext.getProtocol().setProfiloCollaborazione(profiloCollaborazione, profiloCollaborazioneValue);
  5133.         }
  5134.         if(this.msgContext.getIntegrazione()!=null)
  5135.             this.msgContext.getIntegrazione().setIdCorrelazioneApplicativaRisposta(idCorrelazioneApplicativaRisposta);
  5136.            
  5137.        
  5138.        
  5139.        
  5140.         /* ----- Header Integrazione ------ */
  5141.         msgDiag.mediumDebug("Gestione header di integrazione messaggio di risposta...");
  5142.         headerIntegrazioneRisposta.getBusta().setIdCollaborazione(idCollaborazioneResponse);
  5143.         headerIntegrazioneRisposta.getBusta().setProfiloDiCollaborazione(profiloCollaborazione);

  5144.         // -- REFRESH Impostation Risposta dell'Header Trasporto o se l'invocazione e' stata attiva dall'IntegrationManager --
  5145.         // Refresh necessario in seguito alla potenziale impostazione della collaborazione e Profilo di Collaborazione
  5146.         // ed eventuali altre future informazioni non subito disponibili
  5147.        
  5148.         String jtiIdModIRequest = null;
  5149.         Object bustaRispostaObject = null;
  5150.         if(pddContext!=null) {
  5151.             if(pddContext.containsKey(org.openspcoop2.core.constants.Costanti.MODI_JTI_REQUEST_ID)) {
  5152.                 jtiIdModIRequest = (String) pddContext.get(org.openspcoop2.core.constants.Costanti.MODI_JTI_REQUEST_ID);
  5153.             }
  5154.             if(pddContext.containsKey(CostantiPdD.BUSTA_RISPOSTA)) {
  5155.                 bustaRispostaObject = pddContext.getObject(CostantiPdD.BUSTA_RISPOSTA);
  5156.             }
  5157.         }
  5158.         if(jtiIdModIRequest!=null && StringUtils.isNotEmpty(jtiIdModIRequest) && !jtiIdModIRequest.equals(idMessageRequest)) {
  5159.             headerIntegrazioneRisposta.getBusta().setID(jtiIdModIRequest);
  5160.         }
  5161.         else {
  5162.             headerIntegrazioneRisposta.getBusta().setID(idMessageRequest);
  5163.         }
  5164.         OutResponsePDMessage outResponsePDMessage = new OutResponsePDMessage();
  5165.         outResponsePDMessage.setBustaRichiesta(bustaRichiesta);
  5166.         if(bustaRispostaObject instanceof Busta){
  5167.             Busta bustaRisposta = (Busta) bustaRispostaObject;
  5168.             // aggiungo proprieta' (vengono serializzate negli header di integrazione)
  5169.             if(bustaRisposta.sizeProperties()>0){
  5170.                 String[]propertyNames = bustaRisposta.getPropertiesNames();
  5171.                 for (int i = 0; i < propertyNames.length; i++) {
  5172.                     outResponsePDMessage.getBustaRichiesta().addProperty(propertyNames[i], bustaRisposta.getProperty(propertyNames[i]));
  5173.                 }
  5174.             }
  5175.         }
  5176.         outResponsePDMessage.setMessage(responseMessage);
  5177.         outResponsePDMessage.setPortaDelegata(parametriGestioneRisposta.getPortaDelegata());
  5178.         Map<String, List<String>> propertiesIntegrazioneRisposta = new HashMap<>();
  5179.         outResponsePDMessage.setHeaders(propertiesIntegrazioneRisposta);
  5180.         outResponsePDMessage.setServizio(parametriGestioneRisposta.getIdServizio());
  5181.         outResponsePDMessage.setSoggettoMittente(parametriGestioneRisposta.getSoggettoMittente());

  5182.         if (this.msgContext.getIdModulo().startsWith(RicezioneContenutiApplicativi.ID_MODULO+ IntegrationManager.ID_MODULO)) {
  5183.             try {
  5184.                 IGestoreIntegrazionePD gestore = null;
  5185.                 try {
  5186.                     gestore = (IGestoreIntegrazionePD) pluginLoader.newIntegrazionePortaDelegata(CostantiConfigurazione.HEADER_INTEGRAZIONE_TRASPORTO);
  5187.                 }catch(Exception e){
  5188.                     throw e;
  5189.                 }
  5190.                 if(gestore!=null){
  5191.                     String classType = null;
  5192.                     try {
  5193.                         classType = gestore.getClass().getName();
  5194.                         AbstractCore.init(gestore, pddContext, protocolFactory);
  5195.                     } catch (Exception e) {
  5196.                         throw new Exception(
  5197.                                 "Riscontrato errore durante l'inizializzazione della classe ["+ classType
  5198.                                         + "] da utilizzare per la gestione dell'integrazione delle fruizioni (Risposta IM) di tipo ["+ CostantiConfigurazione.HEADER_INTEGRAZIONE_TRASPORTO + "]: " + e.getMessage());
  5199.                     }

  5200.                     gestore.setOutResponseHeader(headerIntegrazioneRisposta, outResponsePDMessage);
  5201.                 }
  5202.             } catch (Exception e) {
  5203.                 msgDiag.logErroreGenerico(e,"setHeaderIntegrazioneRisposta");
  5204.             }
  5205.         }

  5206.         // HeaderIntegrazione
  5207.         for (int i = 0; i < tipiIntegrazionePD.length; i++) {
  5208.             try {
  5209.                 IGestoreIntegrazionePD gestore = null;
  5210.                 try {
  5211.                     gestore = (IGestoreIntegrazionePD) pluginLoader.newIntegrazionePortaDelegata(tipiIntegrazionePD[i]);
  5212.                 }catch(Exception e){
  5213.                     throw e;
  5214.                 }
  5215.                 if(gestore!=null){
  5216.                     String classType = null;
  5217.                     try {
  5218.                         classType = gestore.getClass().getName();
  5219.                         AbstractCore.init(gestore, pddContext, protocolFactory);
  5220.                     } catch (Exception e) {
  5221.                         throw new Exception(
  5222.                                 "Riscontrato errore durante l'inizializzazione della classe ["+ classType
  5223.                                         + "] da utilizzare per la gestione dell'integrazione delle fruizioni (Risposta) di tipo ["+ tipiIntegrazionePD[i] + "]: " + e.getMessage());
  5224.                     }
  5225.                     if(gestore instanceof IGestoreIntegrazionePDSoap){
  5226.                         if(propertiesReader.processHeaderIntegrazionePDResponse(false)){
  5227.                             if(propertiesReader.deleteHeaderIntegrazioneResponsePD()){
  5228.                                 if(responseMessage==null){
  5229.                                     responseMessage = MessageUtilities.buildEmptyMessage(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),
  5230.                                             requestInfo.getIntegrationRequestMessageType(), MessageRole.RESPONSE);
  5231.                                     outResponsePDMessage.setMessage(responseMessage);
  5232.                                 }
  5233.                                 gestore.setOutResponseHeader(headerIntegrazioneRisposta,outResponsePDMessage);
  5234.                             }else{
  5235.                                 // gia effettuato l'update dell'header in InoltroBuste
  5236.                             }
  5237.                         }else{
  5238.                             if(responseMessage==null){
  5239.                                 responseMessage = MessageUtilities.buildEmptyMessage(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),
  5240.                                         requestInfo.getIntegrationRequestMessageType(), MessageRole.RESPONSE);
  5241.                                 outResponsePDMessage.setMessage(responseMessage);
  5242.                             }
  5243.                             gestore.setOutResponseHeader(headerIntegrazioneRisposta,outResponsePDMessage);
  5244.                         }
  5245.                     }else{
  5246.                         gestore.setOutResponseHeader(headerIntegrazioneRisposta,outResponsePDMessage);
  5247.                     }
  5248.                 } else {
  5249.                     throw new Exception("Gestore non inizializzato");
  5250.                 }
  5251.             } catch (Exception e) {
  5252.                 msgDiag.addKeyword(CostantiPdD.KEY_TIPO_HEADER_INTEGRAZIONE,tipiIntegrazionePD[i]);
  5253.                 msgDiag.addKeywordErroreProcessamento(e);
  5254.                 msgDiag.logPersonalizzato("headerIntegrazione.creazioneFallita");
  5255.                 logError(logCore, msgDiag.getMessaggio_replaceKeywords("headerIntegrazione.creazioneFallita"), e);
  5256.             }
  5257.         }

  5258.         // Imposto header di trasporto per la risposta
  5259.         this.msgContext.setResponseHeaders(propertiesIntegrazioneRisposta);
  5260.        
  5261.        
  5262.        
  5263.        
  5264.        
  5265.        
  5266.        
  5267.         /* ----- Eliminazione SIL (Stateful) ------ */
  5268.        
  5269.         if (!portaStateless)
  5270.             eliminaSIL((OpenSPCoopStateful) openspcoopstate, msgDiag, idMessageRequest, idMessageResponse,
  5271.                     servizioApplicativo);

  5272.        
  5273.        
  5274.        
  5275.         /* ----- Aggiornamento proprietario (Stateless puro, no gestione oneway) ------ */
  5276.         if (portaStateless && !oneWayVers11) {
  5277.             msgDiag.mediumDebug("Aggiorno proprietario messaggio richiesta ...");
  5278.             try {
  5279.                 /* Lo stateless che non รจ onewayVersione11 non salva niente su database */
  5280.                 // A meno che non siamo in asincrono simmetrico richiesta stateless
  5281.                 // In caso di richiestaAsincronaSimmetrica e openspcoop stateless,
  5282.                 // Devo comunque salvare le informazioni sul msg della ricevuta alla richiesta.
  5283.                 // Tali informazioni servono per il check nel modulo RicezioneBuste, per verificare di gestire la risposta
  5284.                 // solo dopo aver terminato di gestire la richiesta con relativa ricevuta.
  5285.                 if(richiestaAsincronaSimmetricaStateless){
  5286.                     boolean resourceReleased = openspcoopstate.resourceReleased();
  5287.                     if(resourceReleased){
  5288.                         ((OpenSPCoopStateless)openspcoopstate).setUseConnection(true);
  5289.                         openspcoopstate.updateResource(idTransazione);
  5290.                     }
  5291.                     GestoreMessaggi msgResponse = new GestoreMessaggi(openspcoopstate, false, idMessageResponse, Costanti.INBOX,msgDiag,this.msgContext.pddContext);
  5292.                     msgResponse.setReadyForDrop(true);
  5293.                     msgResponse.aggiornaProprietarioMessaggio(TimerGestoreMessaggi.ID_MODULO);
  5294.                     msgResponse.setReadyForDrop(false);
  5295.                    
  5296.                     // Devo eliminare anche la richiesta (nel caso in cui non sia arrivata la validazione della ricevuta)
  5297.                     msgRequest.updateOpenSPCoopState(openspcoopstate);
  5298.                     msgRequest.setReadyForDrop(true);
  5299.                     msgRequest.aggiornaProprietarioMessaggio(TimerGestoreMessaggi.ID_MODULO);
  5300.                     msgRequest.setReadyForDrop(false);
  5301.                 }
  5302.                
  5303.                 // Committo modifiche (I commit servono per eventuali modifiche ai duplicati)
  5304.                 openspcoopstate.commit();
  5305.                
  5306.             } catch (Exception e) {
  5307.                 logError(logCore, "Errore durante l'aggiornamento del proprietario al GestoreMessaggi (Stateless)", e);
  5308.                 msgDiag.logErroreGenerico(e, "openspcoopstate.commit(stateless risposta)");
  5309.                 openspcoopstate.releaseResource();
  5310.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_RESPONSE_ERROR,
  5311.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreIntegrazione(), e,
  5312.                         ((responseMessage!=null && responseMessage.getParseException()!=null)?responseMessage.getParseException():null))));
  5313.                 errorOccurs_setResponse = true;
  5314.             }
  5315.         }

  5316.        
  5317.        
  5318.         /* ----- OneWay stateful/stateless ------ */
  5319.        
  5320.         if (oneWayVers11) {
  5321.             msgDiag.mediumDebug("Commit della gestione oneWay stateful/stateless...");
  5322.             try {
  5323.                 // Committo modifiche
  5324.                 openspcoopstate.commit();
  5325.             } catch (Exception e) {
  5326.                 logError(logCore, "Riscontrato errore durante il commit della gestione oneWay stateful/stateless", e);
  5327.                 msgDiag.logErroreGenerico(e, "openspcoopstate.commit(oneway1.1 risposta)");
  5328.                 openspcoopstate.releaseResource();
  5329.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(pddContext,IntegrationFunctionError.INTERNAL_RESPONSE_ERROR,
  5330.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreIntegrazione(), e,
  5331.                         ((responseMessage!=null && responseMessage.getParseException()!=null)?responseMessage.getParseException():null))));
  5332.                 errorOccurs_setResponse = true;
  5333.             }
  5334.         }

  5335.        
  5336.        
  5337.        
  5338.        
  5339.         /* ----- Terminazione gestione richiesta ------ */
  5340.        
  5341.         // Rilascio connessione al DB
  5342.         msgDiag.mediumDebug("Rilascio connessione al database...");
  5343.         openspcoopstate.releaseResource();

  5344.         // Risposta
  5345.         if (profiloCollaborazione != null) {
  5346.             if (profiloCollaborazione.equals(ProfiloDiCollaborazione.SINCRONO)) {
  5347.                 msgDiag.addKeyword(CostantiPdD.KEY_TIPOLOGIA_RISPOSTA_APPLICATIVA, "risposta sincrona");
  5348.                 msgDiag.logPersonalizzato("consegnaRispostaApplicativa");
  5349.             } else if (profiloCollaborazione.equals(ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO)) {
  5350.                 if (headerIntegrazioneRichiesta != null
  5351.                         && headerIntegrazioneRichiesta.getBusta() != null
  5352.                         && headerIntegrazioneRichiesta.getBusta().getRiferimentoMessaggio() != null) {
  5353.                     msgDiag.addKeyword(CostantiPdD.KEY_TIPOLOGIA_RISPOSTA_APPLICATIVA, "ricevuta di una risposta asincrona simmetrica");
  5354.                 } else {
  5355.                     msgDiag.addKeyword(CostantiPdD.KEY_TIPOLOGIA_RISPOSTA_APPLICATIVA, "ricevuta di una richiesta asincrona simmetrica");
  5356.                 }
  5357.                 msgDiag.logPersonalizzato("consegnaRispostaApplicativa");
  5358.             } else if (profiloCollaborazione.equals(ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO)) {
  5359.                 if (headerIntegrazioneRichiesta != null
  5360.                         && headerIntegrazioneRichiesta.getBusta() != null
  5361.                         && headerIntegrazioneRichiesta.getBusta().getRiferimentoMessaggio() != null) {
  5362.                     msgDiag.addKeyword(CostantiPdD.KEY_TIPOLOGIA_RISPOSTA_APPLICATIVA, "ricevuta di una risposta asincrona asimmetrica");
  5363.                 } else {
  5364.                     msgDiag.addKeyword(CostantiPdD.KEY_TIPOLOGIA_RISPOSTA_APPLICATIVA, "ricevuta di una richiesta asincrona asimmetrica");
  5365.                 }
  5366.                 msgDiag.logPersonalizzato("consegnaRispostaApplicativa");
  5367.             }
  5368.         }

  5369.        
  5370.        
  5371.        
  5372.         msgDiag.mediumDebug("Imposto risposta nel context...");
  5373.         if(errorOccurs_setResponse==false){
  5374.             this.msgContext.setMessageResponse(responseMessage);
  5375.         }

  5376.     }

  5377.    
  5378.    
  5379.    
  5380.    
  5381.     /* -------------- UTILITY -------------- */
  5382.    
  5383.     private void eliminaSIL(OpenSPCoopStateful openspcoopstate,
  5384.             MsgDiagnostico msgDiag, String idMessageRequest, String idMessageResponse,
  5385.             String servizioApplicativo) {
  5386.         // Elimino SIL destinatario a cui ho consegnato il messaggio
  5387.         msgDiag.mediumDebug("Eliminazione SIL destinatario del messaggio nella tabelle MSG_SERVIZI_APPLICATIVI...");
  5388.         if (openspcoopstate.getConnectionDB() != null) {
  5389.             try {
  5390.                 // GestoreMessaggi gestoreEliminazioneDestinatario = new
  5391.                 // GestoreMessaggi(openspcoopstate,
  5392.                 // false,idMessageResponse,Costanti.INBOX,msgDiag);
  5393.                 GestoreMessaggi gestoreEliminazioneDestinatario = new GestoreMessaggi(openspcoopstate, false, idMessageResponse, Costanti.INBOX,msgDiag,this.msgContext.pddContext);
  5394.                 gestoreEliminazioneDestinatario.eliminaDestinatarioMessaggio(servizioApplicativo, idMessageRequest);
  5395.             } catch (Exception e) {
  5396.                 msgDiag.logErroreGenerico(e, "gestoreEliminazioneDestinatario.eliminaDestinatarioMessaggio("+servizioApplicativo+")");
  5397.             }
  5398.         } else {
  5399.             msgDiag.logErroreGenerico("Connessione non disponibile", "gestoreEliminazioneDestinatario.eliminaDestinatarioMessaggio("+servizioApplicativo+")");
  5400.         }
  5401.     }

  5402. }