RicezioneBusteGeneratoreBustaErrore.java

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

  21. import java.util.ArrayList;
  22. import java.util.List;

  23. import org.openspcoop2.core.commons.CoreException;
  24. import org.openspcoop2.core.id.IDSoggetto;
  25. import org.openspcoop2.message.OpenSPCoop2Message;
  26. import org.openspcoop2.message.OpenSPCoop2MessageFactory;
  27. import org.openspcoop2.message.constants.MessageRole;
  28. import org.openspcoop2.message.utils.MessageUtilities;
  29. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  30. import org.openspcoop2.pdd.core.CostantiPdD;
  31. import org.openspcoop2.pdd.core.EJBUtils;
  32. import org.openspcoop2.pdd.core.GestoreMessaggi;
  33. import org.openspcoop2.pdd.core.PdDContext;
  34. import org.openspcoop2.pdd.core.state.IOpenSPCoopState;
  35. import org.openspcoop2.pdd.core.state.OpenSPCoopState;
  36. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  37. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  38. import org.openspcoop2.pdd.logger.Tracciamento;
  39. import org.openspcoop2.pdd.mdb.InoltroRisposte;
  40. import org.openspcoop2.pdd.mdb.Sbustamento;
  41. import org.openspcoop2.pdd.services.error.AbstractErrorGenerator;
  42. import org.openspcoop2.pdd.services.error.RicezioneBusteExternalErrorGenerator;
  43. import org.openspcoop2.pdd.timers.TimerGestoreMessaggi;
  44. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  45. import org.openspcoop2.protocol.engine.builder.Imbustamento;
  46. import org.openspcoop2.protocol.engine.constants.Costanti;
  47. import org.openspcoop2.protocol.engine.driver.History;
  48. import org.openspcoop2.protocol.engine.driver.IFiltroDuplicati;
  49. import org.openspcoop2.protocol.engine.driver.RepositoryBuste;
  50. import org.openspcoop2.protocol.engine.validator.Validatore;
  51. import org.openspcoop2.protocol.sdk.Busta;
  52. import org.openspcoop2.protocol.sdk.Eccezione;
  53. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  54. import org.openspcoop2.protocol.sdk.Integrazione;
  55. import org.openspcoop2.protocol.sdk.ProtocolException;
  56. import org.openspcoop2.protocol.sdk.ProtocolMessage;
  57. import org.openspcoop2.protocol.sdk.Riscontro;
  58. import org.openspcoop2.protocol.sdk.SecurityInfo;
  59. import org.openspcoop2.protocol.sdk.config.IProtocolManager;
  60. import org.openspcoop2.protocol.sdk.config.IProtocolVersionManager;
  61. import org.openspcoop2.protocol.sdk.constants.ErroreCooperazione;
  62. import org.openspcoop2.protocol.sdk.constants.ErroreIntegrazione;
  63. import org.openspcoop2.protocol.sdk.constants.ErroriCooperazione;
  64. import org.openspcoop2.protocol.sdk.constants.ErroriIntegrazione;
  65. import org.openspcoop2.protocol.sdk.constants.FaseImbustamento;
  66. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  67. import org.openspcoop2.protocol.sdk.constants.RuoloBusta;
  68. import org.openspcoop2.protocol.sdk.constants.RuoloMessaggio;
  69. import org.openspcoop2.protocol.sdk.constants.TipoOraRegistrazione;
  70. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  71. import org.openspcoop2.protocol.sdk.tracciamento.EsitoElaborazioneMessaggioTracciato;
  72. import org.openspcoop2.protocol.sdk.tracciamento.TracciamentoException;
  73. import org.openspcoop2.protocol.sdk.validator.IValidazioneSemantica;
  74. import org.openspcoop2.security.message.MessageSecurityContext;
  75. import org.openspcoop2.utils.date.DateManager;
  76. import org.openspcoop2.utils.resources.Loader;
  77. import org.slf4j.Logger;

  78. /**
  79.  * RicezioneBusteGeneratoreBustaErrore
  80.  *
  81.  * @author Poli Andrea (apoli@link.it)
  82.  * @author $Author$
  83.  * @version $Rev$, $Date$
  84.  */
  85. public class RicezioneBusteGeneratoreBustaErrore {

  86.     private RicezioneBusteContext msgContext;
  87.     private RicezioneBusteExternalErrorGenerator generatoreErrore;
  88.    
  89.     public RicezioneBusteGeneratoreBustaErrore(RicezioneBusteContext msgContext, RicezioneBusteExternalErrorGenerator generatoreErrore) {
  90.         this.msgContext = msgContext;
  91.         this.generatoreErrore = generatoreErrore;
  92.     }
  93.    
  94.     public OpenSPCoop2Message generaBustaErroreProcessamento(RicezioneBusteParametriGenerazioneBustaErrore parametriGenerazioneBustaErrore,Exception e){
  95.         parametriGenerazioneBustaErrore.setErroreProcessamento(true);
  96.         parametriGenerazioneBustaErrore.setEccezioneProcessamento(e);
  97.         return generaBustaErrore(parametriGenerazioneBustaErrore, false);
  98.     }

  99.     public OpenSPCoop2Message generaBustaErroreValidazione(RicezioneBusteParametriGenerazioneBustaErrore parametriGenerazioneBustaErrore){
  100.         parametriGenerazioneBustaErrore.setErroreProcessamento(false);
  101.         return generaBustaErrore(parametriGenerazioneBustaErrore, true);
  102.     }

  103.     public OpenSPCoop2Message generaBustaErrore(RicezioneBusteParametriGenerazioneBustaErrore parametriGenerazioneBustaErrore, boolean erroreValidazione){
  104.         PdDContext pddContext = this.msgContext.getPddContext();
  105.         String idTransazione = (String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  106.        
  107.         try{
  108.             IntegrationFunctionError integrationFunctionError = parametriGenerazioneBustaErrore.getIntegrationFunctionError(pddContext, erroreValidazione);
  109.            
  110.             OpenSPCoop2Message responseErrorMessage = null;
  111.        
  112.             ErroreCooperazione erroreCooperazione = parametriGenerazioneBustaErrore.getErroreCooperazione();
  113.             ErroreIntegrazione erroreIntegrazione = parametriGenerazioneBustaErrore.getErroreIntegrazione();
  114.            
  115.             List<Eccezione> error = parametriGenerazioneBustaErrore.getError();
  116.            
  117.            
  118.             java.util.Map<String,Object> securityPropertiesResponse = null;
  119.             if(parametriGenerazioneBustaErrore.getFlowPropertiesResponse()!=null && parametriGenerazioneBustaErrore.getFlowPropertiesResponse().messageSecurity!=null)
  120.                 securityPropertiesResponse = parametriGenerazioneBustaErrore.getFlowPropertiesResponse().messageSecurity.getFlowParameters();
  121.             MessageSecurityContext messageSecurityContext = parametriGenerazioneBustaErrore.getMessageSecurityContext();
  122.             OpenSPCoop2Properties propertiesReader = parametriGenerazioneBustaErrore.getPropertiesReader();
  123.             String profiloGestione = parametriGenerazioneBustaErrore.getProfiloGestione();
  124.             String implementazionePdDMittente = parametriGenerazioneBustaErrore.getImplementazionePdDMittente();
  125.            
  126.             Tracciamento tracciamento = parametriGenerazioneBustaErrore.getTracciamento();
  127.             MsgDiagnostico msgDiag = parametriGenerazioneBustaErrore.getMsgDiag();
  128.            
  129.             Integrazione integrazione = parametriGenerazioneBustaErrore.getIntegrazione();
  130.             if(integrazione==null){
  131.                 integrazione = new Integrazione();
  132.                 integrazione.setIdModuloInAttesa(this.msgContext.getIdModulo());
  133.             }
  134.            
  135.             IOpenSPCoopState openspcoopState = parametriGenerazioneBustaErrore.getOpenspcoop();
  136.            

  137.             // Genero messaggio di errore
  138.             this.generatoreErrore.updateState(openspcoopState.getStatoRichiesta());
  139.             if(parametriGenerazioneBustaErrore.isErroreProcessamento()){
  140.                 if(erroreCooperazione!=null){
  141.                     responseErrorMessage = this.generatoreErrore.buildErroreProtocollo_Processamento(
  142.                             integrationFunctionError,
  143.                             parametriGenerazioneBustaErrore.getBusta(),integrazione, idTransazione, erroreCooperazione,
  144.                             securityPropertiesResponse,messageSecurityContext,
  145.                             propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  146.                             propertiesReader.getGestioneSerializableDBCheckInterval(),profiloGestione,
  147.                             propertiesReader.getTipoTempoBusta(implementazionePdDMittente),
  148.                             propertiesReader.isGenerazioneListaTrasmissioni(implementazionePdDMittente),
  149.                             parametriGenerazioneBustaErrore.getEccezioneProcessamento(),
  150.                             this.msgContext.getPddContext());
  151.                 }
  152.                 else if(erroreIntegrazione!=null){
  153.                     responseErrorMessage = this.generatoreErrore.buildErroreProtocollo_Processamento(
  154.                             integrationFunctionError,
  155.                             parametriGenerazioneBustaErrore.getBusta(),integrazione, idTransazione, erroreIntegrazione,
  156.                             securityPropertiesResponse,messageSecurityContext,
  157.                             propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  158.                             propertiesReader.getGestioneSerializableDBCheckInterval(),profiloGestione,
  159.                             propertiesReader.getTipoTempoBusta(implementazionePdDMittente),
  160.                             propertiesReader.isGenerazioneListaTrasmissioni(implementazionePdDMittente),
  161.                             parametriGenerazioneBustaErrore.getEccezioneProcessamento(),
  162.                             this.msgContext.getPddContext());
  163.                 }else{
  164.                     responseErrorMessage = this.generatoreErrore.buildErroreProtocollo_Processamento(
  165.                             integrationFunctionError,
  166.                             parametriGenerazioneBustaErrore.getBusta(),integrazione, idTransazione, error,
  167.                             securityPropertiesResponse,messageSecurityContext,
  168.                             propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  169.                             propertiesReader.getGestioneSerializableDBCheckInterval(),profiloGestione,
  170.                             propertiesReader.getTipoTempoBusta(implementazionePdDMittente),
  171.                             propertiesReader.isGenerazioneListaTrasmissioni(implementazionePdDMittente),
  172.                             parametriGenerazioneBustaErrore.getEccezioneProcessamento(),
  173.                             this.msgContext.getPddContext());
  174.                 }
  175.             }else{
  176.                 if(erroreCooperazione!=null){
  177.                     responseErrorMessage = this.generatoreErrore.buildErroreProtocollo_Intestazione(
  178.                             integrationFunctionError,
  179.                             parametriGenerazioneBustaErrore.getBusta(),integrazione, idTransazione,erroreCooperazione,
  180.                             securityPropertiesResponse,messageSecurityContext,
  181.                             propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  182.                             propertiesReader.getGestioneSerializableDBCheckInterval(),profiloGestione,
  183.                             propertiesReader.getTipoTempoBusta(implementazionePdDMittente),
  184.                             propertiesReader.isGenerazioneListaTrasmissioni(implementazionePdDMittente),
  185.                             this.msgContext.getPddContext());
  186.                 }
  187.                 else if(erroreIntegrazione!=null){
  188.                     throw new CoreException("Method 'generaBustaErroreValidazione' not supported for MessaggioErroreIntegrazione");
  189.                 }
  190.                 else {
  191.                     responseErrorMessage = this.generatoreErrore.buildErroreProtocollo_Intestazione(
  192.                             integrationFunctionError,
  193.                             parametriGenerazioneBustaErrore.getBusta(),integrazione, idTransazione,error,
  194.                             securityPropertiesResponse,messageSecurityContext,
  195.                             propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  196.                             propertiesReader.getGestioneSerializableDBCheckInterval(),profiloGestione,
  197.                             propertiesReader.getTipoTempoBusta(implementazionePdDMittente),
  198.                             propertiesReader.isGenerazioneListaTrasmissioni(implementazionePdDMittente),
  199.                             this.msgContext.getPddContext());
  200.                 }
  201.             }

  202.             // ProtocolFactory
  203.             IProtocolFactory<?> protocolFactory = ProtocolFactoryManager.getInstance().getProtocolFactoryByName((String) this.msgContext.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME));
  204.                        
  205.             //  Tracciamento Busta Ritornata: cambiata nel metodo msgErroreProcessamento
  206.             if(this.msgContext.isTracciamentoAbilitato()){
  207.                 EsitoElaborazioneMessaggioTracciato esitoTraccia =
  208.                         EsitoElaborazioneMessaggioTracciato.getEsitoElaborazioneMessaggioInviato();
  209.                 SecurityInfo securityInfoResponse  = null;
  210.                 boolean functionAsRouter = false; // In questo caso dovrebbe essere sempre false?
  211.                 if(functionAsRouter && messageSecurityContext!=null && messageSecurityContext.getDigestReader(responseErrorMessage.getFactory())!=null){
  212.                     IValidazioneSemantica validazioneSemantica = protocolFactory.createValidazioneSemantica(openspcoopState.getStatoRichiesta());
  213.                     securityInfoResponse = validazioneSemantica.readSecurityInformation(messageSecurityContext.getDigestReader(responseErrorMessage.getFactory()),responseErrorMessage);
  214.                 }
  215.                 Validatore v = new Validatore(responseErrorMessage,this.msgContext.getPddContext(),openspcoopState.getStatoRichiesta(),
  216.                         parametriGenerazioneBustaErrore.getLogCore(), protocolFactory);
  217.                 tracciamento.registraRisposta(responseErrorMessage,securityInfoResponse,
  218.                         v.getHeaderProtocollo_senzaControlli(), parametriGenerazioneBustaErrore.getBusta(),esitoTraccia,
  219.                         Tracciamento.createLocationString(false,this.msgContext.getSourceLocation()),
  220.                         parametriGenerazioneBustaErrore.getCorrelazioneApplicativa(),
  221.                         parametriGenerazioneBustaErrore.getCorrelazioneApplicativaRisposta());
  222.             }

  223.             // Messaggio diagnostico
  224.             msgDiag.addKeywords(parametriGenerazioneBustaErrore.getBusta(),false);
  225.             IProtocolManager protocolManager = protocolFactory.createProtocolManager();
  226.             if( (!protocolManager.getKeywordMittenteSconosciuto().equals(parametriGenerazioneBustaErrore.getBusta().getDestinatario())) &&
  227.                     (!protocolManager.getKeywordTipoMittenteSconosciuto().equals(parametriGenerazioneBustaErrore.getBusta().getTipoDestinatario())) ){
  228.                 if(parametriGenerazioneBustaErrore.getBusta().getDestinatario()==null && parametriGenerazioneBustaErrore.getBusta().getTipoDestinatario()==null){
  229.                     msgDiag.logPersonalizzato("generazioneMessaggioErroreRisposta.mittenteAnonimo");
  230.                 }
  231.                 else{
  232.                     msgDiag.logPersonalizzato("generazioneMessaggioErroreRisposta");
  233.                 }
  234.             }
  235.             else{
  236.                 msgDiag.logPersonalizzato("generazioneMessaggioErroreRisposta.destinatarioSconosciuto");
  237.             }
  238.            
  239.             // Imposto Identificativo Risposta
  240.             // Nota: la bustaRichiesta e' stata trasformata (invertita)
  241.             msgDiag.setIdMessaggioRisposta(parametriGenerazioneBustaErrore.getBusta().getID());
  242.             this.msgContext.getProtocol().setIdRisposta(parametriGenerazioneBustaErrore.getBusta().getID());
  243.            
  244.             if(parametriGenerazioneBustaErrore.getParseException()!=null){
  245.                 responseErrorMessage.setParseException(parametriGenerazioneBustaErrore.getParseException());
  246.             }
  247.            
  248.             return responseErrorMessage;

  249.         }catch(Exception e){
  250.             return this.generatoreErrore.buildFault(e,pddContext);
  251.         }
  252.     }


  253.     public void sendRispostaBustaErrore(RicezioneBusteParametriInvioBustaErrore parametriInvioBustaErrore){
  254.         sendRispostaBustaErrore(parametriInvioBustaErrore, true);
  255.     }
  256.     public void sendRispostaBustaErrore(RicezioneBusteParametriInvioBustaErrore parametriInvioBustaErrore,boolean eliminaMessaggioRicevuto){


  257.         GestoreMessaggi msgResponse = null;
  258.         RepositoryBuste repositoryBuste = null;
  259.         boolean httpReply = true;
  260.        
  261.         IOpenSPCoopState openspcoop = parametriInvioBustaErrore.getOpenspcoop();
  262.         Busta bustaRisposta = parametriInvioBustaErrore.getBusta();
  263.         MsgDiagnostico msgDiag = parametriInvioBustaErrore.getMsgDiag();
  264.         Logger logCore = parametriInvioBustaErrore.getLogCore();
  265.         PdDContext pddContext = parametriInvioBustaErrore.getPddContext();
  266.         RequestInfo requestInfo = (RequestInfo) pddContext.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  267.        
  268.         try{
  269.            
  270.             IProtocolFactory<?> protocolFactory = ProtocolFactoryManager.getInstance().getProtocolFactoryByName((String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME));
  271.                        

  272.             /* ------- Gestione messaggi di richiesta per stateless --------*/
  273.             if(eliminaMessaggioRicevuto && parametriInvioBustaErrore.isOnewayVersione11()){
  274.                 GestoreMessaggi msgRichiesta = new GestoreMessaggi(openspcoop,true,
  275.                         bustaRisposta.getRiferimentoMessaggio(),Costanti.INBOX,logCore,msgDiag,pddContext);
  276.                 msgRichiesta.setReadyForDrop(true);
  277.                 msgRichiesta.aggiornaProprietarioMessaggio(TimerGestoreMessaggi.ID_MODULO);
  278.                 RepositoryBuste repositoryBustaRichiesta = new RepositoryBuste(openspcoop.getStatoRichiesta(),true,protocolFactory);
  279.                 repositoryBustaRichiesta.eliminaBustaStatelessFromInBox(bustaRisposta.getRiferimentoMessaggio());
  280.             }
  281.            
  282.            
  283.             /* ------- Gestione MsgRisposta --------------- */

  284.             // Esamina tipo di risposta (indirizzo di spedizione)
  285.             if( parametriInvioBustaErrore.isNewConnectionForResponse() )
  286.                 httpReply = false;
  287.             if( bustaRisposta.getIndirizzoDestinatario()!=null &&
  288.                     parametriInvioBustaErrore.isUtilizzoIndirizzoTelematico() )
  289.                 httpReply = false;

  290.             // --- Genero una risposta se devo spedirla su di una nuova connessione.
  291.             if(!httpReply){

  292.                 // Salvataggio busta da inviare
  293.                 repositoryBuste = new RepositoryBuste(openspcoop.getStatoRisposta(), false, protocolFactory);
  294.                 repositoryBuste.registraBustaIntoOutBox(bustaRisposta, parametriInvioBustaErrore.getPropertiesReader().getRepositoryIntervalloScadenzaMessaggi());
  295.                 Integrazione infoIntegrazione = new Integrazione();
  296.                 repositoryBuste.aggiornaInfoIntegrazioneIntoOutBox(bustaRisposta.getID(),infoIntegrazione);

  297.                 msgResponse = new GestoreMessaggi(openspcoop, true, bustaRisposta.getID(),Costanti.OUTBOX,msgDiag,pddContext);
  298.                 msgResponse.setOneWayVersione11(parametriInvioBustaErrore.isOnewayVersione11());
  299.                 // --- creazione nuovo stato
  300.                 msgResponse.registraMessaggio(parametriInvioBustaErrore.getOpenspcoopMsg(),parametriInvioBustaErrore.getCorrelazioneApplicativa(),parametriInvioBustaErrore.getCorrelazioneApplicativaRisposta());
  301.                 // ---- aggiorno riferimentoMessaggio
  302.                 msgResponse.aggiornaRiferimentoMessaggio(bustaRisposta.getRiferimentoMessaggio());
  303.                 // --- Aggiornamento Proprietario messaggio
  304.                 // Aggiorno proprietario Messaggio: INOLTRO RISPOSTE    
  305.                 msgResponse.aggiornaProprietarioMessaggio(InoltroRisposte.ID_MODULO);

  306.                 // --- Spedizione al successivo modulo

  307.                 // spedizione al modulo InoltroRisposte
  308.                 EJBUtils ejb = new EJBUtils(parametriInvioBustaErrore.getIdentitaPdD(),this.msgContext.getTipoPorta(),this.msgContext.getIdModulo(),
  309.                         bustaRisposta.getRiferimentoMessaggio(),bustaRisposta.getID(),
  310.                         Costanti.OUTBOX,openspcoop,msgDiag,parametriInvioBustaErrore.isFunctionAsRouter(),
  311.                         parametriInvioBustaErrore.getImplementazionePdDMittente(),
  312.                         parametriInvioBustaErrore.getImplementazionePdDDestinatario(),
  313.                         parametriInvioBustaErrore.getProfiloGestione(),
  314.                         parametriInvioBustaErrore.getPddContext());

  315.                 // Il messaggio gia' possiede la busta, non deve essere effettuato imbustamento da InoltroRisposte
  316.                 ejb.sendToInoltroRisposte(bustaRisposta,false,null, msgResponse,
  317.                         parametriInvioBustaErrore.getCorrelazioneApplicativa(),parametriInvioBustaErrore.getCorrelazioneApplicativaRisposta(),
  318.                         parametriInvioBustaErrore.getServizioApplicativoFruitore(),false);      


  319.                 // Imposto messaggio ritornato nella connection-reply
  320.                 OpenSPCoop2Message soapBodyEmpty = MessageUtilities.buildEmptyMessage(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),
  321.                         requestInfo.getProtocolRequestMessageType(), MessageRole.RESPONSE);
  322.                 this.msgContext.setMessageResponse(soapBodyEmpty);
  323.                
  324.             }else{
  325.                 // Imposto messaggio ritornato nella connection-reply
  326.                 OpenSPCoop2Message risposta = parametriInvioBustaErrore.getOpenspcoopMsg();
  327.                 this.msgContext.setMessageResponse(risposta);
  328.                
  329.             }

  330.             /* ------- Commit/Close Connessione DB --------------- */
  331.             openspcoop.commit();

  332.             // Aggiornamento cache messaggio
  333.             if(msgResponse!=null)
  334.                 msgResponse.addMessaggiIntoCache_readFromTable(RicezioneBuste.ID_MODULO, "risposta verso nuova connessione");

  335.             // Aggiornamento cache proprietario messaggio
  336.             if(msgResponse!=null)
  337.                 msgResponse.addProprietariIntoCache_readFromTable(RicezioneBuste.ID_MODULO, "risposta verso nuova connessione",
  338.                         bustaRisposta.getRiferimentoMessaggio(),parametriInvioBustaErrore.isFunctionAsRouter());


  339.         }catch (Exception e) {
  340.             IntegrationFunctionError integrationFunctionError = AbstractErrorGenerator.getIntegrationInternalError(pddContext); // default
  341.             msgDiag.logErroreGenerico(e, "sendRispostaBustaErrore");
  342.             this.msgContext.setMessageResponse(this.generatoreErrore.buildErroreProcessamento(pddContext,
  343.                     integrationFunctionError,
  344.                     ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreIntegrazione(), e));
  345.         }  

  346.     }

  347.    
  348.     public OpenSPCoop2Message generaRispostaMsgGiaRicevuto(boolean printMsg,Busta bustaRichiesta,Integrazione integrazione,MsgDiagnostico msgDiag,
  349.             OpenSPCoopState openspcoopstate,Logger log,OpenSPCoop2Properties properties, String profiloGestione,
  350.             RuoloBusta ruoloBustaRicevuta,String implementazionePdDMittente,IProtocolFactory<?> protocolFactory,
  351.             IDSoggetto identitaPdD,String idTransazione,Loader loader, boolean oneWayVersione11,
  352.             String implementazionePdDSoggettoMittente,
  353.             Tracciamento tracciamento,
  354.             String idCorrelazioneApplicativa,
  355.             PdDContext pddContext, IntegrationFunctionError integrationFunctionError) throws ProtocolException, TracciamentoException{

  356.         RepositoryBuste repositoryBuste = new RepositoryBuste(openspcoopstate.getStatoRichiesta(), true,protocolFactory);
  357.         History historyBuste = new History(openspcoopstate.getStatoRichiesta(), log);
  358.         Busta bustaHTTPReply = null;
  359.        
  360.         IProtocolVersionManager protocolManager =
  361.                 ProtocolFactoryManager.getInstance().getProtocolFactoryByName((String) this.msgContext.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME)).createProtocolVersionManager(profiloGestione);
  362.        
  363.         RequestInfo requestInfo = (RequestInfo) this.msgContext.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  364.        
  365.         boolean consegnaAffidabile = false;
  366.         switch (protocolManager.getConsegnaAffidabile(bustaRichiesta)) {
  367.         case ABILITATA:
  368.             consegnaAffidabile = true;
  369.             break;
  370.         case DISABILITATA:
  371.             consegnaAffidabile = false;
  372.             break;
  373.         default:
  374.             consegnaAffidabile = properties.isGestioneRiscontri(implementazionePdDMittente) && bustaRichiesta.isConfermaRicezione();
  375.             break;
  376.         }
  377.        
  378.         // Aggiorno duplicati
  379.         try{
  380.             IFiltroDuplicati gestoreFiltroDuplicati = Sbustamento.getGestoreFiltroDuplicati(properties, loader,
  381.                     openspcoopstate, this.msgContext.getPddContext(), historyBuste, repositoryBuste, oneWayVersione11);
  382.            
  383.             boolean oldGestioneConnessione = false;
  384.             boolean rinegozia = false;
  385.             if(gestoreFiltroDuplicati.releaseRuntimeResourceBeforeCheck() && !openspcoopstate.resourceReleased()) {
  386.                 rinegozia = true;
  387.                 msgDiag.mediumDebug("Rilascio connessione al database prima di verificare se la richiesta è duplicata ...");
  388.                 oldGestioneConnessione = openspcoopstate.isUseConnection();
  389.                 openspcoopstate.setUseConnection(true);
  390.                 openspcoopstate.commit();
  391.                 openspcoopstate.releaseResource();
  392.             }
  393.            
  394.             gestoreFiltroDuplicati.isDuplicata(protocolFactory, bustaRichiesta.getID()); // lo invoco lo stesso per eventuali implementazioni che utilzzano il worflow
  395.             // Aggiorno duplicati
  396.             if(printMsg){
  397.                 msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_SBUSTAMENTO,"ricezioneBustaDuplicata.count");
  398.             }
  399.             gestoreFiltroDuplicati.incrementaNumeroDuplicati(protocolFactory,bustaRichiesta.getID());
  400.            
  401.             if(gestoreFiltroDuplicati.releaseRuntimeResourceBeforeCheck() && rinegozia) {
  402.                 msgDiag.mediumDebug("Rinegozio connessione dopo la verifica di richiesta duplicata ...");
  403.                 rinegoziazioneConnessione(openspcoopstate, idTransazione, oldGestioneConnessione);
  404.             }
  405.            
  406.             openspcoopstate.commit();
  407.         }catch(Exception e){
  408.             log.error("Aggiornamento numero duplicati per busta ["+bustaRichiesta.getID()+"] non riuscito: "+e.getMessage(),e);
  409.         }
  410.         if(printMsg){
  411.             msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_SBUSTAMENTO,"ricezioneBustaDuplicata");
  412.         }
  413.        
  414.         Imbustamento imbustatore = new Imbustamento(log, protocolFactory, openspcoopstate.getStatoRichiesta());
  415.        
  416.         /*
  417.          * 1) duplicato in caso di oneWay: se confermaRicezione=true e la gestione dei riscontri e' attiva, re-invio un riscontro
  418.          * 1b) duplicato in caso di oneWay: se confermaRicezione=false o cmq la gestione dei riscontri non è attiva, genero Errore se indicato da file property, altrimenti ritorno http 202
  419.          * 2) duplicati in caso sincrono: genero un msg Errore
  420.          * 3) duplicati in caso asincrono: rigenero la ricevuta
  421.          */
  422.        
  423.         boolean http200 = true;
  424.        
  425.         // 1)
  426.         if( org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(bustaRichiesta.getProfiloDiCollaborazione()) &&
  427.                 consegnaAffidabile){
  428.             msgDiag.logPersonalizzato("generazioneRiscontro");

  429.             // Costruisco riscontro da re-inviare
  430.             TipoOraRegistrazione tipoOraRegistrazione = properties.getTipoTempoBusta(implementazionePdDMittente);
  431.             bustaHTTPReply = bustaRichiesta.invertiBusta(tipoOraRegistrazione,protocolFactory.createTraduttore().toString(tipoOraRegistrazione));

  432.             String idBustaRisposta =
  433.                     imbustatore.buildID(identitaPdD, idTransazione,
  434.                             properties.getGestioneSerializableDBAttesaAttiva(),
  435.                             properties.getGestioneSerializableDBCheckInterval(),
  436.                             RuoloMessaggio.RISPOSTA);
  437.             bustaHTTPReply.setID(idBustaRisposta);
  438.            
  439.             Riscontro r = new Riscontro();
  440.             r.setID(bustaRichiesta.getID());
  441.             r.setOraRegistrazione(DateManager.getDate());
  442.             r.setTipoOraRegistrazione(properties.getTipoTempoBusta(implementazionePdDMittente));
  443.             bustaHTTPReply.addRiscontro(r);

  444.         }
  445.         // 1b)
  446.         else if( org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(bustaRichiesta.getProfiloDiCollaborazione()) &&
  447.                 ( (!properties.isGestioneRiscontri(implementazionePdDMittente)) || (!bustaRichiesta.isConfermaRicezione()) )  &&
  448.                 ( protocolManager.isGenerazioneErroreMessaggioOnewayDuplicato() || properties.isGenerazioneErroreProtocolloFiltroDuplicati(implementazionePdDMittente))){
  449.             http200 = false;
  450.            
  451.             String idBustaRisposta =
  452.                     imbustatore.buildID(identitaPdD, idTransazione,
  453.                             properties.getGestioneSerializableDBAttesaAttiva(),
  454.                             properties.getGestioneSerializableDBCheckInterval(),
  455.                             RuoloMessaggio.RISPOSTA);
  456.             List<Eccezione> v = new ArrayList<>();
  457.             v.add(Eccezione.getEccezioneValidazione(ErroriCooperazione.IDENTIFICATIVO_MESSAGGIO_GIA_PROCESSATO.getErroreCooperazione(),protocolFactory));
  458.             bustaHTTPReply = this.generatoreErrore.getImbustamentoErrore().buildMessaggioErroreProtocollo_Validazione(v,bustaRichiesta,idBustaRisposta,
  459.                     properties.getTipoTempoBusta(implementazionePdDSoggettoMittente));  
  460.             if( !( identitaPdD.getNome().equals(bustaHTTPReply.getMittente()) &&
  461.                     identitaPdD.getTipo().equals(bustaHTTPReply.getTipoMittente()) ) ){
  462.                 // Il mittente della busta che sara' spedita e' il router
  463.                 bustaHTTPReply.setMittente(identitaPdD.getNome());
  464.                 bustaHTTPReply.setTipoMittente(identitaPdD.getTipo());
  465.                 bustaHTTPReply.setIdentificativoPortaMittente(identitaPdD.getCodicePorta());
  466.                 bustaHTTPReply.setIndirizzoMittente(null);
  467.             }      
  468.            
  469.         }
  470.         // 2)
  471.         /** else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(bustaRichiesta.getProfiloDiCollaborazione())){
  472.          non ci si entra mai in questo caso. Il metodo non viene mai chiamato nel caso di sincrono
  473.         }*/
  474.        
  475.         // 3
  476.         else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(bustaRichiesta.getProfiloDiCollaborazione()) ||
  477.                 org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(bustaRichiesta.getProfiloDiCollaborazione())){

  478.             String ricevuta = null;
  479.             if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(bustaRichiesta.getProfiloDiCollaborazione())){
  480.                 // Asincrono Simmetrico
  481.                 if(bustaRichiesta.getRiferimentoMessaggio()==null)
  482.                     ricevuta = "ricevuta di una richiesta asincrona simmetrica";
  483.                 else if(ruoloBustaRicevuta!=null && RuoloBusta.RISPOSTA.equals(ruoloBustaRicevuta.toString()) ){
  484.                     ricevuta = "ricevuta di una risposta asincrona simmetrica";
  485.                 }
  486.             }else{
  487.                 //  Asincrono Asimmetrico
  488.                 if(bustaRichiesta.getRiferimentoMessaggio()==null){
  489.                     ricevuta = "ricevuta di una richiesta asincrona asimmetrica";
  490.                     // ServizioCorrelato da impostare nella ricevuta asincrona
  491.                 }else if(ruoloBustaRicevuta!=null && RuoloBusta.RISPOSTA.equals(ruoloBustaRicevuta.toString()) ){
  492.                     ricevuta = "ricevuta di una risposta asincrona asimmetrica";
  493.                 }
  494.             }

  495.             if(ricevuta!=null){
  496.                 msgDiag.addKeyword(CostantiPdD.KEY_TIPO_RICEVUTA_ASINCRONA, ricevuta);
  497.                 msgDiag.logPersonalizzato("generazioneRicevutaAsincrona");

  498.                 // Costruisco ricevuta da re-inviare
  499.                 TipoOraRegistrazione tipoOraRegistrazione = properties.getTipoTempoBusta(implementazionePdDMittente);
  500.                 bustaHTTPReply = bustaRichiesta.invertiBusta(tipoOraRegistrazione,protocolFactory.createTraduttore().toString(tipoOraRegistrazione));
  501.                 bustaHTTPReply.setVersioneServizio(bustaRichiesta.getVersioneServizio());
  502.                 bustaHTTPReply.setServizio(bustaRichiesta.getServizio());
  503.                 bustaHTTPReply.setTipoServizio(bustaRichiesta.getTipoServizio());
  504.                 bustaHTTPReply.setAzione(bustaRichiesta.getAzione());
  505.                 bustaHTTPReply.setProfiloDiCollaborazione(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO);
  506.                 bustaHTTPReply.setRiferimentoMessaggio(bustaRichiesta.getID());
  507.                 // (per gli asincroni devono sempre essere presenti)
  508.                 if( properties.isGestioneElementoCollaborazione(implementazionePdDMittente))
  509.                     bustaHTTPReply.setCollaborazione(bustaRichiesta.getCollaborazione());      
  510.                
  511.                 String idBustaRisposta =
  512.                         imbustatore.buildID(identitaPdD, idTransazione,
  513.                                 properties.getGestioneSerializableDBAttesaAttiva(),
  514.                                 properties.getGestioneSerializableDBCheckInterval(),
  515.                                 RuoloMessaggio.RISPOSTA);
  516.                 bustaHTTPReply.setID(idBustaRisposta);
  517.             }
  518.         }
  519.         // 4
  520.         else{
  521.             if( protocolManager.isGenerazioneErroreMessaggioOnewayDuplicato() || properties.isGenerazioneErroreProtocolloFiltroDuplicati(implementazionePdDMittente)){
  522.                 http200 = false;
  523.                
  524.                 String idBustaRisposta =
  525.                         imbustatore.buildID(identitaPdD, idTransazione,
  526.                                 properties.getGestioneSerializableDBAttesaAttiva(),
  527.                                 properties.getGestioneSerializableDBCheckInterval(),
  528.                                 RuoloMessaggio.RISPOSTA);
  529.                 List<Eccezione> v = new ArrayList<>();
  530.                 v.add(Eccezione.getEccezioneValidazione(ErroriCooperazione.IDENTIFICATIVO_MESSAGGIO_GIA_PROCESSATO.getErroreCooperazione(),protocolFactory));
  531.                 bustaHTTPReply = this.generatoreErrore.getImbustamentoErrore().buildMessaggioErroreProtocollo_Validazione(v,bustaRichiesta,idBustaRisposta,
  532.                         properties.getTipoTempoBusta(implementazionePdDSoggettoMittente));  
  533.                 if( !( identitaPdD.getNome().equals(bustaHTTPReply.getMittente()) &&
  534.                         identitaPdD.getTipo().equals(bustaHTTPReply.getTipoMittente()) ) ){
  535.                     // Il mittente della busta che sara' spedita e' il router
  536.                     bustaHTTPReply.setMittente(identitaPdD.getNome());
  537.                     bustaHTTPReply.setTipoMittente(identitaPdD.getTipo());
  538.                     bustaHTTPReply.setIdentificativoPortaMittente(identitaPdD.getCodicePorta());
  539.                     bustaHTTPReply.setIndirizzoMittente(null);
  540.                 }      
  541.             }
  542.         }

  543.         if(bustaHTTPReply==null){
  544.             return MessageUtilities.buildEmptyMessage(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),
  545.                     requestInfo.getProtocolRequestMessageType(), MessageRole.RESPONSE);
  546.         }else{
  547.                        
  548.             OpenSPCoop2Message msg = null;
  549.             if(http200){
  550.                 msg = MessageUtilities.buildEmptyMessage(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),
  551.                         requestInfo.getProtocolRequestMessageType(), MessageRole.RESPONSE);
  552.             }
  553.             else{
  554.                 msg = this.generatoreErrore.buildErroreIntestazione(pddContext,integrationFunctionError);
  555.             }
  556.            
  557.            
  558.             ProtocolMessage protocolMessage = imbustatore.imbustamentoRisposta(msg,pddContext,
  559.                     bustaHTTPReply,bustaRichiesta,
  560.                     integrazione,false,false,null,
  561.                     FaseImbustamento.PRIMA_SICUREZZA_MESSAGGIO);
  562.             if(protocolMessage!=null && !protocolMessage.isPhaseUnsupported()) {
  563.                 msg = protocolMessage.getMessage(); // updated
  564.             }
  565.            
  566.             protocolMessage = imbustatore.imbustamentoRisposta(msg,pddContext,
  567.                     bustaHTTPReply,bustaRichiesta,
  568.                     integrazione,false,false,null,
  569.                     FaseImbustamento.DOPO_SICUREZZA_MESSAGGIO);
  570.             if(protocolMessage!=null && !protocolMessage.isPhaseUnsupported()) {
  571.                 msg = protocolMessage.getMessage(); // updated
  572.             }
  573.            
  574.            
  575.             //          Tracciamento Busta Ritornata: cambiata nel metodo msgErroreProcessamento
  576.             if(this.msgContext.isTracciamentoAbilitato()){
  577.                 EsitoElaborazioneMessaggioTracciato esitoTraccia =
  578.                         EsitoElaborazioneMessaggioTracciato.getEsitoElaborazioneMessaggioInviato();
  579.                 SecurityInfo securityInfoResponse  = null;
  580.                 /**boolean functionAsRouter = false; // In questo caso dovrebbe essere sempre false?
  581.                 if(functionAsRouter){
  582.                     if(messageSecurityContext!=null && messageSecurityContext.getDigestReader()!=null){
  583.                         IValidazioneSemantica validazioneSemantica = protocolFactory.createValidazioneSemantica();
  584.                         securityInfoResponse = validazioneSemantica.readSecurityInformation(messageSecurityContext.getDigestReader(),msg);
  585.                     }
  586.                 }*/
  587.                 Validatore v = new Validatore(msg,this.msgContext.getPddContext(),openspcoopstate.getStatoRichiesta(),
  588.                         log, protocolFactory);
  589.                 tracciamento.registraRisposta(msg,securityInfoResponse,
  590.                         v.getHeaderProtocollo_senzaControlli(), bustaHTTPReply,esitoTraccia,
  591.                         Tracciamento.createLocationString(false,this.msgContext.getSourceLocation()),
  592.                         idCorrelazioneApplicativa,
  593.                         null);
  594.             }
  595.            
  596.             return msg;
  597.         }
  598.     }
  599.    
  600.     private void rinegoziazioneConnessione(OpenSPCoopState openspcoopstate, String idTransazione, boolean oldGestioneConnessione) throws ProtocolException {
  601.         try{
  602.             openspcoopstate.updateResource(idTransazione);
  603.             openspcoopstate.setUseConnection(oldGestioneConnessione);
  604.         }catch(Exception e){
  605.             throw new ProtocolException("Rinegoziazione connessione dopo la verifica di richiesta duplicata fallita: "+e.getMessage(),e);
  606.         }
  607.     }
  608. }