RicezioneContenutiApplicativiServiceUtils.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.service;

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

  25. import javax.servlet.http.HttpServletRequest;

  26. import org.apache.commons.lang.StringUtils;
  27. import org.openspcoop2.core.config.CorsConfigurazione;
  28. import org.openspcoop2.core.config.PortaDelegata;
  29. import org.openspcoop2.core.config.constants.StatoFunzionalita;
  30. import org.openspcoop2.core.config.constants.TipoGestioneCORS;
  31. import org.openspcoop2.core.constants.TipoPdD;
  32. import org.openspcoop2.core.id.IDPortaDelegata;
  33. import org.openspcoop2.core.id.IDServizio;
  34. import org.openspcoop2.core.id.IDSoggetto;
  35. import org.openspcoop2.core.registry.PortaDominio;
  36. import org.openspcoop2.core.registry.Soggetto;
  37. import org.openspcoop2.core.transazioni.utils.PropertiesSerializator;
  38. import org.openspcoop2.message.config.ServiceBindingConfiguration;
  39. import org.openspcoop2.message.constants.MessageType;
  40. import org.openspcoop2.message.constants.ServiceBinding;
  41. import org.openspcoop2.message.soap.reader.OpenSPCoop2MessageSoapStreamReader;
  42. import org.openspcoop2.pdd.config.CachedConfigIntegrationReader;
  43. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  44. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  45. import org.openspcoop2.pdd.core.CostantiPdD;
  46. import org.openspcoop2.pdd.core.GestoreRichieste;
  47. import org.openspcoop2.pdd.core.PdDContext;
  48. import org.openspcoop2.pdd.core.handlers.GestoreHandlers;
  49. import org.openspcoop2.pdd.core.handlers.PostOutResponseContext;
  50. import org.openspcoop2.pdd.core.handlers.transazioni.PreInRequestHandler;
  51. import org.openspcoop2.pdd.core.transazioni.Transaction;
  52. import org.openspcoop2.pdd.core.transazioni.TransactionContext;
  53. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  54. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  55. import org.openspcoop2.pdd.services.OpenSPCoop2Startup;
  56. import org.openspcoop2.pdd.services.connector.ConnectorDispatcherInfo;
  57. import org.openspcoop2.pdd.services.connector.ConnectorDispatcherUtils;
  58. import org.openspcoop2.pdd.services.connector.ConnectorException;
  59. import org.openspcoop2.pdd.services.connector.messages.ConnectorInMessage;
  60. import org.openspcoop2.pdd.services.connector.messages.ConnectorOutMessage;
  61. import org.openspcoop2.pdd.services.core.RicezioneContenutiApplicativiContext;
  62. import org.openspcoop2.pdd.services.error.RicezioneContenutiApplicativiInternalErrorGenerator;
  63. import org.openspcoop2.protocol.basic.registry.IdentificazionePortaDelegata;
  64. import org.openspcoop2.protocol.basic.registry.ServiceIdentificationReader;
  65. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  66. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  67. import org.openspcoop2.protocol.sdk.builder.EsitoTransazione;
  68. import org.openspcoop2.protocol.sdk.constants.ErroriIntegrazione;
  69. import org.openspcoop2.protocol.sdk.constants.EsitoTransazioneName;
  70. import org.openspcoop2.protocol.sdk.constants.IDService;
  71. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  72. import org.openspcoop2.protocol.sdk.registry.IRegistryReader;
  73. import org.openspcoop2.protocol.sdk.registry.RegistryNotFound;
  74. import org.openspcoop2.protocol.sdk.state.IState;
  75. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  76. import org.openspcoop2.protocol.sdk.state.RequestInfoConfigUtilities;
  77. import org.openspcoop2.protocol.sdk.state.URLProtocolContext;
  78. import org.openspcoop2.utils.date.DateManager;
  79. import org.openspcoop2.utils.transport.TransportUtils;
  80. import org.openspcoop2.utils.transport.http.ContentTypeUtilities;
  81. import org.openspcoop2.utils.transport.http.HttpConstants;
  82. import org.openspcoop2.utils.transport.http.HttpRequestMethod;
  83. import org.slf4j.Logger;

  84. /**
  85.  * RicezioneContenutiApplicativiServiceUtils
  86.  *
  87.  * @author Poli Andrea (apoli@link.it)
  88.  * @author $Author$
  89.  * @version $Rev$, $Date$
  90.  */
  91. public class RicezioneContenutiApplicativiServiceUtils {

  92.     public static RicezionePropertiesConfig readPropertiesConfig(RequestInfo requestInfo, Logger logCore, IState state) {
  93.         if (requestInfo != null && requestInfo.getProtocolContext() != null && requestInfo.getProtocolContext().getInterfaceName() != null && !"".equals(requestInfo.getProtocolContext().getInterfaceName())) {
  94.             try {
  95.                 ConfigurazionePdDManager configurazionePdDManager = ConfigurazionePdDManager.getInstance(state);
  96.                 RegistroServiziManager registroServiziManager = RegistroServiziManager.getInstance(state);
  97.                 IDPortaDelegata idPD = new IDPortaDelegata();
  98.                 idPD.setNome(requestInfo.getProtocolContext().getInterfaceName());
  99.                 PortaDelegata pd = configurazionePdDManager.getPortaDelegataSafeMethod(idPD, requestInfo);
  100.                 if (pd != null) {
  101.                     RicezionePropertiesConfig config = new RicezionePropertiesConfig();
  102.                    
  103.                     config.setApiImplementation(configurazionePdDManager.getProprietaConfigurazione(pd));
  104.                    
  105.                     IDSoggetto idSoggettoProprietario = new IDSoggetto(pd.getTipoSoggettoProprietario(), pd.getNomeSoggettoProprietario());
  106.                     Soggetto soggetto = registroServiziManager.getSoggetto(idSoggettoProprietario, null, requestInfo);
  107.                     config.setSoggettoFruitore(registroServiziManager.getProprietaConfigurazione(soggetto));
  108.                    
  109.                     IDSoggetto idSoggettoErogatore = new IDSoggetto(pd.getSoggettoErogatore().getTipo(), pd.getSoggettoErogatore().getNome());
  110.                     Soggetto soggettoErogatore = registroServiziManager.getSoggetto(idSoggettoErogatore, null, requestInfo);
  111.                     config.setSoggettoErogatore(registroServiziManager.getProprietaConfigurazione(soggettoErogatore));
  112.                    
  113.                     return config;
  114.                 }
  115.             } catch (Exception e) {
  116.                 logCore.error("Errore durante la lettura delle proprietà di configurazione della porta delegata [" + requestInfo.getProtocolContext().getInterfaceName() + "]: " + e.getMessage(), e);
  117.             }

  118.             return null;
  119.         } else {
  120.             return null;
  121.         }
  122.     }
  123.    
  124.     public static ConnectorDispatcherInfo updatePortaDelegataRequestInfo(RequestInfo requestInfo, Logger logCore,
  125.             ConnectorInMessage req, ConnectorOutMessage res, RicezioneContenutiApplicativiInternalErrorGenerator generatoreErrore,
  126.             ServiceIdentificationReader serviceIdentificationReader,
  127.             MsgDiagnostico msgDiag, PdDContext pddContextNullable) throws ConnectorException{
  128.        
  129.         if(requestInfo==null) {
  130.             throw new ConnectorException("Param requestInfo is null");
  131.         }
  132.        
  133.         URLProtocolContext protocolContext = requestInfo.getProtocolContext();
  134.         IProtocolFactory<?> pf = requestInfo.getProtocolFactory();
  135.         ServiceBindingConfiguration bindingConfig = requestInfo.getBindingConfig();
  136.         ServiceBinding integrationServiceBinding = requestInfo.getIntegrationServiceBinding();
  137.         ServiceBinding protocolServiceBinding = requestInfo.getProtocolServiceBinding();
  138.         IDService idModuloAsServiceNullable = req!=null ? req.getIdModuloAsIDService() : null; // null se si passa da IntegrationManager
  139.                
  140.         IRegistryReader registryReader = serviceIdentificationReader.getRegistryReader();
  141.         CachedConfigIntegrationReader configIntegrationReader = (CachedConfigIntegrationReader) serviceIdentificationReader.getConfigIntegrationReader();
  142.         ConfigurazionePdDManager configurazionePdDManager = ConfigurazionePdDManager.getInstance();
  143.        
  144.         IDPortaDelegata idPD = null;
  145.         PortaDelegata pdDefault = null;
  146.         try{
  147.             if(requestInfo.getRequestConfig()!=null && requestInfo.getRequestConfig().getIdPortaDelegataDefault()!=null) {
  148.                 idPD = requestInfo.getRequestConfig().getIdPortaDelegataDefault();
  149.             }
  150.             else {
  151.                 idPD = serviceIdentificationReader.findPortaDelegata(protocolContext, true);
  152.                 if(requestInfo.getRequestConfig()!=null) {
  153.                     requestInfo.getRequestConfig().setIdPortaDelegataDefault(idPD);
  154.                 }
  155.             }
  156.         }catch(RegistryNotFound notFound){
  157.             if(pddContextNullable!=null) {
  158.                 pddContextNullable.addObject(org.openspcoop2.core.constants.Costanti.API_NON_INDIVIDUATA, "true");
  159.             }
  160.             // Non ha senso nel contesto di porta delegata
  161.             //if(bindingConfig.existsContextUrlMapping()==false){
  162.             logCore.error("Porta Delegata non trovata: "+notFound.getMessage(),notFound);
  163.             msgDiag.addKeywordErroreProcessamento(notFound);
  164.             msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI,"portaDelegataNonEsistente");
  165.             ConnectorDispatcherInfo c = ConnectorDispatcherUtils.doError(requestInfo, generatoreErrore, serviceIdentificationReader.getErroreIntegrazioneNotFound(),
  166.                     IntegrationFunctionError.API_OUT_UNKNOWN, notFound, null, res, logCore, ConnectorDispatcherUtils.CLIENT_ERROR);
  167.             try {
  168.                 EsitoTransazione esito = requestInfo.getProtocolFactory().createEsitoBuilder().getEsito(requestInfo.getProtocolContext(),EsitoTransazioneName.API_NON_INDIVIDUATA);
  169.                 c.setEsitoTransazione(esito);
  170.             }catch(Throwable t) {
  171.                 logCore.error("Errore durante l'impostazione dell'esito 'API_NON_INDIVIDUATA'");
  172.             }
  173.             return c;
  174.             //}
  175.         }
  176.         if(idPD!=null){
  177.            
  178.             // da ora in avanti, avendo localizzato una PD, se avviene un errore genero l'errore stesso
  179.             protocolContext.setInterfaceName(idPD.getNome());
  180.            
  181.             // read IDServizio e IDSoggettoFruitore
  182.             IDSoggetto idSoggettoFruitore = null;
  183.             IDServizio idServizio = null;
  184.             if(requestInfo.getRequestConfig()!=null &&
  185.                     requestInfo.getRequestConfig().getIdServizio()!=null &&
  186.                     requestInfo.getRequestConfig().getIdFruitore()!=null) {
  187.                 idServizio = requestInfo.getRequestConfig().getIdServizio().clone(); // effettuo clone altrimenti viene cambiato dopo e la modifica potrebbe risultare anche in altri thread
  188.                 idSoggettoFruitore = requestInfo.getRequestConfig().getIdFruitore().clone(); // effettuo clone per i motivi sopra
  189.             }
  190.             else {
  191.                 if(idPD.getIdentificativiFruizione()!=null){
  192.                     if(idPD.getIdentificativiFruizione().getSoggettoFruitore()!=null) {
  193.                         idSoggettoFruitore = idPD.getIdentificativiFruizione().getSoggettoFruitore().clone(); // effettuo clone altrimenti nella cache vengono memorizzate le informazioni impostate dopo!
  194.                     }
  195.                     if( idPD.getIdentificativiFruizione().getIdServizio()!=null) {
  196.                         idServizio = idPD.getIdentificativiFruizione().getIdServizio().clone(); // effettuo clone altrimenti nella cache viene memorizzata l'azione impostata dopo!
  197.                     }
  198.                 }
  199.                
  200.                 if(idServizio==null){
  201.                     try{
  202.                         idServizio = serviceIdentificationReader.convertToIDServizio(idPD);
  203.                         if(idServizio!=null) {
  204.                             idServizio = idServizio.clone(); // effettuo clone altrimenti nella cache viene memorizzata l'azione impostata dopo!
  205.                         }
  206.                     }catch(RegistryNotFound notFound){
  207.                         logCore.debug("Conversione Dati PortaDelegata in identificativo servizio fallita (notFound): "+notFound.getMessage(),notFound);
  208.                         msgDiag.addKeywordErroreProcessamento(notFound);
  209.                         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI,"portaDelegataNonEsistente");
  210.                         return ConnectorDispatcherUtils.doError(requestInfo, generatoreErrore, serviceIdentificationReader.getErroreIntegrazioneNotFound(),
  211.                                 IntegrationFunctionError.API_OUT_UNKNOWN, notFound, null, res, logCore, ConnectorDispatcherUtils.CLIENT_ERROR);
  212.                     }
  213.                 }
  214.                 if(idSoggettoFruitore==null){
  215.                     try{
  216.                         idSoggettoFruitore = serviceIdentificationReader.convertToIDSoggettoFruitore(idPD);
  217.                     }catch(RegistryNotFound notFound){
  218.                         logCore.debug("Conversione Dati PortaDelegata in identificativo soggetto fruitore fallita (notFound): "+notFound.getMessage(),notFound);
  219.                         msgDiag.addKeywordErroreProcessamento(notFound);
  220.                         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI,"portaDelegataNonEsistente");
  221.                         return ConnectorDispatcherUtils.doError(requestInfo, generatoreErrore, serviceIdentificationReader.getErroreIntegrazioneNotFound(),
  222.                                 IntegrationFunctionError.API_OUT_UNKNOWN, notFound, null, res, logCore, ConnectorDispatcherUtils.CLIENT_ERROR);
  223.                     }
  224.                 }
  225.                
  226.                 if(requestInfo.getRequestConfig()!=null) {
  227.                     requestInfo.getRequestConfig().setIdServizio(idServizio);
  228.                     requestInfo.getRequestConfig().setIdFruitore(idSoggettoFruitore);
  229.                 }
  230.             }
  231.            
  232.             if(generatoreErrore!=null && idSoggettoFruitore!=null){
  233.                 generatoreErrore.updateDominio(idSoggettoFruitore);
  234.                 generatoreErrore.updateInformazioniCooperazione(idSoggettoFruitore, null);
  235.             }
  236.            
  237.             if(idServizio!=null){
  238.                
  239.                 RegistroServiziManager registroServiziManager = RegistroServiziManager.getInstance();
  240.                
  241.                 // Aggiorno service binding rispetto al servizio localizzato
  242.                 try{
  243.                    
  244.                     integrationServiceBinding = pf.createProtocolConfiguration().getIntegrationServiceBinding(idServizio, registryReader);
  245.                     requestInfo.setIntegrationServiceBinding(integrationServiceBinding);
  246.                    
  247.                     protocolServiceBinding = pf.createProtocolConfiguration().getProtocolServiceBinding(integrationServiceBinding, protocolContext);
  248.                     requestInfo.setProtocolServiceBinding(protocolServiceBinding);
  249.                    
  250.                     if(generatoreErrore!=null) {
  251.                         generatoreErrore.updateServiceBinding(integrationServiceBinding);
  252.                     }
  253.                 }catch(RegistryNotFound notFound){
  254.                     logCore.debug("Lettura ServiceBinding fallita (notFound): "+notFound.getMessage(),notFound);
  255.                     msgDiag.addKeywordErroreProcessamento(notFound);
  256.                     msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI,"portaDelegataNonEsistente");
  257.                     return ConnectorDispatcherUtils.doError(requestInfo, generatoreErrore,
  258.                             ErroriIntegrazione.ERRORE_405_SERVIZIO_NON_TROVATO.getErroreIntegrazione(),
  259.                             IntegrationFunctionError.API_OUT_UNKNOWN, notFound, null, res, logCore, ConnectorDispatcherUtils.CLIENT_ERROR);
  260.                 }catch(Exception error){
  261.                     logCore.error("Lettura ServiceBinding fallita: "+error.getMessage(),error);
  262.                     msgDiag.addKeywordErroreProcessamento(error);
  263.                     msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI,"portaDelegataNonEsistente");
  264.                     return ConnectorDispatcherUtils.doError(requestInfo, generatoreErrore,
  265.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.get5XX_ErroreProcessamento("Lettura ServiceBinding fallita"),
  266.                             IntegrationFunctionError.INTERNAL_REQUEST_ERROR, error, null, res, logCore, ConnectorDispatcherUtils.GENERAL_ERROR);
  267.                 }
  268.                
  269.                 // Provo ad ottenere il reader soap
  270.                 OpenSPCoop2MessageSoapStreamReader soapStreamReader = null;
  271.                 if(ServiceBinding.SOAP.equals(integrationServiceBinding) && !IDService.PORTA_DELEGATA_XML_TO_SOAP.equals(idModuloAsServiceNullable)) {
  272.                     try{
  273.                         if(req!=null) {
  274.                             soapStreamReader = req.getSoapReader();
  275.                         }
  276.                     }catch(Exception e){
  277.                         logCore.debug("SOAPStream lettura non riuscita: "+e.getMessage(),e);
  278.                     }
  279.                 }
  280.                
  281.                 // PortaDelegata Default
  282.                 try{
  283.                     if(requestInfo.getRequestConfig()!=null && requestInfo.getRequestConfig().getPortaDelegataDefault()!=null) {
  284.                         pdDefault = requestInfo.getRequestConfig().getPortaDelegataDefault();
  285.                     }
  286.                     else {
  287.                         pdDefault = configurazionePdDManager.getPortaDelegata(idPD, null); // passo null volutamente, per non utilizzare la configurazione
  288.                         if(requestInfo.getRequestConfig()!=null) {
  289.                             requestInfo.getRequestConfig().setPortaDelegataDefault(pdDefault);
  290.                         }
  291.                     }
  292.                 }catch(Exception e){
  293.                     logCore.debug("Recupero porta default fallita: "+e.getMessage(),e);
  294.                 }
  295.                
  296.                 // Verifico che la modalità di riconoscimento dell'azione sia compatibile
  297.                 RequestInfoConfigUtilities.checkRequestInfoConfig(pdDefault, logCore, integrationServiceBinding, soapStreamReader, requestInfo);
  298.                 // Aggiorno chiave per considerare anche il soapStreamReader
  299.                 GestoreRichieste.updateRequestConfig(requestInfo, integrationServiceBinding, soapStreamReader);
  300.                 if(requestInfo!=null && requestInfo.getRequestConfig()!=null && requestInfo.getRequestConfig().getIdServizio()!=null) {
  301.                     idServizio = requestInfo.getRequestConfig().getIdServizio(); // se ho fatto lo switch per chiave più specifica per soap, uso il nuovo oggetto per evitare che nella chiave precedente venga memorizzata l'azione
  302.                 }
  303.                
  304.                 // provo a leggere anche l'azione
  305.                 // l'eventuale errore lo genero dopo
  306.                 try{
  307.                     //PortaDelegata pdSearchAzione = configIntegrationReader.getPortaDelegata(idPD);
  308.                     PortaDelegata pdSearchAzione = pdDefault;
  309.                     idServizio.setAzione(configIntegrationReader.getAzione(pdSearchAzione, protocolContext, requestInfo, requestInfo.getProtocolFactory(),soapStreamReader));
  310.                 }catch(Exception e){
  311.                     logCore.debug("Azione non trovata: "+e.getMessage(),e);
  312.                 }
  313.                                
  314.                 // Lettura eventuale MessageFactory da utilizzare
  315.                 try {
  316.                     if(pdDefault!=null && pdDefault.getOptions()!=null && !StringUtils.isEmpty(pdDefault.getOptions())) {
  317.                         Map<String, List<String>> props = PropertiesSerializator.convertoFromDBColumnValue(pdDefault.getOptions());
  318.                         if(props!=null && props.size()>0) {
  319.                             String msgFactory = TransportUtils.getFirstValue(props,CostantiPdD.OPTIONS_MESSAGE_FACTORY);
  320.                             if(msgFactory!=null) {
  321.                                 requestInfo.setMessageFactory(msgFactory);
  322.                             }
  323.                         }
  324.                     }
  325.                 }catch(Throwable e){
  326.                     logCore.debug("Lettura Message Factory fallita: "+e.getMessage(),e);
  327.                 }
  328.                
  329.                 // Lettura Azione
  330.                 try{
  331.                     if(requestInfo.getRequestConfig()!=null && requestInfo.getRequestConfig().getIdPortaDelegata()!=null) {
  332.                         idPD = requestInfo.getRequestConfig().getIdPortaDelegata();
  333.                        
  334.                         if(requestInfo.getRequestConfig().getIdPortaDelegataDefault()!=null && !requestInfo.getRequestConfig().getIdPortaDelegataDefault().equals(idPD)) {
  335.                             // pd specifica
  336.                            
  337.                             if(pddContextNullable!=null) {
  338.                                 pddContextNullable.addObject(CostantiPdD.NOME_PORTA_INVOCATA, requestInfo.getRequestConfig().getIdPortaDelegataDefault().getNome()); // prima di aggiornare la porta applicativa
  339.                             }
  340.                            
  341.                             msgDiag.addKeyword(CostantiPdD.KEY_PORTA_DELEGATA, idPD.getNome());
  342.                             msgDiag.updatePorta(idPD.getNome(), requestInfo);
  343.                             protocolContext.setInterfaceName(idPD.getNome());
  344.                         }
  345.                     }
  346.                     else {
  347.                         if(idServizio.getAzione()!=null) {
  348.                             IdentificazionePortaDelegata identificazione = new IdentificazionePortaDelegata(logCore, pf,
  349.                                     serviceIdentificationReader.getRegistryReader(), serviceIdentificationReader.getConfigIntegrationReader(), // questi reader sono gia' 'cached'
  350.                                     requestInfo, pdDefault);
  351.                             if(identificazione.find(idServizio.getAzione())) {
  352.                                 IDPortaDelegata idPD_action = identificazione.getIDPortaDelegata(idServizio.getAzione());
  353.                                 if(idPD_action!=null) {
  354.                                    
  355.                                     if(pddContextNullable!=null) {
  356.                                         pddContextNullable.addObject(CostantiPdD.NOME_PORTA_INVOCATA, idPD.getNome()); // prima di aggiornare la porta delegata
  357.                                     }
  358.                                    
  359.                                     msgDiag.addKeyword(CostantiPdD.KEY_PORTA_DELEGATA, idPD_action.getNome());
  360.                                     msgDiag.updatePorta(idPD_action.getNome(),requestInfo);
  361.                                     protocolContext.setInterfaceName(idPD_action.getNome());
  362.                                     idPD = idPD_action;
  363.                                 }
  364.                             }
  365.                         }
  366.                         if(idPD!=null && requestInfo.getRequestConfig()!=null) {
  367.                             requestInfo.getRequestConfig().setIdPortaDelegata(idPD);
  368.                         }
  369.                     }
  370.                 }catch(Exception e){
  371.                     logCore.debug("Gestione porta specifica per azione fallita: "+e.getMessage(),e);
  372.                 }
  373.                
  374.                 // SetPD usato poi successivamente
  375.                 if(idPD!=null && requestInfo.getRequestConfig()!=null && requestInfo.getRequestConfig().getPortaDelegata()==null) {
  376.                     try{
  377.                         PortaDelegata pd = configurazionePdDManager.getPortaDelegataSafeMethod(idPD, null); // passo null volutamente, per non utilizzare la configurazione
  378.                         requestInfo.getRequestConfig().setPortaDelegata(pd);
  379.                     }catch(Exception e){
  380.                         logCore.debug("Recupero porta delegata fallito: "+e.getMessage(),e);
  381.                     }
  382.                 }
  383.                
  384.                 // Set identità soggetti erogatori usati poi successivamente
  385.                 if(idServizio!=null && idServizio.getSoggettoErogatore()!=null && requestInfo.getRequestConfig()!=null) {
  386.                     if(requestInfo.getRequestConfig().getSoggettoErogatoreRegistry()==null) {
  387.                         try{
  388.                             org.openspcoop2.core.registry.Soggetto soggettoRegistry = registroServiziManager.getSoggetto(idServizio.getSoggettoErogatore(), null, null); // passo null volutamente, per accedere alla configurazione
  389.                             requestInfo.getRequestConfig().setSoggettoErogatoreRegistry(soggettoRegistry);
  390.                         }catch(Exception e){
  391.                             logCore.debug("Recupero soggetto erogatore dal registro fallito: "+e.getMessage(),e);
  392.                         }
  393.                     }
  394.                     if(requestInfo.getRequestConfig().getSoggettoErogatoreConfig()==null) {
  395.                         try{
  396.                             org.openspcoop2.core.config.Soggetto soggettoConfig = configurazionePdDManager.getSoggetto(idServizio.getSoggettoErogatore(), null); // passo null volutamente, per accedere alla configurazione
  397.                             requestInfo.getRequestConfig().setSoggettoErogatoreConfig(soggettoConfig);
  398.                         }catch(Exception e){
  399.                             logCore.debug("Recupero soggetto erogatore dal registro fallito: "+e.getMessage(),e);
  400.                         }
  401.                     }
  402.                     if(requestInfo.getRequestConfig().getSoggettoErogatoreIdentificativoPorta()==null) {
  403.                         try{
  404.                             String idPorta = configurazionePdDManager.getIdentificativoPorta(idServizio.getSoggettoErogatore(), pf, null); // passo null volutamente, per accedere alla configurazione
  405.                             requestInfo.getRequestConfig().setSoggettoErogatoreIdentificativoPorta(idPorta);
  406.                         }catch(Exception e){
  407.                             logCore.debug("Recupero dati soggetto erogatore (identificativoPorta) dal registro fallito: "+e.getMessage(),e);
  408.                         }
  409.                     }
  410.                     if(requestInfo.getRequestConfig().getSoggettoErogatoreSoggettoVirtuale()==null) {
  411.                         try{
  412.                             boolean soggettoVirtuale = configurazionePdDManager.isSoggettoVirtuale(idServizio.getSoggettoErogatore(), null); // passo null volutamente, per accedere alla configurazione
  413.                             requestInfo.getRequestConfig().setSoggettoErogatoreSoggettoVirtuale(soggettoVirtuale);
  414.                         }catch(Exception e){
  415.                             logCore.debug("Recupero dati soggetto erogatore (soggettoVirtuale) dal registro fallito: "+e.getMessage(),e);
  416.                         }
  417.                     }
  418.                     if(requestInfo.getRequestConfig().getSoggettoErogatorePddReaded()==null) {
  419.                         try{
  420.                             if(requestInfo.getRequestConfig().getSoggettoErogatoreRegistry()!=null) {
  421.                                 if(requestInfo.getRequestConfig().getSoggettoErogatoreRegistry().getPortaDominio()!=null &&
  422.                                         StringUtils.isNotEmpty(requestInfo.getRequestConfig().getSoggettoErogatoreRegistry().getPortaDominio())) {
  423.                                     PortaDominio pdd = registroServiziManager.getPortaDominio(requestInfo.getRequestConfig().getSoggettoErogatoreRegistry().getPortaDominio(), null, null); // passo null volutamente, per accedere alla configurazione
  424.                                     requestInfo.getRequestConfig().setSoggettoErogatorePddReaded(true);
  425.                                     requestInfo.getRequestConfig().setSoggettoErogatorePdd(pdd);
  426.                                 }
  427.                                 else {
  428.                                     requestInfo.getRequestConfig().setSoggettoErogatorePddReaded(true);
  429.                                 }
  430.                             }
  431.                         }catch(Exception e){
  432.                             logCore.debug("Recupero dati soggetto erogatore (pdd) dal registro fallito: "+e.getMessage(),e);
  433.                         }
  434.                     }
  435.                     if(requestInfo.getRequestConfig().getSoggettoErogatoreImplementazionePdd()==null) {
  436.                         try{
  437.                             String impl = registroServiziManager.getImplementazionePdD(idServizio.getSoggettoErogatore(), null, null); // passo null volutamente, per accedere alla configurazione
  438.                             requestInfo.getRequestConfig().setSoggettoErogatoreImplementazionePdd(impl);
  439.                         }catch(Exception e){
  440.                             logCore.debug("Recupero dati soggetto erogatore (implementazione pdd) dal registro fallito: "+e.getMessage(),e);
  441.                         }
  442.                     }
  443.                 }
  444.                
  445.                 // Set identità soggetti fruitori usati poi successivamente
  446.                 if(idSoggettoFruitore!=null && requestInfo.getRequestConfig()!=null) {
  447.                     if(requestInfo.getRequestConfig().getSoggettoFruitoreRegistry()==null) {
  448.                         try{
  449.                             org.openspcoop2.core.registry.Soggetto soggettoRegistry = registroServiziManager.getSoggetto(idSoggettoFruitore, null, null); // passo null volutamente, per accedere alla configurazione
  450.                             requestInfo.getRequestConfig().setSoggettoFruitoreRegistry(soggettoRegistry);
  451.                         }catch(Exception e){
  452.                             logCore.debug("Recupero soggetto fruitore dal registro fallito: "+e.getMessage(),e);
  453.                         }
  454.                     }
  455.                     if(requestInfo.getRequestConfig().getSoggettoFruitoreConfig()==null) {
  456.                         try{
  457.                             org.openspcoop2.core.config.Soggetto soggettoConfig = configurazionePdDManager.getSoggetto(idSoggettoFruitore, null); // passo null volutamente, per accedere alla configurazione
  458.                             requestInfo.getRequestConfig().setSoggettoFruitoreConfig(soggettoConfig);
  459.                         }catch(Exception e){
  460.                             logCore.debug("Recupero soggetto fruitore dal registro fallito: "+e.getMessage(),e);
  461.                         }
  462.                     }
  463.                     if(requestInfo.getRequestConfig().getSoggettoFruitoreIdentificativoPorta()==null) {
  464.                         try{
  465.                             String idPorta = configurazionePdDManager.getIdentificativoPorta(idSoggettoFruitore, pf, null); // passo null volutamente, per accedere alla configurazione
  466.                             requestInfo.getRequestConfig().setSoggettoFruitoreIdentificativoPorta(idPorta);
  467.                         }catch(Exception e){
  468.                             logCore.debug("Recupero dati soggetto fruitore (identificativoPorta) dal registro fallito: "+e.getMessage(),e);
  469.                         }
  470.                     }
  471.                     if(requestInfo.getRequestConfig().getSoggettoFruitoreSoggettoVirtuale()==null) {
  472.                         try{
  473.                             boolean soggettoVirtuale = configurazionePdDManager.isSoggettoVirtuale(idSoggettoFruitore, null); // passo null volutamente, per accedere alla configurazione
  474.                             requestInfo.getRequestConfig().setSoggettoFruitoreSoggettoVirtuale(soggettoVirtuale);
  475.                         }catch(Exception e){
  476.                             logCore.debug("Recupero dati soggetto fruitore (soggettoVirtuale) dal registro fallito: "+e.getMessage(),e);
  477.                         }
  478.                     }
  479.                     if(requestInfo.getRequestConfig().getSoggettoFruitorePddReaded()==null) {
  480.                         try{
  481.                             if(requestInfo.getRequestConfig().getSoggettoFruitoreRegistry()!=null) {
  482.                                 if(requestInfo.getRequestConfig().getSoggettoFruitoreRegistry().getPortaDominio()!=null &&
  483.                                         StringUtils.isNotEmpty(requestInfo.getRequestConfig().getSoggettoFruitoreRegistry().getPortaDominio())) {
  484.                                     PortaDominio pdd = registroServiziManager.getPortaDominio(requestInfo.getRequestConfig().getSoggettoFruitoreRegistry().getPortaDominio(), null, null); // passo null volutamente, per accedere alla configurazione
  485.                                     requestInfo.getRequestConfig().setSoggettoFruitorePddReaded(true);
  486.                                     requestInfo.getRequestConfig().setSoggettoFruitorePdd(pdd);
  487.                                 }
  488.                                 else {
  489.                                     requestInfo.getRequestConfig().setSoggettoFruitorePddReaded(true);
  490.                                 }
  491.                             }
  492.                         }catch(Exception e){
  493.                             logCore.debug("Recupero dati soggetto fruitore (pdd) dal registro fallito: "+e.getMessage(),e);
  494.                         }
  495.                     }
  496.                     if(requestInfo.getRequestConfig().getSoggettoFruitoreImplementazionePdd()==null) {
  497.                         try{
  498.                             String impl = registroServiziManager.getImplementazionePdD(idSoggettoFruitore, null, null); // passo null volutamente, per accedere alla configurazione
  499.                             requestInfo.getRequestConfig().setSoggettoFruitoreImplementazionePdd(impl);
  500.                         }catch(Exception e){
  501.                             logCore.debug("Recupero dati soggetto fruitore (implementazione pdd) dal registro fallito: "+e.getMessage(),e);
  502.                         }
  503.                     }
  504.                 }
  505.                
  506.                 // updateInformazioniCooperazione
  507.                 requestInfo.setFruitore(idSoggettoFruitore);
  508.                 requestInfo.setIdServizio(idServizio);
  509.                 if(generatoreErrore!=null){
  510.                     generatoreErrore.updateInformazioniCooperazione(idSoggettoFruitore, idServizio);
  511.                 }
  512.                                
  513.                 // Aggiorno service binding configuration rispetto al servizio localizzato
  514.                 try{
  515.                     bindingConfig = pf.createProtocolConfiguration().getServiceBindingConfiguration(protocolContext, integrationServiceBinding, idServizio, registryReader);
  516.                     requestInfo.setBindingConfig(bindingConfig);
  517.                 }catch(RegistryNotFound notFound){
  518.                     logCore.debug("Lettura Configurazione Servizio fallita (notFound): "+notFound.getMessage(),notFound);
  519.                     msgDiag.addKeywordErroreProcessamento(notFound);
  520.                     msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI,"portaDelegataNonEsistente");
  521.                     return ConnectorDispatcherUtils.doError(requestInfo, generatoreErrore,
  522.                             ErroriIntegrazione.ERRORE_405_SERVIZIO_NON_TROVATO.getErroreIntegrazione(),
  523.                             IntegrationFunctionError.API_OUT_UNKNOWN, notFound, null, res, logCore, ConnectorDispatcherUtils.CLIENT_ERROR);
  524.                 }catch(Exception error){
  525.                     logCore.error("Lettura Configurazione Servizio fallita: "+error.getMessage(),error);
  526.                     msgDiag.addKeywordErroreProcessamento(error);
  527.                     msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI,"portaDelegataNonEsistente");
  528.                     return ConnectorDispatcherUtils.doError(requestInfo, generatoreErrore,
  529.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.get5XX_ErroreProcessamento("Lettura Configurazione Servizio fallita"),
  530.                             IntegrationFunctionError.INTERNAL_REQUEST_ERROR, error, null, res, logCore, ConnectorDispatcherUtils.GENERAL_ERROR);
  531.                 }
  532.                
  533.                 // Verifico correttezza Content-Type
  534.                 String ct = null;
  535.                 try {
  536.                     ct = protocolContext.getContentType();
  537.                     if(ct!=null && !"".equals(ct)) {
  538.                         //new ContentType(ct).getBaseType();
  539.                         ContentTypeUtilities.validateContentType(ct);
  540.                     }
  541.                 }catch(Exception error){
  542.                     if(res!=null) {
  543.                         logCore.error("Lettura ContentType fallita: "+error.getMessage(),error);
  544.                         msgDiag.addKeywordErroreProcessamento(error);
  545.                         msgDiag.addKeyword(CostantiPdD.KEY_DETAILS, " Content-Type '"+ct+"' presente nella richiesta non valido;");
  546.                         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI,"richiestaNonValida");
  547.                         ConnectorDispatcherInfo cdiError = ConnectorDispatcherUtils.doError(requestInfo, generatoreErrore,
  548.                                 ErroriIntegrazione.ERRORE_432_PARSING_EXCEPTION_RICHIESTA.getErrore432_MessaggioRichiestaMalformato(error),
  549.                                 IntegrationFunctionError.BAD_REQUEST, error, null, res, logCore, ConnectorDispatcherUtils.CLIENT_ERROR);
  550.                         try {
  551.                             cdiError.setEsitoTransazione(pf.createEsitoBuilder().getEsito(requestInfo.getProtocolContext(),EsitoTransazioneName.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO));
  552.                             if(pddContextNullable!=null) {
  553.                                 pddContextNullable.addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO, true);
  554.                             }
  555.                         }catch(Throwable t) {
  556.                             // ignore
  557.                         }
  558.                         return cdiError;
  559.                     }
  560.                     return null;
  561.                 }
  562.                
  563.                 // Aggiorno message type
  564.                 try{
  565.                     MessageType requestMessageTypeIntegration = bindingConfig.getRequestMessageType(integrationServiceBinding,
  566.                             protocolContext, protocolContext.getContentType());
  567.                     requestInfo.setIntegrationRequestMessageType(requestMessageTypeIntegration);
  568.                    
  569.                     MessageType requestMessageTypeProtocol = bindingConfig.getRequestMessageType(protocolServiceBinding,
  570.                             protocolContext, protocolContext.getContentType());
  571.                     requestInfo.setProtocolRequestMessageType(requestMessageTypeProtocol);
  572.                    
  573.                     if(generatoreErrore!=null) {
  574.                         generatoreErrore.updateRequestMessageType(requestMessageTypeIntegration);
  575.                     }
  576.                 }catch(Exception error){
  577.                     logCore.error("Identificazione MessageType fallita: "+error.getMessage(),error);
  578.                     msgDiag.addKeywordErroreProcessamento(error);
  579.                     msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI,"portaDelegataNonEsistente");
  580.                     return ConnectorDispatcherUtils.doError(requestInfo, generatoreErrore,
  581.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.get5XX_ErroreProcessamento("Identificazione MessageType fallita"),
  582.                             IntegrationFunctionError.INTERNAL_REQUEST_ERROR, error, null, res, logCore, ConnectorDispatcherUtils.GENERAL_ERROR);
  583.                 }
  584.                
  585.                 // Controllo Service Binding rispetto alla url e al tipo di servizio
  586.                 if(requestInfo.getProtocolContext()!=null && bindingConfig.isServiceBindingContextEnabled(integrationServiceBinding, requestInfo.getProtocolContext().getProtocolWebContext())==false) {
  587.                     if(res!=null) {
  588.                         String url = requestInfo.getProtocolContext().getRequestURI();
  589.                         logCore.error("L'API invocata possiede un service binding '"+integrationServiceBinding+"' non abilitato sul contesto utilizzato: "+url);
  590.                         msgDiag.logErroreGenerico("L'API invocata possiede un service binding '"+integrationServiceBinding+"' non abilitato sul contesto utilizzato", "CheckServiceBinding");
  591.                         return ConnectorDispatcherUtils.doError(requestInfo, generatoreErrore,
  592.                                 ErroriIntegrazione.ERRORE_447_API_NON_INVOCABILE_CONTESTO_UTILIZZATO.getErroreIntegrazione(),
  593.                                 IntegrationFunctionError.NOT_SUPPORTED_BY_PROTOCOL, null, null, res, logCore, ConnectorDispatcherUtils.CLIENT_ERROR);
  594.                     }
  595.                     return null;
  596.                 }
  597.                 if(bindingConfig.isServiceBindingServiceTypeEnabled(integrationServiceBinding, idServizio.getTipo())==false) {
  598.                     if(res!=null) {
  599.                         logCore.error("L'API invocata possiede un service binding '"+integrationServiceBinding+"' non abilitato per il tipo di servizio '"+idServizio.getTipo()+"'");
  600.                         msgDiag.logErroreGenerico("L'API invocata possiede un service binding '"+integrationServiceBinding+"' non abilitato per il tipo di servizio '"+idServizio.getTipo(), "CheckServiceBinding");
  601.                         return ConnectorDispatcherUtils.doError(requestInfo, generatoreErrore,
  602.                                 ErroriIntegrazione.ERRORE_448_API_NON_INVOCABILE_TIPO_SERVIZIO_UTILIZZATO.getErroreIntegrazione(),
  603.                                 IntegrationFunctionError.NOT_SUPPORTED_BY_PROTOCOL, null, null, res, logCore, ConnectorDispatcherUtils.CLIENT_ERROR);
  604.                     }
  605.                     return null;
  606.                 }
  607.                
  608.             }
  609.         }
  610.            
  611.            
  612.         if(requestInfo!=null && requestInfo.getProtocolServiceBinding()!=null &&
  613.                 ServiceBinding.SOAP.equals(requestInfo.getProtocolServiceBinding()) &&
  614.                 requestInfo.getProtocolContext()!=null &&
  615.                 HttpRequestMethod.OPTIONS.name().equalsIgnoreCase(requestInfo.getProtocolContext().getRequestType())) {
  616.            
  617.             // Gestione CORS
  618.             try{
  619.                 CorsConfigurazione cors = null;
  620.                 HttpServletRequest httpServletRequest = null;
  621.                 if(requestInfo!=null && requestInfo.getProtocolContext()!=null) {
  622.                     httpServletRequest = requestInfo.getProtocolContext().getHttpServletRequest();  
  623.                 }
  624.                
  625.                 if(httpServletRequest!=null) {
  626.                     if(pdDefault!=null) {
  627.                         cors = configurazionePdDManager.getConfigurazioneCORS(pdDefault);
  628.                     }
  629.                     else {
  630.                         cors = configurazionePdDManager.getConfigurazioneCORS();
  631.                     }
  632.                 }
  633.                 else {
  634.                     cors = new CorsConfigurazione();
  635.                     cors.setStato(StatoFunzionalita.DISABILITATO);
  636.                 }
  637.                
  638.                 if(StatoFunzionalita.ABILITATO.equals(cors.getStato())) {
  639.                     if(TipoGestioneCORS.GATEWAY.equals(cors.getTipo())) {
  640.                        
  641.                         /*
  642.                        
  643.                         org.openspcoop2.pdd.core.CORSFilter corsFilter = new org.openspcoop2.pdd.core.CORSFilter(logCore, cors);
  644.                         org.openspcoop2.pdd.core.CORSWrappedHttpServletResponse resCORS = new org.openspcoop2.pdd.core.CORSWrappedHttpServletResponse(false);
  645.                         corsFilter.doCORS(httpServletRequest, resCORS, org.openspcoop2.utils.transport.http.CORSRequestType.PRE_FLIGHT, true);
  646.                         org.openspcoop2.message.OpenSPCoop2Message msgCORSResponse = resCORS.buildMessage();
  647.                         org.openspcoop2.protocol.sdk.builder.EsitoTransazione esito =
  648.                                 requestInfo.getProtocolFactory().createEsitoBuilder().getEsito(requestInfo.getProtocolContext(),
  649.                                         org.openspcoop2.protocol.sdk.constants.EsitoTransazioneName.CORS_PREFLIGHT_REQUEST_VIA_GATEWAY);
  650.                         ConnectorDispatcherInfo c = ConnectorDispatcherInfo.getGeneric(msgCORSResponse,
  651.                                 resCORS.getStatus(), null, resCORS.getHeader(), esito);
  652.                         if(pddContextNullable!=null) {
  653.                             pddContextNullable.addObject(org.openspcoop2.core.constants.Costanti.CORS_PREFLIGHT_REQUEST_VIA_GATEWAY, "true");
  654.                         }
  655.                         ConnectorDispatcherUtils.doInfo(c, requestInfo, res, logCore, true);
  656.                         return c;
  657.                        
  658.                         */
  659.                        
  660.                         // Fix per avere il dump anche nelle comunicazioni soap, converto in REST
  661.                         requestInfo.setIntegrationServiceBinding(ServiceBinding.REST);
  662.                         requestInfo.setProtocolServiceBinding(ServiceBinding.REST);
  663.                         generatoreErrore.updateServiceBinding(ServiceBinding.REST);
  664.                        
  665.                         requestInfo.setIntegrationRequestMessageType(MessageType.BINARY);
  666.                         requestInfo.setProtocolRequestMessageType(MessageType.BINARY);
  667.                         generatoreErrore.updateRequestMessageType(MessageType.BINARY);
  668.                        
  669.                         if(pddContextNullable!=null) {
  670.                             pddContextNullable.addObject(CostantiPdD.CORS_PREFLIGHT_REQUEST_SOAP, "true");
  671.                         }
  672.                        
  673.                     }
  674.                     else {
  675.                        
  676.                         if(pddContextNullable!=null) {
  677.                             pddContextNullable.addObject(org.openspcoop2.core.constants.Costanti.CORS_PREFLIGHT_REQUEST_TRASPARENTE, "true");
  678.                         }
  679.                        
  680.                         requestInfo.setIntegrationServiceBinding(ServiceBinding.REST);
  681.                         requestInfo.setProtocolServiceBinding(ServiceBinding.REST);
  682.                         generatoreErrore.updateServiceBinding(ServiceBinding.REST);
  683.                        
  684.                         requestInfo.setIntegrationRequestMessageType(MessageType.BINARY);
  685.                         requestInfo.setProtocolRequestMessageType(MessageType.BINARY);
  686.                         generatoreErrore.updateRequestMessageType(MessageType.BINARY);
  687.                     }
  688.                 }
  689.                
  690.             }catch(Exception error){
  691.                
  692.                 if(res!=null) {
  693.                     logCore.error("Gestione CORS fallita: "+error.getMessage(),error);
  694.                     msgDiag.addKeywordErroreProcessamento(error);
  695.                     msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI,"portaDelegataNonEsistente");
  696.                     return ConnectorDispatcherUtils.doError(requestInfo, generatoreErrore,
  697.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.get5XX_ErroreProcessamento("Gestione CORS fallita"),
  698.                             IntegrationFunctionError.INTERNAL_REQUEST_ERROR, error, null, res, logCore, ConnectorDispatcherUtils.GENERAL_ERROR);
  699.                 }
  700.                 return null;
  701.                
  702.             }
  703.         }
  704.        
  705.        
  706.         return null;
  707.     }
  708.    
  709.     public static void emitTransaction(Logger logCore, ConnectorInMessage req, PdDContext pddContext, Date dataAccettazioneRichiesta,
  710.             ConnectorDispatcherInfo info) {
  711.         emitTransaction(null, logCore, req, pddContext, dataAccettazioneRichiesta, info);
  712.     }
  713.     public static void emitTransaction(RicezioneContenutiApplicativiContext context,Logger logCore, ConnectorInMessage req, PdDContext pddContext, Date dataAccettazioneRichiesta,
  714.             ConnectorDispatcherInfo info) {
  715.         try {
  716.             if (!OpenSPCoop2Startup.initialize || OpenSPCoop2Properties.getInstance() == null) {
  717.                 logCore.error("emitTransaction, registrazione non effettuata: inizializzazione govway non rilevata");
  718.                 return;
  719.             }
  720.            
  721.             String idModulo = req.getIdModulo();
  722.             IDService idModuloAsService = req.getIdModuloAsIDService();
  723.             IProtocolFactory<?> protocolFactory = req.getProtocolFactory();
  724.             RequestInfo requestInfo = req.getRequestInfo();
  725.            
  726.             if(context!=null && context.getPddContext()!=null) {
  727.                 PreInRequestHandler.readClientAddress(logCore, req, context.getPddContext());
  728.                 if(OpenSPCoop2Properties.getInstance().isTransazioniEnabled()) {
  729.                     try {
  730.                         String idTransazione = (String) context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  731.                         if(idTransazione!=null) {
  732.                             Transaction tr = TransactionContext.getTransaction(idTransazione);
  733.                             PreInRequestHandler.setInfoInvocation(tr, requestInfo, req);
  734.                         }
  735.                     }catch(Throwable e){
  736.                         logCore.error("postOutResponse, lettura parametri fallita: "+e.getMessage(),e);
  737.                     }
  738.                 }
  739.             }
  740.            
  741.             emitTransaction(context,logCore, idModulo, idModuloAsService, protocolFactory, requestInfo, pddContext, dataAccettazioneRichiesta, info);
  742.         }catch(Throwable e){
  743.             logCore.error("postOutResponse, registrazione fallita: "+e.getMessage(),e);
  744.         }
  745.     }
  746.    
  747.     public static void emitTransaction(RicezioneContenutiApplicativiContext context,Logger logCore,String idModulo,IDService idModuloAsService, IProtocolFactory<?> protocolFactory, RequestInfo requestInfo,
  748.             PdDContext pddContext, Date dataAccettazioneRichiesta,
  749.             ConnectorDispatcherInfo info) {
  750.        
  751.         try {
  752.             if (!OpenSPCoop2Startup.initialize || OpenSPCoop2Properties.getInstance() == null) {
  753.                 logCore.error("postOutResponse, registrazione non effettuata: inizializzazione govway non rilevata");
  754.                 return;
  755.             }
  756.        
  757.             if(context==null) {
  758.                 context = new RicezioneContenutiApplicativiContext(idModuloAsService,dataAccettazioneRichiesta,requestInfo);
  759.             }
  760.            
  761.             PostOutResponseContext postOutResponseContext = new PostOutResponseContext(logCore,protocolFactory);
  762.             postOutResponseContext.setTipoPorta(TipoPdD.DELEGATA);
  763.             postOutResponseContext.setIdModulo(idModulo);
  764.            
  765.             postOutResponseContext.setPddContext(pddContext);
  766.             if(pddContext==null) {
  767.                 postOutResponseContext.setPddContext(context.getPddContext());
  768.             }
  769.             else {
  770.                 pddContext.addAll(context.getPddContext(), true);
  771.             }
  772.             postOutResponseContext.getPddContext().addObject(CostantiPdD.DATA_ACCETTAZIONE_RICHIESTA, dataAccettazioneRichiesta);

  773.             if(OpenSPCoop2Properties.getInstance().isTransazioniEnabled()) {
  774.                 // NOTA: se gia' esiste con l'id di transazione, non viene ricreata
  775.                 TransactionContext.createTransaction((String)postOutResponseContext.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE), "RicezioneContenutiApplicativi.3");
  776.             }
  777.            
  778.             postOutResponseContext.setDataElaborazioneMessaggio(DateManager.getDate());
  779.             postOutResponseContext.setEsito(info.getEsitoTransazione());
  780.             postOutResponseContext.setReturnCode(info.getStatus());
  781.             postOutResponseContext.setResponseHeaders(info.getTrasporto());
  782.             if(info.getContentType()!=null) {
  783.                 if(postOutResponseContext.getResponseHeaders()==null) {
  784.                     postOutResponseContext.setResponseHeaders(new HashMap<>());
  785.                 }
  786.                 TransportUtils.setHeader(postOutResponseContext.getResponseHeaders(),HttpConstants.CONTENT_TYPE, info.getContentType());
  787.             }
  788.                    
  789.             if(info.getMessage()!=null){
  790.                
  791.                 postOutResponseContext.setOutputResponseMessageSize(info.getMessage().getOutgoingMessageContentLength());
  792.                
  793.                 postOutResponseContext.setMessaggio(info.getMessage());
  794.             }
  795.    
  796.             MsgDiagnostico msgDiag = MsgDiagnostico.newInstance(TipoPdD.DELEGATA,idModulo);
  797.             msgDiag.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI);
  798.            
  799.             GestoreHandlers.postOutResponse(postOutResponseContext, msgDiag, logCore);
  800.            
  801.         }catch(Throwable e){
  802.             logCore.error("postOutResponse, registrazione fallita: "+e.getMessage(),e);
  803.         }
  804.    
  805.     }
  806. }