RicezioneContenutiApplicativiIntegrationManagerService.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.pdd.services.service;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import javax.xml.soap.SOAPFault;
import org.openspcoop2.core.config.DumpConfigurazione;
import org.openspcoop2.core.config.PortaDelegata;
import org.openspcoop2.core.constants.TipoPdD;
import org.openspcoop2.core.id.IDPortaDelegata;
import org.openspcoop2.message.OpenSPCoop2Message;
import org.openspcoop2.message.OpenSPCoop2MessageFactory;
import org.openspcoop2.message.OpenSPCoop2MessageParseResult;
import org.openspcoop2.message.OpenSPCoop2SoapMessage;
import org.openspcoop2.message.constants.MessageRole;
import org.openspcoop2.message.constants.MessageType;
import org.openspcoop2.message.constants.ServiceBinding;
import org.openspcoop2.message.exception.ParseException;
import org.openspcoop2.message.exception.ParseExceptionUtils;
import org.openspcoop2.message.soap.SoapUtils;
import org.openspcoop2.message.utils.MessageUtilities;
import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
import org.openspcoop2.pdd.core.CostantiPdD;
import org.openspcoop2.pdd.core.GestoreMessaggi;
import org.openspcoop2.pdd.core.PdDContext;
import org.openspcoop2.pdd.core.connettori.IConnettore;
import org.openspcoop2.pdd.core.connettori.RepositoryConnettori;
import org.openspcoop2.pdd.core.credenziali.Credenziali;
import org.openspcoop2.pdd.core.handlers.GestoreHandlers;
import org.openspcoop2.pdd.core.handlers.PostOutResponseContext;
import org.openspcoop2.pdd.core.handlers.PreInAcceptRequestContext;
import org.openspcoop2.pdd.core.handlers.PreInRequestContext;
import org.openspcoop2.pdd.core.integrazione.HeaderIntegrazione;
import org.openspcoop2.pdd.core.state.OpenSPCoopStateful;
import org.openspcoop2.pdd.core.transazioni.TransactionContext;
import org.openspcoop2.pdd.logger.Dump;
import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
import org.openspcoop2.pdd.logger.MsgDiagnostico;
import org.openspcoop2.pdd.logger.transazioni.ConfigurazioneTracciamento;
import org.openspcoop2.pdd.services.DumpRaw;
import org.openspcoop2.pdd.services.ServicesUtils;
import org.openspcoop2.pdd.services.connector.ConnectorDispatcherInfo;
import org.openspcoop2.pdd.services.connector.ConnectorUtils;
import org.openspcoop2.pdd.services.connector.messages.HttpServletConnectorInMessage;
import org.openspcoop2.pdd.services.connector.messages.HttpServletConnectorOutMessage;
import org.openspcoop2.pdd.services.core.RicezioneContenutiApplicativi;
import org.openspcoop2.pdd.services.core.RicezioneContenutiApplicativiContext;
import org.openspcoop2.pdd.services.error.RicezioneContenutiApplicativiInternalErrorGenerator;
import org.openspcoop2.pdd.services.skeleton.IntegrationManager;
import org.openspcoop2.pdd.services.skeleton.IntegrationManagerException;
import org.openspcoop2.pdd.services.skeleton.IntegrationManagerMessage;
import org.openspcoop2.pdd.services.skeleton.IntegrationManagerUtility;
import org.openspcoop2.pdd.services.skeleton.ProtocolHeaderInfo;
import org.openspcoop2.protocol.basic.registry.ServiceIdentificationReader;
import org.openspcoop2.protocol.engine.SecurityTokenUtilities;
import org.openspcoop2.protocol.engine.URLProtocolContextImpl;
import org.openspcoop2.protocol.engine.constants.Costanti;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.builder.EsitoTransazione;
import org.openspcoop2.protocol.sdk.builder.InformazioniErroriInfrastrutturali;
import org.openspcoop2.protocol.sdk.builder.ProprietaErroreApplicativo;
import org.openspcoop2.protocol.sdk.constants.CodiceErroreIntegrazione;
import org.openspcoop2.protocol.sdk.constants.ErroriIntegrazione;
import org.openspcoop2.protocol.sdk.constants.EsitoTransazioneName;
import org.openspcoop2.protocol.sdk.constants.IDService;
import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
import org.openspcoop2.protocol.sdk.state.RequestInfo;
import org.openspcoop2.protocol.sdk.state.URLProtocolContext;
import org.openspcoop2.protocol.utils.ErroriProperties;
import org.openspcoop2.utils.LimitExceededIOException;
import org.openspcoop2.utils.MapKey;
import org.openspcoop2.utils.TimeoutIOException;
import org.openspcoop2.utils.Utilities;
import org.openspcoop2.utils.date.DateManager;
import org.openspcoop2.utils.io.notifier.NotifierInputStreamParams;
import org.openspcoop2.utils.transport.TransportUtils;
import org.slf4j.Logger;
/**
* RicezioneContenutiApplicativiIntegrationManagerService
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class RicezioneContenutiApplicativiIntegrationManagerService {
public IntegrationManagerMessage process(String tipoOperazione, String portaDelegata, IntegrationManagerMessage msg,
String idInvocazionePerRiferimento,
Logger logCore, javax.servlet.http.HttpServletRequest req, HttpServletResponse res,
IProtocolFactory<?> protocolFactory, Date dataAccettazioneRichiesta, Date dataIngressoRichiesta) throws IntegrationManagerException {
String idModulo = RicezioneContenutiApplicativi.ID_MODULO+IntegrationManager.ID_MODULO;
ErroriProperties erroriProperties = null;
try {
erroriProperties = ErroriProperties.getInstance(logCore);
}catch(Exception Ignoree) {
// non succede
}
// Proprieta' OpenSPCoop
OpenSPCoop2Properties openSPCoopProperties = OpenSPCoop2Properties.getInstance();
if (openSPCoopProperties == null) {
String msgError = "Inizializzazione di GovWay non correttamente effettuata: OpenSPCoopProperties";
logCore.error(msgError);
try{
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(msgError,CodiceErroreIntegrazione.CODICE_501_PDD_NON_INIZIALIZZATA),
IntegrationFunctionError.GOVWAY_NOT_INITIALIZED, erroriProperties);
}catch(Throwable eError){
logCore.error("Errore generazione SOAPFault",eError);
throw new RuntimeException(eError); // errore che non dovrebbe accadare
}
}
RequestInfo requestInfo = null;
try{
// Request Info
URLProtocolContext urlProtocolContext = new URLProtocolContextImpl(req,logCore,true,true,openSPCoopProperties.getCustomContexts());
urlProtocolContext.setInterfaceName(portaDelegata);
if(protocolFactory==null) {
throw new Exception("ProtocolFactory is null");
}
requestInfo = ConnectorUtils.getRequestInfo(protocolFactory, urlProtocolContext);
if(requestInfo==null) {
throw new Exception("RequestInfo is null");
}
}catch(Exception e){
String msgError = "Lettura RequestInfo non riuscita: "+Utilities.readFirstErrorValidMessageFromException(e);
logCore.error(msgError);
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(msgError),
IntegrationFunctionError.INTERNAL_REQUEST_ERROR, erroriProperties);
}
/* ------------ PreInHandler (PreInAcceptRequestContext) ------------- */
// build context
PreInAcceptRequestContext preInAcceptRequestContext = new PreInAcceptRequestContext();
preInAcceptRequestContext.setTipoPorta(TipoPdD.DELEGATA);
preInAcceptRequestContext.setIdModulo(idModulo);
preInAcceptRequestContext.setRequestInfo(requestInfo);
preInAcceptRequestContext.setLogCore(logCore);
preInAcceptRequestContext.setReq(null);
// invocazione handler
GestoreHandlers.preInRequest(preInAcceptRequestContext, logCore, logCore);
// Configurazione Reader
ConfigurazionePdDManager configPdDManager = null;
try{
configPdDManager = ConfigurazionePdDManager.getInstance();
if(configPdDManager==null || configPdDManager.isInitializedConfigurazionePdDReader()==false){
throw new Exception("ConfigurazionePdDManager not initialized");
}
}catch(Throwable e){
String msgError = "Inizializzazione di GovWay non correttamente effettuata: ConfigurazionePdDManager";
logCore.error(msgError,e);
try{
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(msgError,CodiceErroreIntegrazione.CODICE_501_PDD_NON_INIZIALIZZATA),
IntegrationFunctionError.GOVWAY_NOT_INITIALIZED, erroriProperties);
}catch(Throwable eError){
logCore.error("Errore generazione SOAPFault",eError);
throw new RuntimeException(eError); // errore che non dovrebbe accadare
}
}
// Identifico Servizio per comprendere correttamente il messageType
ServiceIdentificationReader serviceIdentificationReader = null;
try{
serviceIdentificationReader = ServicesUtils.getServiceIdentificationReader(logCore, requestInfo,
configPdDManager.getRegistroServiziManager(), configPdDManager);
}catch(Exception e){
String msgError = "Inizializzazione RegistryReader fallita: "+Utilities.readFirstErrorValidMessageFromException(e);
logCore.error(msgError,e);
try{
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(msgError),
IntegrationFunctionError.GOVWAY_NOT_INITIALIZED, erroriProperties);
}catch(Throwable eError){
logCore.error("Errore generazione SOAPFault",eError);
throw new RuntimeException(eError); // errore che non dovrebbe accadare
}
}
// Provo a creare un context (per l'id di transazione nei diagnostici)
RicezioneContenutiApplicativiContext context = null;
try {
context = new RicezioneContenutiApplicativiContext(IDService.PORTA_DELEGATA_INTEGRATION_MANAGER, dataAccettazioneRichiesta,requestInfo);
String idTransazione = (String)context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
if(openSPCoopProperties.isTransazioniEnabled()) {
TransactionContext.createTransaction(idTransazione, "RicezioneContenutiApplicativiIM.1");
}
requestInfo.setIdTransazione(idTransazione);
}catch(Throwable e) {
context = null;
// non loggo l'errore tanto poi provo a ricreare il context subito dopo e li verra' registrato l'errore
}
// Logger dei messaggi diagnostici
String nomePorta = portaDelegata;
MsgDiagnostico msgDiag = MsgDiagnostico.newInstance(TipoPdD.DELEGATA,IntegrationManager.ID_MODULO,nomePorta,requestInfo,configPdDManager);
msgDiag.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_INTEGRATION_MANAGER);
msgDiag.addKeyword(CostantiPdD.KEY_TIPO_OPERAZIONE_IM, tipoOperazione);
if(context!=null) {
msgDiag.setPddContext(context.getPddContext(), protocolFactory);
}
try{
msgDiag.logPersonalizzato("ricezioneRichiesta.firstLog");
}catch(Exception e){
logCore.error("Errore generazione diagnostico di ingresso",e);
}
// emitDiagnostic preAccept handler
GestoreHandlers.emitDiagnostic(msgDiag, preInAcceptRequestContext, context!=null ? context.getPddContext() : null,
logCore, logCore);
// GeneratoreErrore
RicezioneContenutiApplicativiInternalErrorGenerator generatoreErrore = null;
try{
generatoreErrore =
new RicezioneContenutiApplicativiInternalErrorGenerator(logCore, idModulo, requestInfo);
}catch(Exception e){
String msgError = "Inizializzazione Generatore Errore fallita: "+Utilities.readFirstErrorValidMessageFromException(e);
msgDiag.logErroreGenerico(e,"Inizializzazione Generatore Errore");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(msgError),
IntegrationFunctionError.GOVWAY_NOT_INITIALIZED, erroriProperties);
}
// Aggiorno RequestInfo
try{
msgDiag.mediumDebug("Accesso configurazione della richiesta in corso...");
}catch(Exception e){
logCore.error("Errore generazione diagnostico",e);
}
ConnectorDispatcherInfo cInfo = null;
try{
cInfo = RicezioneContenutiApplicativiServiceUtils.updatePortaDelegataRequestInfo(requestInfo, logCore, null, null,
generatoreErrore, serviceIdentificationReader, msgDiag,
context!=null ? context.getPddContext(): null);
if(cInfo!=null){
try{
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
getErroreIntegrazione(),
IntegrationFunctionError.INTERNAL_REQUEST_ERROR, erroriProperties);
}catch(Throwable eError){
logCore.error("Errore generazione SOAPFault",eError);
throw new RuntimeException(eError); // errore che non dovrebbe accadare
}
}
}catch(Exception e){
String msgError = "Aggiornamento RequestInfo fallito: "+Utilities.readFirstErrorValidMessageFromException(e);
logCore.error(msgError,e);
try{
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(msgError),
IntegrationFunctionError.INTERNAL_REQUEST_ERROR, erroriProperties);
}catch(Throwable eError){
logCore.error("Errore generazione SOAPFault",eError);
throw new RuntimeException(eError); // errore che non dovrebbe accadare
}
}finally {
if(cInfo!=null) {
RicezioneContenutiApplicativiServiceUtils.emitTransaction(context,logCore, idModulo, IDService.PORTA_DELEGATA_INTEGRATION_MANAGER, protocolFactory, requestInfo,
null, dataAccettazioneRichiesta, cInfo);
}
}
// DumpRaw
DumpRaw dumpRaw = null;
try{
try{
msgDiag.mediumDebug("Lettura configurazione dump binario ...");
}catch(Exception e){
logCore.error("Errore generazione diagnostico",e);
}
boolean dumpBinario = configPdDManager.dumpBinarioPD();
PortaDelegata pd = null;
if(requestInfo!=null && requestInfo.getProtocolContext()!=null && requestInfo.getProtocolContext().getInterfaceName()!=null) {
IDPortaDelegata idPD = new IDPortaDelegata();
idPD.setNome(requestInfo.getProtocolContext().getInterfaceName());
pd = configPdDManager.getPortaDelegataSafeMethod(idPD, requestInfo);
}
try{
msgDiag.mediumDebug("Lettura configurazione dump ...");
}catch(Exception e){
logCore.error("Errore generazione diagnostico",e);
}
DumpConfigurazione dumpConfigurazione = configPdDManager.getDumpConfigurazione(pd);
ConfigurazioneTracciamento configurazioneTracciamento = new ConfigurazioneTracciamento(logCore, configPdDManager, pd);
boolean fileTraceHeaders = configurazioneTracciamento.isTransazioniFileTraceDumpBinarioHeaderEnabled();
boolean fileTracePayload = configurazioneTracciamento.isTransazioniFileTraceDumpBinarioPayloadEnabled();
dumpRaw = new DumpRaw(logCore,requestInfo.getIdentitaPdD(), idModulo, TipoPdD.DELEGATA,
dumpBinario,
dumpConfigurazione,
fileTraceHeaders, fileTracePayload);
}catch(Throwable e){
String msgError = "Inizializzazione di GovWay non correttamente effettuata: DumpRaw";
logCore.error(msgError,e);
try{
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(msgError,CodiceErroreIntegrazione.CODICE_501_PDD_NON_INIZIALIZZATA),
IntegrationFunctionError.GOVWAY_NOT_INITIALIZED, erroriProperties);
}catch(Throwable eError){
logCore.error("Errore generazione SOAPFault",eError);
throw new RuntimeException(eError); // errore che non dovrebbe accadare
}
}
/* ------------ Gestione ------------- */
OpenSPCoopStateful stato = null;
try{
try{
msgDiag.mediumDebug("Creazione contesto ...");
}catch(Exception e){
logCore.error("Errore generazione diagnostico",e);
}
// viene generato l'UUID
if(context==null) {
context = new RicezioneContenutiApplicativiContext(IDService.PORTA_DELEGATA_INTEGRATION_MANAGER, dataAccettazioneRichiesta,requestInfo);
}
if(preInAcceptRequestContext!=null && preInAcceptRequestContext.getPreContext()!=null && !preInAcceptRequestContext.getPreContext().isEmpty()) {
context.getPddContext().addAll(preInAcceptRequestContext.getPreContext(), false);
}
context.setDataIngressoRichiesta(dataIngressoRichiesta);
context.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME, protocolFactory.getProtocol());
context.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO, requestInfo);
RicezionePropertiesConfig rConfig = RicezioneContenutiApplicativiServiceUtils.readPropertiesConfig(requestInfo, logCore,null);
if(rConfig!=null) {
if (rConfig.getApiImplementation() != null && !rConfig.getApiImplementation().isEmpty()) {
context.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.PROPRIETA_CONFIGURAZIONE, rConfig.getApiImplementation());
}
if (rConfig.getSoggettoFruitore() != null && !rConfig.getSoggettoFruitore().isEmpty()) {
context.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.PROPRIETA_SOGGETTO_FRUITORE, rConfig.getSoggettoFruitore());
}
if (rConfig.getSoggettoErogatore() != null && !rConfig.getSoggettoErogatore().isEmpty()) {
context.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.PROPRIETA_SOGGETTO_EROGATORE, rConfig.getSoggettoErogatore());
}
}
context.getPddContext().addObject(CostantiPdD.TIPO_OPERAZIONE_IM, tipoOperazione);
context.setTipoPorta(TipoPdD.DELEGATA);
msgDiag.setPddContext(context.getPddContext(), protocolFactory);
if(dumpRaw!=null && dumpRaw.isActiveDump()){
dumpRaw.setPddContext(msgDiag.getPorta(), context.getPddContext());
}
}catch(Exception e){
msgDiag.logErroreGenerico(e,"invocaPortaDelegata_engine("+tipoOperazione+").newRicezioneContenutiApplicativiContext()");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreIntegrazione(),
IntegrationFunctionError.INTERNAL_REQUEST_ERROR, erroriProperties);
}
try{
if(openSPCoopProperties.isTransazioniEnabled()) {
// NOTA: se gia' esiste con l'id di transazione, non viene ricreata
TransactionContext.createTransaction((String)context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE),"RicezioneContenutiApplicativiIM.2");
}
}catch(Exception e){
logCore.error("Errore durante la creazione della transazione",e);
}
try{
msgDiag.logPersonalizzato("ricezioneRichiesta.firstAccessRequestStream");
}catch(Exception e){
logCore.error("Errore generazione diagnostico di ingresso (stream access)",e);
}
if(dumpRaw!=null && dumpRaw.isActiveDump()){
dumpRaw.serializeContext(context, protocolFactory.getProtocol());
}
// PddContext
String idTransazione = PdDContext.getValue(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE,context.getPddContext());
context.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE, idTransazione);
context.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.TIPO_OPERAZIONE_IM, tipoOperazione.toString());
context.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.ID_MESSAGGIO, idInvocazionePerRiferimento);
context.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.PORTA_DELEGATA, portaDelegata);
context.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME, protocolFactory.getProtocol());
EsitoTransazione esito = null;
String errore = null;
OpenSPCoop2Message msgRequest = null;
OpenSPCoop2Message msgResponse = null;
IntegrationManagerMessage msgReturn = null;
String descrizioneSoapFault = "";
URLProtocolContext urlProtocolContext = null;
try{
/* ------------ PreInHandler ------------- */
// build context
PreInRequestContext preInRequestContext = new PreInRequestContext(context.getPddContext());
preInRequestContext.setTipoPorta(TipoPdD.DELEGATA);
preInRequestContext.setIdModulo(idModulo);
preInRequestContext.setProtocolFactory(protocolFactory);
preInRequestContext.setRequestInfo(requestInfo);
Map<String, Object> transportContext = new HashMap<>();
HttpServletConnectorInMessage httpIn = null;
try{
httpIn = new HttpServletConnectorInMessage(requestInfo, req, IntegrationManager.ID_SERVICE, IntegrationManager.ID_MODULO);
transportContext.put(PreInRequestContext.SERVLET_REQUEST, httpIn);
}catch(Exception e){
ConnectorUtils.getErrorLog().error("HttpServletConnectorInMessage init error: "+e.getMessage(),e);
/**throw new ServletException(e.getMessage(),e);*/
}
HttpServletConnectorOutMessage httpOut = null;
try{
httpOut = new HttpServletConnectorOutMessage(requestInfo, protocolFactory, res, IntegrationManager.ID_SERVICE, IntegrationManager.ID_MODULO);
transportContext.put(PreInRequestContext.SERVLET_RESPONSE, httpOut);
}catch(Exception e){
ConnectorUtils.getErrorLog().error("HttpServletConnectorOutMessage init error: "+e.getMessage(),e);
/**throw new ServletException(e.getMessage(),e);*/
}
preInRequestContext.setTransportContext(transportContext);
preInRequestContext.setLogCore(logCore);
// invocazione handler
GestoreHandlers.preInRequest(preInRequestContext, msgDiag, logCore);
// aggiungo eventuali info inserite nel preInHandler
context.getPddContext().addAll(preInRequestContext.getPddContext(), false);
// Lettura risposta parametri NotifierInputStream
NotifierInputStreamParams notifierInputStreamParams = preInRequestContext.getNotifierInputStreamParams();
context.setNotifierInputStreamParams(notifierInputStreamParams);
msgDiag.logPersonalizzato("ricezioneRichiesta.elaborazioneDati.tipologiaMessaggio");
/* ------------ Validazione INPUT in base all'operaizone invocata ------------- */
if("invocaPortaDelegata".equals(tipoOperazione)){
// check presenza body applicativo
if(msg==null || msg.getMessage()==null){
msgDiag.logPersonalizzato("invocazionePortaDelegata.contenutoApplicativoNonPresente");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_520_READ_MSG_FROM_INTEGRATION_MANAGER),
IntegrationFunctionError.BAD_REQUEST, erroriProperties);
}
}
else if("invocaPortaDelegataPerRiferimento".equals(tipoOperazione)){
// check presenza riferimento
if(idInvocazionePerRiferimento==null){
msgDiag.logPersonalizzato("invocazionePortaDelegataPerRiferimento.riferimentoMessaggioNonPresente");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_520_READ_MSG_FROM_INTEGRATION_MANAGER),
IntegrationFunctionError.BAD_REQUEST, erroriProperties);
}
}
else if("sendRispostaAsincronaSimmetrica".equals(tipoOperazione)){
// check presenza body applicativo
if(msg==null || msg.getMessage()==null){
msgDiag.logPersonalizzato("invocazionePortaDelegata.contenutoApplicativoNonPresente");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_520_READ_MSG_FROM_INTEGRATION_MANAGER),
IntegrationFunctionError.BAD_REQUEST, erroriProperties);
}
// check presenza id di correlazione asincrona
if(msg.getProtocolHeaderInfo()==null || msg.getProtocolHeaderInfo().getRiferimentoMessaggio()==null){
msgDiag.logPersonalizzato("invocazionePortaDelegata.profiloAsincrono.riferimentoMessaggioNonPresente");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_520_READ_MSG_FROM_INTEGRATION_MANAGER),
IntegrationFunctionError.CORRELATION_INFORMATION_NOT_FOUND, erroriProperties);
}
}
else if("sendRichiestaStatoAsincronaAsimmetrica".equals(tipoOperazione)){
// check presenza body applicativo
if(msg==null || msg.getMessage()==null){
msgDiag.logPersonalizzato("invocazionePortaDelegata.contenutoApplicativoNonPresente");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_520_READ_MSG_FROM_INTEGRATION_MANAGER),
IntegrationFunctionError.BAD_REQUEST, erroriProperties);
}
// check presenza id di correlazione asincrona
if(msg.getProtocolHeaderInfo()==null || msg.getProtocolHeaderInfo().getRiferimentoMessaggio()==null){
msgDiag.logPersonalizzato("invocazionePortaDelegata.profiloAsincrono.riferimentoMessaggioNonPresente");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_520_READ_MSG_FROM_INTEGRATION_MANAGER),
IntegrationFunctionError.CORRELATION_INFORMATION_NOT_FOUND, erroriProperties);
}
}
else{
throw new Exception("Tipo operazione ["+tipoOperazione+"] non gestita");
}
/* ------------ Lettura parametri della richiesta ------------- */
// Credenziali utilizzate nella richiesta
Credenziali credenziali = new Credenziali(requestInfo.getProtocolContext().getCredential());
// Credenziali credenziali = (Credenziali) msgContext.get("openspcoop.credenziali");
String credenzialiFornite = "";
if(credenziali!=null){
credenzialiFornite = credenziali.toString();
msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI_SA_FRUITORE, credenzialiFornite);
}
String invPerRiferimento = "";
if(idInvocazionePerRiferimento!=null)
invPerRiferimento = " idInvocazionePerRiferimento["+idInvocazionePerRiferimento+"]";
String riferimentoMessaggio = "";
if(msg.getProtocolHeaderInfo()!=null && msg.getProtocolHeaderInfo().getRiferimentoMessaggio()!=null){
riferimentoMessaggio = " riferimentoMessaggio["+msg.getProtocolHeaderInfo().getRiferimentoMessaggio()+"]";
}
String param = "PD["+portaDelegata+"]"+credenzialiFornite+invPerRiferimento+riferimentoMessaggio;
msgDiag.addKeyword(CostantiPdD.KEY_PARAMETRI_OPERAZIONE_IM, param);
msgDiag.logPersonalizzato("logInvocazioneOperazione");
// Properties Trasporto
Map<String, List<String>> headerTrasporto = null;
if(openSPCoopProperties.integrationManager_readInformazioniTrasporto()){
headerTrasporto = new HashMap<>();
java.util.Enumeration<?> enTrasporto = req.getHeaderNames();
while(enTrasporto.hasMoreElements()){
String nomeHeader = (String)enTrasporto.nextElement();
Enumeration<String> enValues = req.getHeaders(nomeHeader);
List<String> values = new ArrayList<>();
if(enValues!=null) {
@SuppressWarnings("unused")
int i = 0;
while (enValues.hasMoreElements()) {
String value = (String) enValues.nextElement();
values.add(value);
//logCore.info("Header ["+nomeHeader+"] valore-"+i+" ["+value+"]");
i++;
}
}
if(values.isEmpty()) {
//logCore.info("Header ["+nomeHeader+"] valore ["+req.getHeader(nomeHeader)+"]");
values.add(req.getHeader(nomeHeader));
}
headerTrasporto.put(nomeHeader,values);
}
}
// Parametri della porta delegata invocata
urlProtocolContext = new URLProtocolContextImpl(logCore);
urlProtocolContext.setInterfaceName(portaDelegata);
urlProtocolContext.setFunctionParameters(portaDelegata);
urlProtocolContext.setRequestURI(portaDelegata);
urlProtocolContext.setFunction(URLProtocolContext.IntegrationManager_FUNCTION);
urlProtocolContext.setProtocol(protocolFactory.getProtocol(),
requestInfo.getProtocolContext().getProtocolWebContext());
if(openSPCoopProperties.integrationManager_readInformazioniTrasporto()){
urlProtocolContext.setHeaders(headerTrasporto);
}
// Messaggio di richiesta
msgDiag.logPersonalizzato("ricezioneRichiesta.elaborazioneDati.inCorso");
Utilities.printFreeMemory("IntegrationManager - Pre costruzione richiesta");
if(idInvocazionePerRiferimento!=null){
if(dumpRaw!=null && dumpRaw.isActiveDump()){
String contentTypeRichiesta = null; // idInvocazionePerRiferimento
Integer contentLengthRichiesta = null;
String rawMessage = idInvocazionePerRiferimento;
dumpRaw.serializeRequest(contentTypeRichiesta, contentLengthRichiesta, requestInfo.getProtocolContext().getCredential(),
urlProtocolContext, rawMessage, null);
}
stato = new OpenSPCoopStateful();
stato.initResource(openSPCoopProperties.getIdentitaPortaDefault(protocolFactory.getProtocol(), requestInfo),IntegrationManager.ID_MODULO,idTransazione);
configPdDManager = configPdDManager.refreshState(stato.getStatoRichiesta(),stato.getStatoRisposta());
msgDiag.updateState(configPdDManager);
// Leggo Messaggio
try{
GestoreMessaggi gestoreMessaggio = new GestoreMessaggi(stato, true,idInvocazionePerRiferimento,Costanti.INBOX,msgDiag,context.getPddContext());
msgRequest = gestoreMessaggio.getMessage();
}catch(Exception e){
msgDiag.logErroreGenerico(e,"gestoreMessaggio.getMessagePerRiferimento("+idInvocazionePerRiferimento+")");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_520_READ_MSG_FROM_INTEGRATION_MANAGER),
IntegrationFunctionError.INTERNAL_REQUEST_ERROR, erroriProperties);
}
// Rilascio Connessione DB
stato.releaseResource();
stato = null;
}else{
if(dumpRaw!=null && dumpRaw.isActiveDump()){
String contentTypeRichiesta = "text/xml"; // per ora e' cablato.
Integer contentLengthRichiesta = null;
String rawMessage = null;
if(msg.getMessage()!=null){
try{
contentLengthRichiesta = msg.getMessage().length;
rawMessage = new String(msg.getMessage());
}catch(Throwable t){
logCore.error("Dump error: "+t.getMessage(),t);
}
}
dumpRaw.serializeRequest(contentTypeRichiesta, contentLengthRichiesta, requestInfo.getProtocolContext().getCredential(),
urlProtocolContext, rawMessage, null);
}
// Ricostruzione Messaggio
try{
MessageType messageType = MessageType.SOAP_11; // todo parametrico
String contentType = MessageUtilities.getDefaultContentType(messageType); // todo parametrico
String soapAction = "OpenSPCoop"; // todo parametrico
ByteArrayInputStream bin = new ByteArrayInputStream(msg.getMessage());
OpenSPCoop2MessageParseResult pr = null;
OpenSPCoop2MessageFactory factory = org.openspcoop2.pdd.core.Utilities.getOpenspcoop2MessageFactory(logCore,requestInfo, MessageRole.REQUEST);
if(msg.getImbustamento()){
pr = factory.envelopingMessage(messageType, MessageRole.REQUEST, contentType, soapAction, bin,
notifierInputStreamParams, openSPCoopProperties.getAttachmentsProcessingMode(),
openSPCoopProperties.isDeleteInstructionTargetMachineXml(),
openSPCoopProperties.useSoapMessageReader(), openSPCoopProperties.getSoapMessageReaderBufferThresholdKb());
}
else{
pr = factory.createMessage(messageType, MessageRole.REQUEST, contentType,
bin, notifierInputStreamParams, openSPCoopProperties.getAttachmentsProcessingMode());
}
if(pr.getParseException()!=null){
context.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO_PARSE_EXCEPTION, pr.getParseException());
}
msgRequest = pr.getMessage_throwParseException();
msgRequest.setTransportRequestContext(urlProtocolContext);
}catch(Exception e){
Throwable tParsing = null;
ParseException parseException = null;
if(context.getPddContext().containsKey(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO_PARSE_EXCEPTION)){
parseException = (ParseException) context.getPddContext().removeObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO_PARSE_EXCEPTION);
if(parseException!=null) {
tParsing = parseException.getParseException();
}
}
if(tParsing==null){
tParsing = ParseExceptionUtils.getParseException(e);
}
if(tParsing==null){
tParsing = e;
}
String msgErrore = tParsing.getMessage();
if(msgErrore==null){
msgErrore = tParsing.toString();
}
context.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO, true);
ConfigurazionePdDManager configurazionePdDReader = ConfigurazionePdDManager.getInstance();
DumpConfigurazione dumpConfig = null;
if(portaDelegata!=null) {
IDPortaDelegata identificativoPortaDelegata = new IDPortaDelegata();
identificativoPortaDelegata.setNome(portaDelegata);
PortaDelegata portaDelegataObject = configurazionePdDReader.getPortaDelegataSafeMethod(identificativoPortaDelegata, requestInfo);
if(portaDelegataObject!=null) {
dumpConfig = configurazionePdDReader.getDumpConfigurazione(portaDelegataObject);
}
}
if(dumpConfig==null) {
dumpConfig = ConfigurazionePdDManager.getInstance().getDumpConfigurazionePortaDelegata();
}
Dump dumpApplicativo = new Dump(openSPCoopProperties.getIdentitaPortaDefault(protocolFactory.getProtocol(), requestInfo),
IntegrationManager.ID_MODULO,TipoPdD.DELEGATA,portaDelegata,context.getPddContext(),
null,null,
dumpConfig);
dumpApplicativo.dumpRichiestaIngressoByIntegrationManagerError(msg.getMessage(),urlProtocolContext);
//IntegrationManager.buildInfoConnettoreIngresso(req, credenziali, urlProtocolContext));
IntegrationFunctionError integrationFunctionError = IntegrationFunctionError.UNPROCESSABLE_REQUEST_CONTENT;
if( parseException!=null && parseException.getSourceException()!=null &&
TimeoutIOException.isTimeoutIOException(parseException.getSourceException())) {
integrationFunctionError = IntegrationFunctionError.REQUEST_TIMED_OUT;
}
else if( parseException!=null && parseException.getSourceException()!=null &&
LimitExceededIOException.isLimitExceededIOException(parseException.getSourceException())) {
integrationFunctionError = IntegrationFunctionError.REQUEST_SIZE_EXCEEDED;
}
if(msg.getImbustamento()==false){
msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, msgErrore);
msgDiag.logPersonalizzato("buildMsg.nonRiuscito");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_421_MSG_SOAP_NON_COSTRUIBILE_TRAMITE_RICHIESTA_APPLICATIVA.
getErrore421_MessaggioSOAPNonGenerabile(msgErrore),
integrationFunctionError, erroriProperties);
} else {
msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, msgErrore);
msgDiag.logPersonalizzato("buildMsg.imbustamentoSOAP.nonRiuscito");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_422_IMBUSTAMENTO_SOAP_NON_RIUSCITO_RICHIESTA_APPLICATIVA.
getErrore422_MessaggioSOAPNonGenerabileTramiteImbustamentoSOAP(msgErrore),
integrationFunctionError, erroriProperties);
}
}
}
Utilities.printFreeMemory("IntegrationManager - Post costruzione richiesta");
if(msgRequest!=null) {
msgRequest.setProtocolName(protocolFactory.getProtocol());
msgRequest.setTransactionId( idTransazione);
Object nomePortaInvocataObject = context.getPddContext().getObject(CostantiPdD.NOME_PORTA_INVOCATA);
if(nomePortaInvocataObject!=null && nomePortaInvocataObject instanceof String) {
msgRequest.addContextProperty(CostantiPdD.NOME_PORTA_INVOCATA, (String) nomePortaInvocataObject );
}
}
// Costruisco HeaderIntegrazione IntegrationManager
HeaderIntegrazione headerIntegrazioneRichiesta = new HeaderIntegrazione(idTransazione);
// Identificazione Porta Delegata INPUT-BASED
ProtocolHeaderInfo protocolHeaderInfo = msg.getProtocolHeaderInfo();
if(protocolHeaderInfo!=null){
if(protocolHeaderInfo.getTipoMittente()!=null && (!"".equals(protocolHeaderInfo.getTipoMittente())))
headerIntegrazioneRichiesta.getBusta().setTipoMittente(protocolHeaderInfo.getTipoMittente());
if(protocolHeaderInfo.getMittente()!=null && (!"".equals(protocolHeaderInfo.getMittente())))
headerIntegrazioneRichiesta.getBusta().setMittente(protocolHeaderInfo.getMittente());
if(protocolHeaderInfo.getTipoDestinatario()!=null && (!"".equals(protocolHeaderInfo.getTipoDestinatario())))
headerIntegrazioneRichiesta.getBusta().setTipoDestinatario(protocolHeaderInfo.getTipoDestinatario());
if(protocolHeaderInfo.getDestinatario()!=null && (!"".equals(protocolHeaderInfo.getDestinatario())))
headerIntegrazioneRichiesta.getBusta().setDestinatario(protocolHeaderInfo.getDestinatario());
if(protocolHeaderInfo.getTipoServizio()!=null && (!"".equals(protocolHeaderInfo.getTipoServizio())))
headerIntegrazioneRichiesta.getBusta().setTipoServizio(protocolHeaderInfo.getTipoServizio());
if(protocolHeaderInfo.getServizio()!=null && (!"".equals(protocolHeaderInfo.getServizio())))
headerIntegrazioneRichiesta.getBusta().setServizio(protocolHeaderInfo.getServizio());
if(protocolHeaderInfo.getAzione()!=null && (!"".equals(protocolHeaderInfo.getAzione())))
headerIntegrazioneRichiesta.getBusta().setAzione(protocolHeaderInfo.getAzione());
if(protocolHeaderInfo.getID()!=null && (!"".equals(protocolHeaderInfo.getID())))
headerIntegrazioneRichiesta.getBusta().setID(protocolHeaderInfo.getID());
if(protocolHeaderInfo.getIdCollaborazione()!=null && (!"".equals(protocolHeaderInfo.getIdCollaborazione())))
headerIntegrazioneRichiesta.getBusta().setIdCollaborazione(protocolHeaderInfo.getIdCollaborazione());
if(protocolHeaderInfo.getRiferimentoMessaggio()!=null && (!"".equals(protocolHeaderInfo.getRiferimentoMessaggio())))
headerIntegrazioneRichiesta.getBusta().setRiferimentoMessaggio(protocolHeaderInfo.getRiferimentoMessaggio());
}
if(msg.getIdApplicativo()!=null && (!"".equals(msg.getIdApplicativo())))
headerIntegrazioneRichiesta.setIdApplicativo(msg.getIdApplicativo());
if(msg.getServizioApplicativo()!=null && (!"".equals(msg.getServizioApplicativo())))
headerIntegrazioneRichiesta.setServizioApplicativo(msg.getServizioApplicativo());
// Contesto di Richiesta
context.setTipoPorta(TipoPdD.DELEGATA);
context.setCredenziali(credenziali);
context.setIdModulo(idModulo);
context.setGestioneRisposta(true); // siamo in un webServices, la risposta deve essere aspettata
context.setInvocazionePDPerRiferimento(idInvocazionePerRiferimento!=null);
context.setIdInvocazionePDPerRiferimento(idInvocazionePerRiferimento);
context.setMessageRequest(msgRequest);
context.setUrlProtocolContext(urlProtocolContext);
context.setHeaderIntegrazioneRichiesta(headerIntegrazioneRichiesta);
context.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME, protocolFactory.getProtocol());
context.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO, requestInfo);
context.setProprietaErroreAppl(generatoreErrore.getProprietaErroreAppl());
if(context.getMsgDiagnostico()==null) {
context.setMsgDiagnostico(msgDiag);
}
/* --------------- SecurityToken --------------- */
try {
if(requestInfo!=null && requestInfo.getProtocolContext()!=null && requestInfo.getProtocolContext().getCredential()!=null &&
requestInfo.getProtocolContext().getCredential().getCertificate()!=null &&
requestInfo.getProtocolContext().getCredential().getCertificate().getCertificate()!=null) {
SecurityTokenUtilities.newSecurityToken(context.getPddContext());
}
}catch(Exception e){
logCore.error("Costruzione SecurityToken non riuscito: "+e.getMessage(),e);
}
// Log elaborazione dati completata
msgDiag.logPersonalizzato("ricezioneRichiesta.elaborazioneDati.completata");
// Invocazione...
RicezioneContenutiApplicativi gestoreRichiesta = new RicezioneContenutiApplicativi(context,generatoreErrore);
gestoreRichiesta.process(req);
msgResponse = context.getMessageResponse();
if(context.getMsgDiagnostico()!=null){
msgDiag = context.getMsgDiagnostico();
// Aggiorno informazioni
msgDiag.addKeyword(CostantiPdD.KEY_TIPO_OPERAZIONE_IM, tipoOperazione);
}
// Check parsing request
if((msgRequest!=null && msgRequest.getParseException() != null) ||
(context.getPddContext().containsKey(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO_PARSE_EXCEPTION))){
// Senno l'esito viene forzato essere 5XX
try{
esito = protocolFactory.createEsitoBuilder().getEsito(urlProtocolContext,EsitoTransazioneName.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO);
}catch(Exception eBuildError){
esito = EsitoTransazione.ESITO_TRANSAZIONE_ERROR;
}
context.getPddContext().addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO, true);
ParseException parseException = null;
if( msgRequest!=null && msgRequest.getParseException() != null ){
parseException = msgRequest.getParseException();
}
else{
parseException = (ParseException) context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO_PARSE_EXCEPTION);
}
String msgErrore = null;
if(parseException!=null && parseException.getParseException()!=null) {
msgErrore = parseException.getParseException().getMessage();
if(msgErrore==null){
msgErrore = parseException.getParseException().toString();
}
}
msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, msgErrore);
if(parseException!=null) {
logCore.error("parsingExceptionRichiesta",parseException.getSourceException());
}
// msgDiag.logPersonalizzato("parsingExceptionRichiesta");
// throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_432_PARSING_EXCEPTION_RICHIESTA.
// getErrore432_MessaggioRichiestaMalformato(parseException.getParseException()));
// Per l'IntegrationManager esiste un codice specifico
IntegrationFunctionError integrationFunctionError = IntegrationFunctionError.UNPROCESSABLE_REQUEST_CONTENT;
if( parseException!=null && parseException.getSourceException()!=null &&
TimeoutIOException.isTimeoutIOException(parseException.getSourceException())) {
integrationFunctionError = IntegrationFunctionError.REQUEST_TIMED_OUT;
}
else if( parseException!=null && parseException.getSourceException()!=null &&
LimitExceededIOException.isLimitExceededIOException(parseException.getSourceException())) {
integrationFunctionError = IntegrationFunctionError.REQUEST_SIZE_EXCEEDED;
}
msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_INTEGRATION_MANAGER,"buildMsg.nonRiuscito");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_421_MSG_SOAP_NON_COSTRUIBILE_TRAMITE_RICHIESTA_APPLICATIVA.
getErrore421_MessaggioSOAPNonGenerabile(msgErrore),
integrationFunctionError, erroriProperties);
}
// Raccolgo l'eventuale header di integrazione
Map<String, List<String>> headerIntegrazioneRisposta = context.getResponseHeaders();
ProtocolHeaderInfo protocolHeaderInfoResponse = null;
if(headerIntegrazioneRisposta!=null){
Map<MapKey<String>,String> keyValue = openSPCoopProperties.getKeyValue_HeaderIntegrazioneTrasporto();
protocolHeaderInfoResponse = new ProtocolHeaderInfo();
protocolHeaderInfoResponse.setID(TransportUtils.getFirstValue(headerIntegrazioneRisposta,keyValue.get(CostantiPdD.HEADER_INTEGRAZIONE_ID_MESSAGGIO)));
protocolHeaderInfoResponse.setRiferimentoMessaggio(TransportUtils.getFirstValue(headerIntegrazioneRisposta,keyValue.get(CostantiPdD.HEADER_INTEGRAZIONE_RIFERIMENTO_MESSAGGIO)));
protocolHeaderInfoResponse.setIdCollaborazione(TransportUtils.getFirstValue(headerIntegrazioneRisposta,keyValue.get(CostantiPdD.HEADER_INTEGRAZIONE_COLLABORAZIONE)));
protocolHeaderInfoResponse.setMittente(TransportUtils.getFirstValue(headerIntegrazioneRisposta,keyValue.get(CostantiPdD.HEADER_INTEGRAZIONE_MITTENTE)));
protocolHeaderInfoResponse.setTipoMittente(TransportUtils.getFirstValue(headerIntegrazioneRisposta,keyValue.get(CostantiPdD.HEADER_INTEGRAZIONE_TIPO_MITTENTE)));
protocolHeaderInfoResponse.setDestinatario(TransportUtils.getFirstValue(headerIntegrazioneRisposta,keyValue.get(CostantiPdD.HEADER_INTEGRAZIONE_DESTINATARIO)));
protocolHeaderInfoResponse.setTipoDestinatario(TransportUtils.getFirstValue(headerIntegrazioneRisposta,keyValue.get(CostantiPdD.HEADER_INTEGRAZIONE_TIPO_DESTINATARIO)));
protocolHeaderInfoResponse.setServizio(TransportUtils.getFirstValue(headerIntegrazioneRisposta,keyValue.get(CostantiPdD.HEADER_INTEGRAZIONE_SERVIZIO)));
protocolHeaderInfoResponse.setTipoServizio(TransportUtils.getFirstValue(headerIntegrazioneRisposta,keyValue.get(CostantiPdD.HEADER_INTEGRAZIONE_TIPO_SERVIZIO)));
protocolHeaderInfoResponse.setAzione(TransportUtils.getFirstValue(headerIntegrazioneRisposta,keyValue.get(CostantiPdD.HEADER_INTEGRAZIONE_AZIONE)));
}
InformazioniErroriInfrastrutturali informazioniErrori = ServicesUtils.readInformazioniErroriInfrastrutturali(context.getPddContext());
// IntepretazioneRisposta
if(msgResponse!=null){
esito = protocolFactory.createEsitoBuilder().getEsito(urlProtocolContext,
200, requestInfo.getIntegrationServiceBinding(),
msgResponse,
context.getProprietaErroreAppl(), informazioniErrori,
context.getPddContext()!=null ? context.getPddContext() : null);
IntegrationManagerException exc = null;
try{
if(ServiceBinding.SOAP.equals(msgResponse.getServiceBinding())){
OpenSPCoop2SoapMessage soapMessage = msgResponse.castAsSoap();
if(soapMessage.hasSOAPFault()){
descrizioneSoapFault = " ("+SoapUtils.safe_toString(soapMessage.getFactory(), soapMessage.getSOAPBody().getFault(), false, logCore)+")";
// Potenziale MsgErroreApplicativo
SOAPFault fault = soapMessage.getSOAPBody().getFault();
ProprietaErroreApplicativo pea = context.getProprietaErroreAppl();
if(pea!=null && fault.getFaultActor()!=null && fault.getFaultActor().equals(pea.getFaultActor())){
String prefix = org.openspcoop2.protocol.basic.Costanti.ERRORE_INTEGRAZIONE_PREFIX_CODE;
if(context.getProprietaErroreAppl().getFaultPrefixCode()!=null){
prefix = context.getProprietaErroreAppl().getFaultPrefixCode();
}
String faultCode = null;
if(fault.getFaultCodeAsQName()!=null) {
faultCode = fault.getFaultCodeAsQName().getLocalPart();
}
else {
faultCode = fault.getFaultCode();
}
exc = IntegrationManagerUtility.mapMessageIntoProtocolException(soapMessage, faultCode, fault.getFaultString(),
requestInfo.getIdentitaPdD(), idModulo);
if(exc==null) {// non si dovrebbe arrivare a questo if
if(openSPCoopProperties.isErroreApplicativoIntoDetails() && fault.getDetail()!=null){
exc = IntegrationManagerUtility.mapXMLIntoProtocolException(protocolFactory,fault.getDetail().getFirstChild(),
prefix,
IntegrationFunctionError.INTERNAL_REQUEST_ERROR, erroriProperties);
}else{
exc = IntegrationManagerUtility.mapXMLIntoProtocolException(protocolFactory,fault.getFaultString(),
prefix,
IntegrationFunctionError.INTERNAL_REQUEST_ERROR, erroriProperties);
}
}
if(exc== null)
throw new Exception("Costruzione Eccezione fallita: null");
}
}
}
}catch(Exception e){
try{
if( (msgResponse!=null && msgResponse.getParseException() != null) ||
(context.getPddContext().containsKey(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO_PARSE_EXCEPTION))){
informazioniErrori.setContenutoRispostaNonRiconosciuto(true);
ParseException parseException = null;
if( msgResponse!=null && msgResponse.getParseException() != null ){
parseException = msgResponse.getParseException();
}
else{
parseException = (ParseException) context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO_PARSE_EXCEPTION);
}
String msgErrore = parseException.getParseException().getMessage();
if(msgErrore==null){
msgErrore = parseException.getParseException().toString();
}
msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, msgErrore);
logCore.error("parsingExceptionRisposta",parseException.getSourceException());
msgDiag.logPersonalizzato("parsingExceptionRisposta");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_440_PARSING_EXCEPTION_RISPOSTA.
getErrore440_MessaggioRispostaMalformato(parseException.getParseException()),
IntegrationFunctionError.UNPROCESSABLE_RESPONSE_CONTENT, erroriProperties);
}
else{
msgDiag.logErroreGenerico(e,"buildProtocolException("+tipoOperazione+")");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_524_CREAZIONE_PROTOCOL_EXCEPTION),
IntegrationFunctionError.INTERNAL_REQUEST_ERROR, erroriProperties);
}
}finally{
// ricalcolo esito
esito = protocolFactory.createEsitoBuilder().getEsito(urlProtocolContext,
500, requestInfo.getIntegrationServiceBinding(),
msgResponse,
context.getProprietaErroreAppl(), informazioniErrori,
(context.getPddContext()!=null ? context.getPddContext() : null));
}
}
if(exc!=null){
throw exc;
}
// Se non ho lanciato l'eccezione, costruisco una risposta
try{
msgReturn = new IntegrationManagerMessage(msgResponse,false);
}catch(Exception e){
try{
if( (msgResponse!=null && msgResponse.getParseException() != null) ||
(context.getPddContext().containsKey(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO_PARSE_EXCEPTION))){
informazioniErrori.setContenutoRispostaNonRiconosciuto(true);
ParseException parseException = null;
if( msgResponse!=null && msgResponse.getParseException() != null ){
parseException = msgResponse.getParseException();
}
else{
parseException = (ParseException) context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO_PARSE_EXCEPTION);
}
String msgErrore = parseException.getParseException().getMessage();
if(msgErrore==null){
msgErrore = parseException.getParseException().toString();
}
msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, msgErrore);
logCore.error("parsingExceptionRisposta",parseException.getSourceException());
msgDiag.logPersonalizzato("parsingExceptionRisposta");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_440_PARSING_EXCEPTION_RISPOSTA.
getErrore440_MessaggioRispostaMalformato(parseException.getParseException()),
IntegrationFunctionError.UNPROCESSABLE_RESPONSE_CONTENT, erroriProperties);
}
else{
msgDiag.logErroreGenerico(e,"buildMessage_response("+tipoOperazione+")");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_523_CREAZIONE_PROTOCOL_MESSAGE),
IntegrationFunctionError.INTERNAL_REQUEST_ERROR, erroriProperties);
}
}finally{
// ricalcolo esito
esito = protocolFactory.createEsitoBuilder().getEsito(urlProtocolContext,
500, requestInfo.getIntegrationServiceBinding(),
msgResponse,
context.getProprietaErroreAppl(), informazioniErrori,
(context.getPddContext()!=null ?context.getPddContext() : null));
}
}
msgDiag.addKeyword(CostantiPdD.KEY_SOAP_FAULT, descrizioneSoapFault);
msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI,"integrationManager.consegnaRispostaApplicativaEffettuata");
}else{
/*
// Con la nuova versione di RicezioneContenutiApplicativi, in caso di oneway non viene ritornato un messaggio SOAP empty, ma proprio null
// Una risposta deve esistere per forza.
msgDiag.logErroreGenerico("Risposta non presente","gestioneRisposta("+tipoOperazione+")");
throw new IntegrationManagerException(CostantiPdD.CODICE_511_READ_RESPONSE_MSG,
CostantiPdD.MSG_5XX_SISTEMA_NON_DISPONIBILE);
*/
msgReturn = new IntegrationManagerMessage();
esito = protocolFactory.createEsitoBuilder().getEsito(urlProtocolContext,
200, requestInfo.getIntegrationServiceBinding(),
msgResponse,
context.getProprietaErroreAppl(), informazioniErrori,
(context.getPddContext()!=null ? context.getPddContext() : null));
// ok oneway
msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI,"integrationManager.consegnaRispostaApplicativaVuota");
}
msgReturn.setProtocolHeaderInfo(protocolHeaderInfoResponse);
if(dumpRaw!=null && dumpRaw.isActiveDump()){
String contentTypeRisposta = "text/xml"; // per ora e' cablato.
String rawMessage = null;
Integer contentLengthRisposta = null;
if(msgReturn.getMessage()!=null){
try{
contentLengthRisposta = msgReturn.getMessage().length;
rawMessage = new String(msgReturn.getMessage());
}catch(Throwable t){
logCore.error("Dump error: "+t.getMessage(),t);
}
}
dumpRaw.serializeResponse(rawMessage, null, null, contentLengthRisposta, contentTypeRisposta, 200);
}
return msgReturn;
}catch(Exception e){
if(dumpRaw!=null && dumpRaw.isActiveDump()){
String contentTypeRisposta = "text/xml"; // per ora e' cablato.
String rawMessage = "[Exception "+e.getClass().getName()+"]: "+ e.getMessage(); // Non riesco ad avere il marshal xml della risposta ritornata
Integer contentLengthRisposta = null;
dumpRaw.serializeResponse(rawMessage, null,null, contentLengthRisposta, contentTypeRisposta, 500);
}
errore = e.getMessage();
msgDiag.addKeyword(CostantiPdD.KEY_SOAP_FAULT, descrizioneSoapFault);
// Controllo Eccezioni
if(e instanceof IntegrationManagerException){
// Lanciata all'interno del metodo
if(esito==null){
// Altrimenti l'esito era settato
try{
esito = protocolFactory.createEsitoBuilder().getEsito(urlProtocolContext,EsitoTransazioneName.ERRORE_PROCESSAMENTO_PDD_5XX);
}catch(Exception eBuildError){
esito = EsitoTransazione.ESITO_TRANSAZIONE_ERROR;
}
}
IntegrationManagerException eSPC = (IntegrationManagerException)e;
//String prefix = eSPC.getProprietaErroreApplicativo().getFaultPrefixCode();
//boolean isFaultAsGenericCode = eSPC.getProprietaErroreApplicativo().isFaultAsGenericCode();
if(descrizioneSoapFault!=null && !"".equals(descrizioneSoapFault)){
// stesse informazioni presenti gia nel fault
msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_CONSEGNA,"ProtocolException/"+eSPC.getCodiceEccezione());
}else{
msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_CONSEGNA,"ProtocolException/"+eSPC.getCodiceEccezione() + " " + eSPC.getDescrizioneEccezione());
}
msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI,"integrationManager.consegnaRispostaApplicativaFallita");
throw eSPC;
}else{
msgDiag.logErroreGenerico(e,"invocaPortaDelegata("+tipoOperazione+")");
try{
esito = protocolFactory.createEsitoBuilder().getEsito(urlProtocolContext,EsitoTransazioneName.ERRORE_PROCESSAMENTO_PDD_5XX);
}catch(Exception eBuildError){
esito = EsitoTransazione.ESITO_TRANSAZIONE_ERROR;
}
msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_CONSEGNA,errore);
msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI,"integrationManager.consegnaRispostaApplicativaFallita");
throw new IntegrationManagerException(protocolFactory,ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreIntegrazione(),
IntegrationFunctionError.INTERNAL_REQUEST_ERROR, erroriProperties);
}
}finally{
try{
if(stato!=null)
stato.releaseResource();
}catch(Exception eClose){}
// *** Chiudo connessione verso PdD Destinazione per casi stateless ***
String location = "...";
try{
IConnettore c = null;
//if(context!=null && context.getIdMessage()!=null){
if(idTransazione!=null) {
c = RepositoryConnettori.removeConnettorePD(
//context.getIdMessage()
idTransazione);
}
if(c!=null){
location = c.getLocation();
c.disconnect();
}
}catch(Exception e){
msgDiag.logDisconnectError(e, location);
}
/* ------------ PostOutResponseHandler ------------- */
PostOutResponseContext postOutResponseContext = new PostOutResponseContext(logCore, protocolFactory);
try{
context.getPddContext().addObject(CostantiPdD.DATA_ACCETTAZIONE_RICHIESTA, dataAccettazioneRichiesta);
if(dataIngressoRichiesta!=null){
context.getPddContext().addObject(CostantiPdD.DATA_INGRESSO_RICHIESTA, dataIngressoRichiesta);
}
postOutResponseContext.setPddContext(context.getPddContext());
postOutResponseContext.setDataElaborazioneMessaggio(DateManager.getDate());
postOutResponseContext.setDataPrimaSpedizioneRisposta(DateManager.getDate());
postOutResponseContext.setDataRispostaSpedita(DateManager.getDate());
postOutResponseContext.setEsito(esito);
postOutResponseContext.setMessaggio(msgResponse);
if(msgRequest!=null){
postOutResponseContext.setInputRequestMessageSize(msgRequest.getIncomingMessageContentLength());
postOutResponseContext.setOutputRequestMessageSize(msgRequest.getOutgoingMessageContentLength());
}else{
if(msg!=null && msg.getMessage()!=null)
postOutResponseContext.setInputRequestMessageSize(Long.valueOf(msg.getMessage().length));
}
if(msgResponse!=null){
postOutResponseContext.setInputResponseMessageSize(msgResponse.getIncomingMessageContentLength());
if(msgReturn!=null && msgReturn.getMessage()!=null)
postOutResponseContext.setOutputResponseMessageSize(Long.valueOf(msgReturn.getMessage().length));
}
if(errore!=null){
postOutResponseContext.setReturnCode(500);
}else{
postOutResponseContext.setReturnCode(200);
}
// if(context!=null){
if(context.getTipoPorta()!=null)
postOutResponseContext.setTipoPorta(context.getTipoPorta());
else
postOutResponseContext.setTipoPorta(TipoPdD.DELEGATA);
postOutResponseContext.setProtocollo(context.getProtocol());
postOutResponseContext.setIntegrazione(context.getIntegrazione());
// }else{
// postOutResponseContext.setTipoPorta(TipoPdD.DELEGATA);
// }
postOutResponseContext.setIdModulo(idModulo);
}catch(Exception e){
msgDiag.logErroreGenerico(e,"postOutResponse, preparazione contesto");
}
GestoreHandlers.postOutResponse(postOutResponseContext, msgDiag, logCore);
}
}
}