SbustamentoRisposte.java

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


  20. package org.openspcoop2.pdd.mdb;

  21. import org.openspcoop2.core.config.PortaDelegata;
  22. import org.openspcoop2.core.config.ServizioApplicativo;
  23. import org.openspcoop2.core.config.constants.CostantiConfigurazione;
  24. import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
  25. import org.openspcoop2.core.constants.TipoPdD;
  26. import org.openspcoop2.core.eccezione.details.DettaglioEccezione;
  27. import org.openspcoop2.core.eccezione.details.utils.XMLUtils;
  28. import org.openspcoop2.core.id.IDServizioApplicativo;
  29. import org.openspcoop2.core.id.IDSoggetto;
  30. import org.openspcoop2.message.OpenSPCoop2Message;
  31. import org.openspcoop2.message.OpenSPCoop2MessageFactory;
  32. import org.openspcoop2.message.constants.MessageRole;
  33. import org.openspcoop2.message.exception.ParseException;
  34. import org.openspcoop2.message.utils.MessageUtilities;
  35. import org.openspcoop2.pdd.config.ClassNameProperties;
  36. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  37. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  38. import org.openspcoop2.pdd.config.RichiestaDelegata;
  39. import org.openspcoop2.pdd.core.CostantiPdD;
  40. import org.openspcoop2.pdd.core.EJBUtils;
  41. import org.openspcoop2.pdd.core.GestoreMessaggi;
  42. import org.openspcoop2.pdd.core.PdDContext;
  43. import org.openspcoop2.pdd.core.state.IOpenSPCoopState;
  44. import org.openspcoop2.pdd.core.state.OpenSPCoopState;
  45. import org.openspcoop2.pdd.core.state.OpenSPCoopStateException;
  46. import org.openspcoop2.pdd.core.state.OpenSPCoopStateless;
  47. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  48. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  49. import org.openspcoop2.pdd.services.error.RicezioneBusteExternalErrorGenerator;
  50. import org.openspcoop2.pdd.services.error.RicezioneContenutiApplicativiInternalErrorGenerator;
  51. import org.openspcoop2.pdd.timers.TimerGestoreMessaggi;
  52. import org.openspcoop2.protocol.engine.constants.Costanti;
  53. import org.openspcoop2.protocol.engine.driver.FiltroDuplicati;
  54. import org.openspcoop2.protocol.engine.driver.History;
  55. import org.openspcoop2.protocol.engine.driver.IFiltroDuplicati;
  56. import org.openspcoop2.protocol.engine.driver.ProfiloDiCollaborazione;
  57. import org.openspcoop2.protocol.engine.driver.RepositoryBuste;
  58. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  59. import org.openspcoop2.protocol.sdk.Busta;
  60. import org.openspcoop2.protocol.sdk.Eccezione;
  61. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  62. import org.openspcoop2.protocol.sdk.Riscontro;
  63. import org.openspcoop2.protocol.sdk.builder.ProprietaErroreApplicativo;
  64. import org.openspcoop2.protocol.sdk.config.IProtocolConfiguration;
  65. import org.openspcoop2.protocol.sdk.config.IProtocolVersionManager;
  66. import org.openspcoop2.protocol.sdk.config.ITraduttore;
  67. import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
  68. import org.openspcoop2.protocol.sdk.constants.CodiceErroreIntegrazione;
  69. import org.openspcoop2.protocol.sdk.constants.ErroreCooperazione;
  70. import org.openspcoop2.protocol.sdk.constants.ErroreIntegrazione;
  71. import org.openspcoop2.protocol.sdk.constants.ErroriCooperazione;
  72. import org.openspcoop2.protocol.sdk.constants.ErroriIntegrazione;
  73. import org.openspcoop2.protocol.sdk.constants.FunzionalitaProtocollo;
  74. import org.openspcoop2.protocol.sdk.constants.Inoltro;
  75. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  76. import org.openspcoop2.protocol.sdk.constants.RuoloBusta;
  77. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  78. import org.slf4j.Logger;

  79. /**
  80.  * Contiene la libreria Sbustamento
  81.  *
  82.  * @author Poli Andrea (apoli@link.it)
  83.  * @author Tronci Fabio (tronci@link.it)
  84.  * @author $Author$
  85.  * @version $Rev$, $Date$
  86.  */
  87. public class SbustamentoRisposte extends GenericLib {

  88.     public static final String ID_MODULO = "SbustamentoRisposte";

  89.     /** XMLBuilder */
  90.     private RicezioneContenutiApplicativiInternalErrorGenerator generatoreErrore;


  91.     public SbustamentoRisposte(Logger log) throws GenericLibException {
  92.         super(SbustamentoRisposte.ID_MODULO, log);
  93.         inizializza();
  94.     }

  95.     @Override
  96.     protected synchronized void inizializza() throws GenericLibException {
  97.         super.inizializza();
  98.     }

  99.     @Override
  100.     public EsitoLib _onMessage(IOpenSPCoopState openspcoopstate,
  101.             RegistroServiziManager registroServiziManager,ConfigurazionePdDManager configurazionePdDManager,
  102.             MsgDiagnostico msgDiag) throws OpenSPCoopStateException {
  103.         EsitoLib esito = new EsitoLib();

  104.         SbustamentoRisposteMessage sbustamentoRisposteMsg = (SbustamentoRisposteMessage) openspcoopstate.getMessageLib();
  105.        
  106.         /* Regupero eventuali errori di parsing. */
  107.         ParseException parseException = null;
  108.         if(openspcoopstate instanceof OpenSPCoopStateless) {
  109.             OpenSPCoop2Message msgRisposta = ((OpenSPCoopStateless) openspcoopstate).getRispostaMsg();
  110.             if(msgRisposta!=null){
  111.                 parseException = msgRisposta.getParseException();
  112.             }
  113.         }
  114.        
  115.         /* PddContext */
  116.         PdDContext pddContext = sbustamentoRisposteMsg.getPddContext();
  117.         String idTransazione = PdDContext.getValue(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE, pddContext);
  118.         RequestInfo requestInfo = (RequestInfo) pddContext.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  119.        
  120.         /* Protocol Factory */
  121.         IProtocolFactory<?> protocolFactory = null;
  122.         IProtocolVersionManager protocolManager = null;
  123.         ITraduttore traduttore = null;
  124.         try{
  125.             protocolFactory = this.protocolFactoryManager.getProtocolFactoryByName((String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME));
  126.             protocolManager = protocolFactory.createProtocolVersionManager(sbustamentoRisposteMsg.getRichiestaDelegata().getProfiloGestione());
  127.             traduttore = protocolFactory.createTraduttore();
  128.         }catch(Exception e){
  129.             msgDiag.logErroreGenerico(e, "ProtocolFactory.instanziazione");
  130.             openspcoopstate.releaseResource();
  131.             esito.setEsitoInvocazione(false);
  132.             esito.setStatoInvocazioneErroreNonGestito(e);
  133.             return esito;
  134.         }
  135.        
  136.         msgDiag.setPddContext(pddContext, protocolFactory);
  137.        
  138.         /* Busta e ID e tipo di implementazione PdD con cui interoperare */
  139.         Busta bustaRisposta = sbustamentoRisposteMsg.getBusta();
  140.         String idResponse = bustaRisposta.getID();
  141.         String implementazionePdDDestinatario = sbustamentoRisposteMsg.getImplementazionePdDSoggettoDestinatario();
  142.        
  143.         /* Processamento informazioni */
  144.         RichiestaDelegata richiestaDelegata = sbustamentoRisposteMsg.getRichiestaDelegata();
  145.         if(richiestaDelegata==null) {
  146.             msgDiag.logErroreGenerico("RichiestaDelegata is null", "RichiestaDelegata.checkNull");
  147.             openspcoopstate.releaseResource();
  148.             esito.setEsitoInvocazione(false);
  149.             return esito;
  150.         }
  151.        
  152.         TipoPdD tipoPdD = TipoPdD.DELEGATA;
  153.         if(msgDiag.getPorta()==null) {
  154.             if(richiestaDelegata!=null && richiestaDelegata.getIdPortaDelegata()!=null) {
  155.                 msgDiag.updatePorta(tipoPdD, richiestaDelegata.getIdPortaDelegata().getNome(), requestInfo);
  156.             }
  157.         }
  158.        
  159.         richiestaDelegata.setProfiloCollaborazione(bustaRisposta.getProfiloDiCollaborazione(),bustaRisposta.getProfiloDiCollaborazioneValue()); // update value
  160.         java.util.List<Eccezione> errors = sbustamentoRisposteMsg.getErrors();
  161.         IntegrationFunctionError validazione_integrationFunctionError = sbustamentoRisposteMsg.getIntegrationFunctionErrorValidazione();
  162.         boolean isMessaggioErroreProtocollo = sbustamentoRisposteMsg.isMessaggioErroreProtocollo();
  163.         boolean bustaDiServizio = sbustamentoRisposteMsg.getIsBustaDiServizio();
  164.         IDSoggetto identitaPdD = sbustamentoRisposteMsg.getRichiestaDelegata().getDominio();
  165.        
  166.         msgDiag.setDominio(identitaPdD);  // imposto anche il dominio nel msgDiag
  167.         msgDiag.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_SBUSTAMENTO_RISPOSTE);
  168.         msgDiag.addKeywords(richiestaDelegata.getIdSoggettoFruitore(),richiestaDelegata.getIdServizio(),null);
  169.         msgDiag.addKeywords(bustaRisposta, false);
  170.         msgDiag.addKeyword(CostantiPdD.KEY_SA_FRUITORE, richiestaDelegata.getServizioApplicativo());
  171.         msgDiag.setIdCorrelazioneApplicativa(richiestaDelegata.getIdCorrelazioneApplicativa());
  172.         msgDiag.setIdCorrelazioneRisposta(richiestaDelegata.getIdCorrelazioneApplicativaRisposta());
  173.         msgDiag.addKeyword(CostantiPdD.KEY_ID_CORRELAZIONE_APPLICATIVA, richiestaDelegata.getIdCorrelazioneApplicativa());
  174.        
  175.         String profiloGestione = richiestaDelegata.getProfiloGestione();
  176.         msgDiag.mediumDebug("Profilo di gestione ["+SbustamentoRisposte.ID_MODULO+"] della busta: "+profiloGestione);
  177.        
  178.         //  ProprietaErroreApplicativo
  179.         ProprietaErroreApplicativo proprietaErroreAppl = richiestaDelegata.getFault();
  180.         if(proprietaErroreAppl==null) {
  181.             msgDiag.logErroreGenerico("ProprietaErroreApplicativo is null", "ProprietaErroreApplicativo.checkNull");
  182.             openspcoopstate.releaseResource();
  183.             esito.setEsitoInvocazione(false);
  184.             return esito;
  185.         }
  186.         proprietaErroreAppl.setIdModulo(SbustamentoRisposte.ID_MODULO);
  187.        
  188.         try{
  189.             this.generatoreErrore = new RicezioneContenutiApplicativiInternalErrorGenerator(this.log, this.idModulo, requestInfo);
  190.             this.generatoreErrore.updateInformazioniCooperazione(richiestaDelegata.getIdSoggettoFruitore(), richiestaDelegata.getIdServizio());
  191.             this.generatoreErrore.updateInformazioniCooperazione(richiestaDelegata.getServizioApplicativo());
  192.             if(proprietaErroreAppl!=null){
  193.                 this.generatoreErrore.updateProprietaErroreApplicativo(proprietaErroreAppl);
  194.             }
  195.         }catch(Exception e){
  196.             msgDiag.logErroreGenerico(e, "RicezioneContenutiApplicativiGeneratoreErrore.instanziazione");
  197.             openspcoopstate.releaseResource();
  198.             esito.setEsitoInvocazione(false);
  199.             esito.setStatoInvocazioneErroreNonGestito(e);
  200.             return esito;
  201.         }
  202.        

  203.         /* ------------------ Inizializzo stato OpenSPCoop  --------------- */
  204.         msgDiag.mediumDebug("Inizializzo stato per la gestione della richiesta...");
  205.         openspcoopstate.initResource(identitaPdD, SbustamentoRisposte.ID_MODULO,idTransazione);
  206.         registroServiziManager = registroServiziManager.refreshState(openspcoopstate.getStatoRichiesta(),openspcoopstate.getStatoRisposta());
  207.         configurazionePdDManager = configurazionePdDManager.refreshState(registroServiziManager);
  208.         msgDiag.updateState(configurazionePdDManager);

  209.         /* ----------------- ID RICHIESTA ---------------------------------------------- */
  210.         String idMessageRequest = openspcoopstate.getIDMessaggioSessione();
  211.        
  212.         String jtiIdModIRequest = null;
  213.         if(pddContext.containsKey(org.openspcoop2.core.constants.Costanti.MODI_JTI_REQUEST_ID)) {
  214.             jtiIdModIRequest = (String) pddContext.get(org.openspcoop2.core.constants.Costanti.MODI_JTI_REQUEST_ID);
  215.         }

  216.         // Aggiornamento Informazioni messaggio diagnostico
  217.         msgDiag.setIdMessaggioRichiesta(idMessageRequest);
  218.         msgDiag.setIdMessaggioRisposta(idResponse);
  219.         msgDiag.addKeyword(CostantiPdD.KEY_ID_MESSAGGIO_RICHIESTA, idMessageRequest);
  220.         msgDiag.setFruitore(richiestaDelegata.getIdSoggettoFruitore());
  221.         msgDiag.setServizio(richiestaDelegata.getIdServizio());
  222.         msgDiag.setServizioApplicativo(richiestaDelegata.getServizioApplicativo());
  223.         msgDiag.setIdCorrelazioneApplicativa(richiestaDelegata.getIdCorrelazioneApplicativa());
  224.         msgDiag.setIdCorrelazioneRisposta(richiestaDelegata.getIdCorrelazioneApplicativaRisposta());


  225.         /* ------------------ Inizializzazione Contesto di gestione  --------------- */
  226.         msgDiag.mediumDebug("Inizializzo contesto per la gestione...");

  227.         //  Gestore della risposta
  228.         GestoreMessaggi msgResponse = null;

  229.         // Gestore funzionalita
  230.         ProfiloDiCollaborazione profiloCollaborazione = null;
  231.         try{
  232.             profiloCollaborazione = new ProfiloDiCollaborazione(openspcoopstate.getStatoRisposta(),protocolFactory);
  233.         }catch(Exception e){
  234.             msgDiag.logErroreGenerico(e, "ProfiloDiCollaborazione.new");
  235.             openspcoopstate.releaseResource();
  236.             esito.setEsitoInvocazione(false);
  237.             esito.setStatoInvocazioneErroreNonGestito(e);
  238.             return esito;
  239.         }
  240.         History historyBuste = new History(openspcoopstate.getStatoRisposta());
  241.         RepositoryBuste repositoryBuste = new RepositoryBuste(openspcoopstate.getStatoRisposta(), false, protocolFactory);
  242.         String ricevutaAsincrona = null;

  243.         // EJBUtils (per eventuali errori)
  244.         EJBUtils ejbUtils = null;
  245.         try{
  246.             ejbUtils = new EJBUtils(identitaPdD,tipoPdD,SbustamentoRisposte.ID_MODULO,idMessageRequest,
  247.                     idResponse,Costanti.INBOX, openspcoopstate, msgDiag,false,
  248.                     sbustamentoRisposteMsg.getImplementazionePdDSoggettoMittente(),
  249.                     sbustamentoRisposteMsg.getImplementazionePdDSoggettoDestinatario(),
  250.                     profiloGestione,pddContext);
  251.             ejbUtils.setSpedizioneMsgIngresso(sbustamentoRisposteMsg.getSpedizioneMsgIngresso());
  252.             ejbUtils.setRicezioneMsgRisposta(sbustamentoRisposteMsg.getRicezioneMsgRisposta());
  253.             ejbUtils.setScenarioCooperazione(richiestaDelegata.getScenario());
  254.         }catch(Exception e){
  255.             msgDiag.logErroreGenerico(e, "EJBUtils.new");
  256.             openspcoopstate.releaseResource();
  257.             esito.setEsitoInvocazione(false);
  258.             esito.setStatoInvocazioneErroreNonGestito(e);
  259.             return esito;
  260.         }
  261.        
  262.         try{
  263.             // Per inviare segnalazioni di buste malformate
  264.             RicezioneBusteExternalErrorGenerator generatoreErrorePA = new RicezioneBusteExternalErrorGenerator(this.log, this.idModulo, requestInfo, openspcoopstate.getStatoRichiesta());
  265.             generatoreErrorePA.updateInformazioniCooperazione(richiestaDelegata.getIdSoggettoFruitore(), richiestaDelegata.getIdServizio());
  266.             generatoreErrorePA.updateInformazioniCooperazione(richiestaDelegata.getServizioApplicativo());
  267.             generatoreErrorePA.updateTipoPdD(TipoPdD.DELEGATA);
  268.             ejbUtils.setGeneratoreErrorePortaApplicativa(generatoreErrorePA);
  269.         }catch(Exception e){
  270.             msgDiag.logErroreGenerico(e, "RicezioneBusteExternalErrorGenerator.instanziazione");
  271.             openspcoopstate.releaseResource();
  272.             esito.setEsitoInvocazione(false);
  273.             esito.setStatoInvocazioneErroreNonGestito(e);
  274.             return esito;
  275.         }
  276.        
  277.         // Oneway versione 11
  278.         boolean oneWayVersione11 = sbustamentoRisposteMsg.isOneWayVersione11();
  279.         ejbUtils.setOneWayVersione11(oneWayVersione11);

  280.        
  281.         /* ----------- Lettura PortaDelegata e Servizio Applicativo ------------- */
  282.         PortaDelegata pd = null;
  283.         ServizioApplicativo sa = null;
  284.         try{
  285.             pd = configurazionePdDManager.getPortaDelegata(richiestaDelegata.getIdPortaDelegata(), requestInfo);
  286.         }catch(Exception e){
  287.             msgDiag.logErroreGenerico(e,"getPortaDelegata()");
  288.             openspcoopstate.releaseResource();
  289.             esito.setEsitoInvocazione(false);  
  290.             esito.setStatoInvocazioneErroreNonGestito(e);
  291.             return esito;
  292.         }
  293.         try{
  294.             IDServizioApplicativo idSA = new IDServizioApplicativo();
  295.             idSA.setNome(richiestaDelegata.getServizioApplicativo());
  296.             idSA.setIdSoggettoProprietario(richiestaDelegata.getIdSoggettoFruitore());
  297.             sa = configurazionePdDManager.getServizioApplicativo(idSA, requestInfo);
  298.         }catch(Exception e){
  299.             if( !(e instanceof DriverConfigurazioneNotFound) ||
  300.                     !(CostantiPdD.SERVIZIO_APPLICATIVO_ANONIMO.equals(richiestaDelegata.getServizioApplicativo())) ){
  301.                 msgDiag.logErroreGenerico(e,"getServizioApplicativo()");
  302.                 openspcoopstate.releaseResource();
  303.                 esito.setEsitoInvocazione(false);  
  304.                 esito.setStatoInvocazioneErroreNonGestito(e);
  305.                 return esito;
  306.             }
  307.         }

  308.        
  309.        
  310.         //  Modalita' gestione risposta Applicativa (No function Router active)
  311.         // -a se il profilo e' sincrono
  312.         // -b se il profilo e' asincrono e ricevutaAsincrona e' abilitata.
  313.         // -c se il profilo e' asincrono asimmetrico di richiesta stato e ricevuta disabilitata
  314.         // -d se il profilo e' oneway e la modalita di trasmissione e' sincrona.
  315.         boolean sendRispostaApplicativa = false;
  316.         boolean statelessAsincrono = false;
  317.         // a)
  318.         if(Costanti.SCENARIO_SINCRONO_INVOCAZIONE_SERVIZIO.equals(richiestaDelegata.getScenario()) ){
  319.             sendRispostaApplicativa = true;
  320.         }
  321.         // c) [e b) per la richiestaStato AsincronaAsimmetrica]
  322.         else if(Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_POLLING.equals(richiestaDelegata.getScenario())){
  323.             try{
  324.                 statelessAsincrono = configurazionePdDManager.isModalitaStateless(pd, bustaRisposta.getProfiloDiCollaborazione());
  325.             }catch(Exception e){
  326.                 msgDiag.logErroreGenerico(e,"AsincronoAsimmetricoPolling.isModalitaStateless(pd)");
  327.                 openspcoopstate.releaseResource();
  328.                 esito.setEsitoInvocazione(false);  
  329.                 esito.setStatoInvocazioneErroreNonGestito(e);
  330.                 return esito;
  331.             }
  332.             sendRispostaApplicativa = true;
  333.         }
  334.         // b)
  335.         else if (Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_INVOCAZIONE_SERVIZIO.equals(richiestaDelegata.getScenario()) ||
  336.                 Costanti.SCENARIO_ASINCRONO_SIMMETRICO_INVOCAZIONE_SERVIZIO.equals(richiestaDelegata.getScenario()) ||
  337.                 Costanti.SCENARIO_ASINCRONO_SIMMETRICO_CONSEGNA_RISPOSTA.equals(richiestaDelegata.getScenario()) ){
  338.             try{
  339.                 statelessAsincrono = configurazionePdDManager.isModalitaStateless(pd, bustaRisposta.getProfiloDiCollaborazione());
  340.                 sendRispostaApplicativa =  statelessAsincrono || richiestaDelegata.isRicevutaAsincrona();
  341.             }catch(Exception e){
  342.                 msgDiag.logErroreGenerico(e,"Asincrono.isModalitaStateless(pd)");
  343.                 openspcoopstate.releaseResource();
  344.                 esito.setEsitoInvocazione(false);  
  345.                 esito.setStatoInvocazioneErroreNonGestito(e);
  346.                 return esito;
  347.             }
  348.         }
  349.         // d)
  350.         else if(Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(richiestaDelegata.getScenario())){
  351.             try{
  352.                 sendRispostaApplicativa = (configurazionePdDManager.isModalitaStateless(pd, org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY));
  353.             }catch(Exception e){
  354.                 msgDiag.logErroreGenerico(e,"OnewayInvocazioneServizio.isModalitaStateless(pd)");
  355.                 openspcoopstate.releaseResource();
  356.                 esito.setEsitoInvocazione(false);  
  357.                 esito.setStatoInvocazioneErroreNonGestito(e);
  358.                 return esito;
  359.             }
  360.         }

  361.         //  rollback RiferimentoMessaggio
  362.         boolean rollbackRiferimentoMessaggio = false;
  363.         if(sendRispostaApplicativa){
  364.             if(Costanti.SCENARIO_SINCRONO_INVOCAZIONE_SERVIZIO.equals(richiestaDelegata.getScenario()) ){
  365.                 rollbackRiferimentoMessaggio = true;
  366.             }
  367.             // Profilo Asincrono con gestione ricevuta applicativa (siamo in sendRispostaApplicativa)
  368.             else if(Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_INVOCAZIONE_SERVIZIO.equals(richiestaDelegata.getScenario()) ||
  369.                     Costanti.SCENARIO_ASINCRONO_SIMMETRICO_INVOCAZIONE_SERVIZIO.equals(richiestaDelegata.getScenario()) ){
  370.                 rollbackRiferimentoMessaggio = true;
  371.             }
  372.         }

  373.         // Ruolo Busta ricevuta
  374.         RuoloBusta ruoloBustaRicevuta = sbustamentoRisposteMsg.getRuoloBustaRicevuta();









  375.         // Punto di inizio per la transazione.
  376.         try{

  377.             boolean ricezioneRiscontri = false;
  378.             switch (protocolManager.getConsegnaAffidabile(bustaRisposta)) {
  379.             case ABILITATA:
  380.                 ricezioneRiscontri = true;
  381.                 break;
  382.             case DISABILITATA:
  383.                 ricezioneRiscontri = false;
  384.                 break;
  385.             default:
  386.                 ricezioneRiscontri = this.propertiesReader.isGestioneRiscontri(implementazionePdDDestinatario);
  387.                 break;
  388.             }
  389.            
  390.             boolean imbustamentoFiltroDuplicatiAbilitato = false;
  391.             switch (protocolManager.getFiltroDuplicati(bustaRisposta)) {
  392.             case ABILITATA:
  393.                 imbustamentoFiltroDuplicatiAbilitato = true;
  394.                 break;
  395.             case DISABILITATA:
  396.                 imbustamentoFiltroDuplicatiAbilitato = false;
  397.                 break;
  398.             default:
  399.                 imbustamentoFiltroDuplicatiAbilitato = (Inoltro.SENZA_DUPLICATI.equals(bustaRisposta.getInoltro())) ||
  400.                 (this.propertiesReader.isCheckFromRegistroFiltroDuplicatiAbilitato(implementazionePdDDestinatario) && sbustamentoRisposteMsg.isFiltroDuplicati());
  401.                 break;
  402.             }
  403.            
  404.             // ------------- Controllo funzionalita di protocollo richieste siano compatibili con il protocollo -----------------------------
  405.             try{
  406.                 // NOTA: Usare getIntegrationServiceBinding poichè le funzionalità si riferiscono al tipo di integrazione scelta
  407.                
  408.                 IProtocolConfiguration protocolConfiguration = protocolFactory.createProtocolConfiguration();
  409.                 if(imbustamentoFiltroDuplicatiAbilitato){
  410.                     if(protocolConfiguration.isSupportato(requestInfo.getIntegrationServiceBinding(),FunzionalitaProtocollo.FILTRO_DUPLICATI)==false){
  411.                         throw new Exception(FunzionalitaProtocollo.FILTRO_DUPLICATI.getEngineValue());
  412.                     }
  413.                 }              
  414.             }catch(Exception e){    
  415.                 msgDiag.addKeywordErroreProcessamento(e);
  416.                 msgDiag.logPersonalizzato("protocolli.funzionalita.unsupported");
  417.                 if(sendRispostaApplicativa){
  418.                     OpenSPCoop2Message responseMessageError =
  419.                             this.generatoreErrore.build(pddContext, IntegrationFunctionError.INTERNAL_RESPONSE_ERROR,
  420.                                     ErroriIntegrazione.ERRORE_439_FUNZIONALITA_NOT_SUPPORTED_BY_PROTOCOL.
  421.                                         getErrore439_FunzionalitaNotSupportedByProtocol(e.getMessage(), protocolFactory),e,
  422.                                             parseException);
  423.                     ejbUtils.sendRispostaApplicativaErrore(responseMessageError,richiestaDelegata,rollbackRiferimentoMessaggio,pd,sa);
  424.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  425.                             msgDiag.getMessaggio_replaceKeywords("protocolli.funzionalita.unsupported"));
  426.                 }else{
  427.                     ejbUtils.releaseInboxMessage(false);
  428.                     esito.setStatoInvocazioneErroreNonGestito(e);
  429.                 }
  430.                 openspcoopstate.releaseResource();
  431.                 esito.setEsitoInvocazione(true);
  432.                 return esito;
  433.             }
  434.            
  435.            
  436.            
  437.            
  438.            
  439.            
  440.            
  441.            
  442.             /*   -------------- Validazione: Gestione messaggio Errore Protocollo -----------------  */
  443.             if(isMessaggioErroreProtocollo){

  444.                 msgDiag.mediumDebug("Gestione messaggio errore protocollo...");
  445.                 boolean msgErroreProtocolloValido = true;

  446.                 if(configurazionePdDManager.getTipoValidazione(implementazionePdDDestinatario).equals(CostantiConfigurazione.STATO_CON_WARNING_DISABILITATO) == false){

  447.                     if(errors.size() != 0){

  448.                         // BUSTA ERRORE MALFORMATA :
  449.                         // Il seguente codice viene eseguito solo se la modalita' di validazione
  450.                         // della busta e' "Warning Only" o "active"

  451.                         // Registrazione eccezioni riscontrate dalla validazione della busta
  452.                         StringBuilder eccBuffer = new StringBuilder();
  453.                         for(int k = 0; k < errors.size() ; k++){
  454.                             Eccezione er = errors.get(k);
  455.                             if(k>0)
  456.                                 eccBuffer.append("\n");
  457.                             eccBuffer.append(er.toString(protocolFactory));
  458.                         }
  459.                         msgDiag.addKeyword(CostantiPdD.KEY_NUMERO_ECCEZIONI, errors.size()+"");
  460.                         msgDiag.addKeyword(CostantiPdD.KEY_ECCEZIONI, eccBuffer.toString());
  461.                         msgDiag.logPersonalizzato("validazioneBustaErrore.listaEccezioniMalformata");

  462.                         // Il lavoro deve essere terminato solo in caso di Modalita Active
  463.                         if(configurazionePdDManager.getTipoValidazione(implementazionePdDDestinatario).equals(CostantiConfigurazione.STATO_CON_WARNING_ABILITATO) == true){
  464.                             msgErroreProtocolloValido=false;
  465.                         }
  466.                     }
  467.                 } // -- end if not active

  468.                 if(msgErroreProtocolloValido){
  469.                     //   Registrazione eccezioni portate nella busta
  470.                     if(bustaRisposta.sizeListaEccezioni()>0){
  471.                         msgDiag.addKeyword(CostantiPdD.KEY_ECCEZIONI, bustaRisposta.toStringListaEccezioni(protocolFactory));
  472.                         msgDiag.addKeyword(CostantiPdD.KEY_NUMERO_ECCEZIONI, bustaRisposta.sizeListaEccezioni()+"");
  473.                         msgDiag.logPersonalizzato("ricezioneBustaErrore");
  474.                     }
  475.                 }

  476.                 DettaglioEccezione dettaglioEccezione = sbustamentoRisposteMsg.getDettaglioEccezione();
  477.                 if(dettaglioEccezione!=null){
  478.                     msgDiag.addKeyword(CostantiPdD.KEY_OPENSPCOOP2_DETAILS, XMLUtils.toString(dettaglioEccezione));
  479.                     msgDiag.logPersonalizzato("ricezioneBustaErroreDetails");
  480.                 }
  481.                
  482.                 // Gestione ERRORE
  483.                 boolean inoltraClientBustaRispostaErroreRicevuta = OpenSPCoop2Properties.getInstance().isErroreApplicativoInoltraClientBustaRispostaErroreRicevuta(protocolFactory.getProtocol());
  484.                 boolean sbustamentoInformazioniProtocolloRisposta = true;
  485.                 try{        
  486.                     sbustamentoInformazioniProtocolloRisposta = configurazionePdDManager.invocazionePortaDelegataSbustamentoInformazioniProtocollo(sa);
  487.                 }catch(Exception e){
  488.                     msgDiag.logErroreGenerico(e, "acquisizione informazione sbustamentoInformazioniProtocolloRisposta");
  489.                 }
  490.                 if(sendRispostaApplicativa && msgErroreProtocolloValido &&
  491.                         !sbustamentoInformazioniProtocolloRisposta && // sbustamento protocollo (es. spcoop) disabilitato
  492.                         inoltraClientBustaRispostaErroreRicevuta // disabilitata la gestione dell'errore applicativo specifico
  493.                         ) {
  494.                     // proseguio con una gestione classica ritornando esattamente la busta errore ricevuta al client
  495.                 }
  496.                 else {
  497.                     msgDiag.mediumDebug("Invio eventuale messaggio di errore al servizio applicativo (gestione errore)...");
  498.                     if(sendRispostaApplicativa){
  499.                         Eccezione eccezioneDaInviareServizioApplicativo =
  500.                                 Eccezione.getEccezioneValidazione(ErroriCooperazione.ERRORE_GENERICO_PROTOCOLLO_NON_CORRETTO.getErroreCooperazione(), protocolFactory);
  501.                         ErroreIntegrazione erroreIntegrazioneDaInviareServizioApplicativo = null;
  502.                         if(msgErroreProtocolloValido){
  503.                             if(bustaRisposta.sizeListaEccezioni()>1){
  504.                                 StringBuilder bfDescrizione = new StringBuilder();
  505.                                 for(int k=0; k<bustaRisposta.sizeListaEccezioni();k++){
  506.                                     Eccezione eccListaEccezioni = bustaRisposta.getEccezione(k);
  507.                                     if(eccListaEccezioni.getDescrizione(protocolFactory)!=null)
  508.                                         bfDescrizione.append("["+traduttore.toString(eccListaEccezioni.getCodiceEccezione(),eccListaEccezioni.getSubCodiceEccezione())+"] "+eccListaEccezioni.getDescrizione(protocolFactory)+"\n");
  509.                                 }
  510.                                 if(bfDescrizione.length()>0)
  511.                                     eccezioneDaInviareServizioApplicativo.setDescrizione(bfDescrizione.toString());
  512.                             }else{
  513.                                 if(bustaRisposta.sizeListaEccezioni()==1){
  514.                                     eccezioneDaInviareServizioApplicativo = bustaRisposta.getEccezione(0);
  515.                                 }
  516.                                 else{
  517.                                     if(dettaglioEccezione!=null && dettaglioEccezione.getExceptions()!=null && dettaglioEccezione.getExceptions().sizeExceptionList()>0){
  518.                                         org.openspcoop2.core.eccezione.details.Eccezione e = dettaglioEccezione.getExceptions().getException(0);
  519.                                         if(org.openspcoop2.core.eccezione.details.constants.TipoEccezione.PROTOCOL.equals(e.getType())){
  520.                                             ErroreCooperazione msgErroreCooperazione =
  521.                                                     new ErroreCooperazione(e.getDescription(), traduttore.toCodiceErroreCooperazione(e.getCode()));
  522.                                             eccezioneDaInviareServizioApplicativo = new Eccezione(msgErroreCooperazione, false, SbustamentoRisposte.ID_MODULO ,protocolFactory);
  523.                                         }else{
  524.     //                                      erroreIntegrazioneDaInviareServizioApplicativo =
  525.     //                                              new ErroreIntegrazione(e.getDescrizione(), traduttore.toCodiceErroreIntegrazione(e.getCodiceAAA(), propertiesReader.getProprietaGestioneErrorePD(protocolManager).getFaultPrefixCode()));
  526.                                             // Se e' arrivato un details di errore di integrazione, comunque genero una busta di errore di processamento, visto che di fatto ho ricevuto questa.
  527.                                             eccezioneDaInviareServizioApplicativo = Eccezione.
  528.                                                     getEccezioneProcessamento(ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreProcessamento(e.getDescription()), protocolFactory);
  529.                                         }
  530.                                     }else{
  531.                                         eccezioneDaInviareServizioApplicativo = new Eccezione(ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreCooperazione(), false, SbustamentoRisposte.ID_MODULO, protocolFactory);
  532.                                     }
  533.                                 }
  534.                             }
  535.                         }
  536.                         else{
  537.                             if(errors.size()>1){
  538.                                 StringBuilder bfDescrizione = new StringBuilder();
  539.                                 for(int k=0; k<errors.size();k++){
  540.                                     Eccezione error = errors.get(k);
  541.                                     if(error.getDescrizione(protocolFactory)!=null)
  542.                                         bfDescrizione.append("["+traduttore.toString(error.getCodiceEccezione(),error.getSubCodiceEccezione())+"] "+error.getDescrizione(protocolFactory)+"\n");
  543.                                 }
  544.                                 if(bfDescrizione.length()>0)
  545.                                     eccezioneDaInviareServizioApplicativo.setDescrizione(bfDescrizione.toString());
  546.                             }else{
  547.                                 eccezioneDaInviareServizioApplicativo = errors.get(0);
  548.                             }
  549.                         }
  550.                         OpenSPCoop2Message responseMessageError = null;
  551.                         if(eccezioneDaInviareServizioApplicativo!=null){
  552.                             responseMessageError = this.generatoreErrore.build(pddContext, IntegrationFunctionError.INTEROPERABILITY_PROFILE_RESPONSE_ERROR,
  553.                                     eccezioneDaInviareServizioApplicativo,
  554.                                     richiestaDelegata.getIdServizio().getSoggettoErogatore(),dettaglioEccezione,
  555.                                     parseException);
  556.                         }else{
  557.                             responseMessageError = this.generatoreErrore.build(pddContext, IntegrationFunctionError.INTEROPERABILITY_PROFILE_RESPONSE_ERROR,
  558.                                     erroreIntegrazioneDaInviareServizioApplicativo,null,
  559.                                     parseException);
  560.                         }
  561.                         ejbUtils.sendRispostaApplicativaErrore(responseMessageError,richiestaDelegata,rollbackRiferimentoMessaggio,pd,sa);
  562.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"BustaErrore");
  563.                     }else{
  564.                         ejbUtils.releaseInboxMessage(false);
  565.                         esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,"BustaErrore");
  566.                     }
  567.                     msgDiag.mediumDebug("Rilascio connessione...");
  568.                     openspcoopstate.releaseResource();
  569.                     esito.setEsitoInvocazione(true);
  570.                     return esito; // Non devo utilizzare una busta malformata
  571.                 }
  572.             }








  573.             /*   -------------- Validazione: Gestione messaggio di protocollo -----------------  */
  574.             if(isMessaggioErroreProtocollo == false){
  575.                 if(configurazionePdDManager.getTipoValidazione(implementazionePdDDestinatario).equals(CostantiConfigurazione.STATO_CON_WARNING_DISABILITATO) == false){

  576.                     // Redirigo Errori presenti nella Busta
  577.                     boolean validazioneConErrori = (errors.size() > 0);
  578.                     if( protocolManager.isIgnoraEccezioniLivelloNonGrave() || (this.propertiesReader.ignoraEccezioniNonGraviValidazione())){
  579.                         validazioneConErrori = Busta.containsEccezioniGravi(errors);
  580.                     }

  581.                     if(validazioneConErrori){

  582.                         msgDiag.mediumDebug("Gestione messaggio di protocollo che non ha superato la validazione...");

  583.                         // Registrazione eccezioni riscontrate dalla validazione della busta
  584.                         boolean mittenteRegistrato = true;
  585.                         StringBuilder eccBuffer = new StringBuilder();
  586.                         java.util.List<Eccezione> errorsClone =  new java.util.ArrayList<Eccezione>();
  587.                         for(int k = 0; k < errors.size() ; k++){
  588.                             Eccezione er = errors.get(k);
  589.                             errorsClone.add(er);
  590.                             if(k>0)
  591.                                 eccBuffer.append("\n");
  592.                             eccBuffer.append(er.toString(protocolFactory));
  593.                             if(CodiceErroreCooperazione.isEccezioneMittente(er.getCodiceEccezione())){
  594.                                 mittenteRegistrato = false;
  595.                             }
  596.                         }

  597.                         // Registrazione degli errori effettuata solo in caso la modalita di Validazione
  598.                         // della busta sia "Warning Only" o "active"
  599.                         msgDiag.addKeyword(CostantiPdD.KEY_ECCEZIONI, eccBuffer.toString());
  600.                         msgDiag.addKeyword(CostantiPdD.KEY_NUMERO_ECCEZIONI, errors.size()+"");
  601.                         msgDiag.logPersonalizzato("validazioneBusta.bustaNonCorretta");

  602.                         // Spedizione BustaErrore contenente gli errori riscontrati, solo se
  603.                         // la modalita di validazione della busta e' "active"
  604.                         // e il Mittente e' comunque conosciuto.
  605.                         if( configurazionePdDManager.getTipoValidazione(implementazionePdDDestinatario).equals(CostantiConfigurazione.STATO_CON_WARNING_ABILITATO) == true) {

  606.                             // Spedisco un Errore ad un mittente conosciuto...
  607.                             boolean segnalazioneErrore = false; // inviare una segnalazione su una nuova connessione non e' piu' supportato neanche da spcoop.
  608.                             if(mittenteRegistrato && segnalazioneErrore){
  609.                                
  610.                                 if( openspcoopstate.resourceReleased()) {
  611.                                     ((OpenSPCoopState)openspcoopstate).setUseConnection(true);
  612.                                     ((OpenSPCoopState)openspcoopstate).initResource(identitaPdD, "EJBUtils.segnalazioneErroreBustaRisposta", idTransazione);
  613.                                 }
  614.                                
  615.                                 // SPEDIZIONE BUSTA ERRORE AL MITTENTE DELLA BUSTA :
  616.                                 msgDiag.mediumDebug("Invio segnalazione di errore ...");
  617.                                 ejbUtils.sendAsRispostaBustaErrore_inoltroSegnalazioneErrore(bustaRisposta,errorsClone);

  618.                             }

  619.                             // GESTIONE INTERNA DI QUESTA BUSTA ERRORE :
  620.                             // spedisco prima eccezione riscontrata al SIL.
  621.                             msgDiag.mediumDebug("Invio eventuale messaggio di errore al servizio applicativo (gestione errore)...");
  622.                             if(sendRispostaApplicativa){
  623.                                 Eccezione eccezioneDaInviareServizioApplicativo = null;
  624.                                 if(errors.size()>1){
  625.                                     eccezioneDaInviareServizioApplicativo =
  626.                                             Eccezione.getEccezioneValidazione(ErroriCooperazione.ERRORE_GENERICO_PROTOCOLLO_NON_CORRETTO.getErroreCooperazione(), protocolFactory);
  627.                                     StringBuilder bfDescrizione = new StringBuilder();
  628.                                     for(int k=0; k<errors.size();k++){
  629.                                         Eccezione error = errors.get(k);
  630.                                         if(error.getDescrizione(protocolFactory)!=null)
  631.                                             bfDescrizione.append("["+traduttore.toString(error.getCodiceEccezione(),error.getSubCodiceEccezione())+"] "+error.getDescrizione(protocolFactory)+"\n");
  632.                                     }
  633.                                     if(bfDescrizione.length()>0)
  634.                                         eccezioneDaInviareServizioApplicativo.setDescrizione(bfDescrizione.toString());
  635.                                 }else{
  636.                                     eccezioneDaInviareServizioApplicativo = errors.get(0);
  637.                                 }

  638.                                 // profilo sincrono asincronoPolling, aspetta una risposta
  639.                                
  640.                                 IntegrationFunctionError integrationFunctionError = IntegrationFunctionError.INVALID_INTEROPERABILITY_PROFILE_RESPONSE;
  641.                                 if(validazione_integrationFunctionError!=null) {
  642.                                     integrationFunctionError = validazione_integrationFunctionError;
  643.                                 }
  644.                                 OpenSPCoop2Message responseMessageError =
  645.                                         this.generatoreErrore.build(pddContext, integrationFunctionError,
  646.                                                 eccezioneDaInviareServizioApplicativo,
  647.                                             richiestaDelegata.getIdSoggettoFruitore(),
  648.                                             parseException);
  649.                                 ejbUtils.sendRispostaApplicativaErrore(responseMessageError,richiestaDelegata,rollbackRiferimentoMessaggio,pd,sa);
  650.                                 esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  651.                                         msgDiag.getMessaggio_replaceKeywords("validazioneBusta.bustaNonCorretta"));
  652.                             }else{
  653.                                 // profilo OneWay, non aspetta una risposta
  654.                                 ejbUtils.releaseInboxMessage(false);
  655.                                 esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,
  656.                                         msgDiag.getMessaggio_replaceKeywords("validazioneBusta.bustaNonCorretta"));
  657.                             }
  658.                             msgDiag.mediumDebug("Rilascio connessione...");
  659.                             openspcoopstate.releaseResource();
  660.                             esito.setEsitoInvocazione(true);
  661.                             return esito;
  662.                         }
  663.                     }
  664.                 }
  665.             }





  666.             /* -----------
  667.              *
  668.              * Stampa dei messaggi di errore non GRAVI
  669.              * (frammento di codice raggiunto SOLO se profilo=LineeGuida1.1)
  670.              *
  671.              * ------------------ */
  672.             if( (bustaRisposta.containsEccezioniGravi()==false) && (bustaRisposta.sizeListaEccezioni()>0) ){
  673.                 msgDiag.addKeyword(CostantiPdD.KEY_ECCEZIONI, bustaRisposta.toStringListaEccezioni(protocolFactory));
  674.                 msgDiag.logPersonalizzato("ricezioneBusta.eccezioniNonGravi");
  675.             }
  676.             // Stampa di eventuali eccezioni NON GRAVI venute fuori durante la validazione della busta
  677.             if( (Busta.containsEccezioniGravi(errors)==false) && (errors.size()>0) ){
  678.                 msgDiag.addKeyword(CostantiPdD.KEY_ECCEZIONI, Busta.toStringListaEccezioni(errors, protocolFactory));
  679.                 msgDiag.addKeyword(CostantiPdD.KEY_NUMERO_ECCEZIONI, errors.size()+"" );
  680.                 msgDiag.logPersonalizzato("validazioneBusta.eccezioniNonGravi");
  681.             }





  682.             /* ------  Ricezione riscontri per il NAL (deve essere la prima attivita', poiche' effettua commit JDBC) -------- */
  683.             if(ricezioneRiscontri){
  684.                 if(bustaRisposta.sizeListaRiscontri() > 0){
  685.                    
  686.                     if(openspcoopstate.resourceReleased()) {
  687.                         ((OpenSPCoopState)openspcoopstate).setUseConnection(true);
  688.                         openspcoopstate.initResource(identitaPdD, this.idModulo, idTransazione);
  689.                     }
  690.                    
  691.                     for(int i=0;i<bustaRisposta.sizeListaRiscontri();i++){
  692.                         Riscontro r = bustaRisposta.getRiscontro(i);
  693.                        
  694.                         msgDiag.addKeyword(CostantiPdD.KEY_ID_BUSTA_RISCONTRATA, r.getID());
  695.                         msgDiag.addKeyword(CostantiPdD.KEY_DATA_RISCONTRO, r.getOraRegistrazione().toString());
  696.                         msgDiag.logPersonalizzato("ricezioneRiscontro");
  697.                         try{
  698.                             GestoreMessaggi msgRiscontrato = new GestoreMessaggi(openspcoopstate, true, r.getID(),Costanti.OUTBOX,msgDiag, pddContext);
  699.                             msgRiscontrato.validateAndDeleteMsgOneWayRiscontrato();
  700.                         }catch(Exception e){
  701.                             msgDiag.logErroreGenerico(e, "msgRiscontrato.validateAndDeleteMsgOneWayRiscontrato("+r.getID()+")");
  702.                         }
  703.                     }
  704.                 }
  705.             }



  706.            




  707.             /*   -------------- Controllo esistenza soggetto destinatario  ------------------ */
  708.             msgDiag.mediumDebug("Controllo appartenenza Destinazione Busta (controllo esistenza soggetto)...");
  709.             boolean existsSoggetto = false;
  710.             try{
  711.                 existsSoggetto = configurazionePdDManager.existsSoggetto(new IDSoggetto(bustaRisposta.getTipoDestinatario(),bustaRisposta.getDestinatario()), requestInfo);
  712.             }catch(Exception e){
  713.                 msgDiag.logErroreGenerico(e,"existsSoggetto("+bustaRisposta.getTipoDestinatario()+"/"+bustaRisposta.getDestinatario()+")");
  714.                 if(sendRispostaApplicativa){
  715.                     OpenSPCoop2Message responseMessageError =
  716.                             this.generatoreErrore.build(pddContext, IntegrationFunctionError.INTERNAL_RESPONSE_ERROR,
  717.                                     ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  718.                                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),e,
  719.                                             parseException);
  720.                     ejbUtils.sendRispostaApplicativaErrore(responseMessageError,richiestaDelegata,rollbackRiferimentoMessaggio,pd,sa);
  721.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  722.                             "existsSoggetto("+bustaRisposta.getTipoDestinatario()+"/"+bustaRisposta.getDestinatario()+")");
  723.                 }else{
  724.                     ejbUtils.releaseInboxMessage(false);
  725.                     esito.setStatoInvocazioneErroreNonGestito(e);
  726.                 }
  727.                 openspcoopstate.releaseResource();
  728.                 esito.setEsitoInvocazione(true);
  729.                 return esito;
  730.             }
  731.             if(!existsSoggetto){
  732.                 msgDiag.logPersonalizzato("soggettoDestinatarioNonGestito");
  733.                 if(sendRispostaApplicativa){
  734.                     OpenSPCoop2Message responseMessageError =
  735.                             this.generatoreErrore.build(pddContext, IntegrationFunctionError.INVALID_INTEROPERABILITY_PROFILE_RESPONSE,
  736.                                     ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  737.                                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_528_RISPOSTA_RICHIESTA_NON_VALIDA),null,
  738.                                             parseException);
  739.                     ejbUtils.sendRispostaApplicativaErrore(responseMessageError,richiestaDelegata,rollbackRiferimentoMessaggio,pd,sa);
  740.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  741.                             msgDiag.getMessaggio_replaceKeywords("soggettoDestinatarioNonGestito"));
  742.                 }else{
  743.                     ejbUtils.releaseInboxMessage(false);
  744.                     esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,
  745.                             msgDiag.getMessaggio_replaceKeywords("soggettoDestinatarioNonGestito"));
  746.                 }
  747.                 openspcoopstate.releaseResource();
  748.                 esito.setEsitoInvocazione(true);
  749.                 return esito;
  750.             }










  751.             /* -------------------
  752.                Controllo se la busta porta Dati .
  753.                In caso ad es. di riscontri ... arrivera' una busta senza dati, e senza profilo di collaborazione.
  754.                o comunque non devono essere considerati
  755.                --------------------- */
  756.             if(bustaDiServizio == true) {

  757.                 msgDiag.logPersonalizzato("ricezioneBustaServizio");

  758.                 // Scenario OneWay in modalita sincrona
  759.                 if(Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(richiestaDelegata.getScenario()) &&
  760.                         sendRispostaApplicativa){
  761.                     msgDiag.mediumDebug("Gestione riscontro per oneway in modalita sincrona...");
  762.                 }else{
  763.                     if(sendRispostaApplicativa){
  764.                         OpenSPCoop2Message responseMessageError =
  765.                                 this.generatoreErrore.build(pddContext, IntegrationFunctionError.EXPECTED_RESPONSE_NOT_FOUND,
  766.                                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  767.                                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_517_RISPOSTA_RICHIESTA_NON_RITORNATA),null,
  768.                                                 parseException);
  769.                         ejbUtils.sendRispostaApplicativaErrore(responseMessageError,richiestaDelegata,rollbackRiferimentoMessaggio,pd,sa);
  770.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  771.                                 msgDiag.getMessaggio_replaceKeywords("ricezioneBustaServizio"));
  772.                     }else{
  773.                         ejbUtils.releaseInboxMessage(true);
  774.                         esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,
  775.                                 msgDiag.getMessaggio_replaceKeywords("ricezioneBustaServizio"));
  776.                     }
  777.                     openspcoopstate.releaseResource();
  778.                     esito.setEsitoInvocazione(true);
  779.                     return esito;
  780.                 }
  781.             }







  782.             /* ------------  Gestione Duplicati  ------------- */
  783.                        
  784.             boolean checkDuplicato = imbustamentoFiltroDuplicatiAbilitato;
  785.             if(checkDuplicato){
  786.                
  787.                 try{
  788.                    
  789.                     // Istanzio gestore filtro duplicati
  790.                     String gestoreFiltroDuplicatiType = this.propertiesReader.getGestoreFiltroDuplicatiRepositoryBuste();
  791.                     ClassNameProperties prop = ClassNameProperties.getInstance();
  792.                     String gestoreFiltroDuplicatiClass = prop.getFiltroDuplicati(gestoreFiltroDuplicatiType);
  793.                     if(gestoreFiltroDuplicatiClass == null){
  794.                         throw new Exception("GestoreFiltroDuplicati non registrato ("+gestoreFiltroDuplicatiType+")");
  795.                     }
  796.                     IFiltroDuplicati gestoreFiltroDuplicati = (IFiltroDuplicati) this.loader.newInstance(gestoreFiltroDuplicatiClass);
  797.                     pddContext.addObject(org.openspcoop2.core.constants.Costanti.OPENSPCOOP_STATE, openspcoopstate );
  798.                     gestoreFiltroDuplicati.init(pddContext);
  799.                     if(gestoreFiltroDuplicati instanceof FiltroDuplicati){
  800.                         ((FiltroDuplicati)gestoreFiltroDuplicati).setHistoryBuste(historyBuste);
  801.                         ((FiltroDuplicati)gestoreFiltroDuplicati).setRepositoryBuste(repositoryBuste);
  802.                         ((FiltroDuplicati)gestoreFiltroDuplicati).setGestioneStateless(openspcoopstate instanceof OpenSPCoopStateless);
  803.                         ((FiltroDuplicati)gestoreFiltroDuplicati).setRepositoryIntervalloScadenzaMessaggi(this.propertiesReader.getRepositoryIntervalloScadenzaMessaggi());
  804.                     }
  805.                    
  806.                     boolean oldGestioneConnessione = false;
  807.                     boolean rinegozia = false;
  808.                     if(gestoreFiltroDuplicati.releaseRuntimeResourceBeforeCheck() && !openspcoopstate.resourceReleased()) {
  809.                         rinegozia = true;
  810. //                      System.out.println("[RISPOSTA] rilascio!!");
  811.                         msgDiag.mediumDebug("Rilascio connessione al database prima di verificare se la risposta è duplicata ...");
  812.                         oldGestioneConnessione = ((OpenSPCoopState)openspcoopstate).isUseConnection();
  813.                         ((OpenSPCoopState)openspcoopstate).setUseConnection(true);
  814.                         openspcoopstate.commit();
  815.                         openspcoopstate.releaseResource();
  816. //                      System.out.println("[RISPOSTA] rilasciata: "+
  817. //                              (((org.openspcoop2.pdd.core.state.OpenSPCoopState)openspcoopstate).getConnectionDB()==null || ((OpenSPCoopState)openspcoopstate).getConnectionDB().isClosed()));
  818.                     }
  819.                     boolean initConnectionForDuplicate = false;
  820.                     if(!gestoreFiltroDuplicati.releaseRuntimeResourceBeforeCheck() && openspcoopstate.resourceReleased()) {
  821.                         // il vecchio engine che verifica il filtro duplicati ha bisogno della connessione
  822.                         // inizializzo
  823.                         ((OpenSPCoopState)openspcoopstate).setUseConnection(true);
  824.                         openspcoopstate.initResource(identitaPdD, this.idModulo, idTransazione);
  825.                         historyBuste.updateState(openspcoopstate.getStatoRichiesta());
  826.                         repositoryBuste.updateState(openspcoopstate.getStatoRichiesta());
  827.                         profiloCollaborazione.updateState(openspcoopstate.getStatoRichiesta());
  828.                         ejbUtils.updateOpenSPCoopState(openspcoopstate);
  829.                         initConnectionForDuplicate = true;
  830.                     }
  831.                    
  832.                     boolean bustaDuplicata = gestoreFiltroDuplicati.isDuplicata(protocolFactory, bustaRisposta.getID());
  833.                
  834.                     // BUSTA GIA' PRECEDENTEMENTE RICEVUTA
  835.                     if (bustaDuplicata){
  836.                        
  837.                         pddContext.addObject(org.openspcoop2.core.constants.Costanti.RISPOSTA_DUPLICATA, "true");
  838.                        
  839.                         // Aggiorno duplicati
  840.                         msgDiag.logPersonalizzato("ricezioneBustaDuplicata.count");
  841.                         gestoreFiltroDuplicati.incrementaNumeroDuplicati(protocolFactory, bustaRisposta.getID());
  842.                         msgDiag.logPersonalizzato("ricezioneBustaDuplicata");
  843.                        
  844.                     }else {
  845.        
  846.                         // REGISTRAZIONE BUSTA RICEVUTA NELL'HISTORY
  847.                         gestoreFiltroDuplicati.registraBusta(protocolFactory, bustaRisposta);
  848.                         msgDiag.logPersonalizzato("ricezioneBusta.registrazionePerFiltroDuplicati");
  849.                     }
  850.                    
  851.                     if(gestoreFiltroDuplicati.releaseRuntimeResourceBeforeCheck() && rinegozia) {
  852. //                      System.out.println("[RISPOSTA] rinegozio!!");
  853.                         msgDiag.mediumDebug("Rinegozio connessione dopo la verifica di risposta duplicata ...");
  854.                         try{
  855.                             openspcoopstate.updateResource(idTransazione);
  856.                             ((OpenSPCoopState)openspcoopstate).setUseConnection(oldGestioneConnessione);
  857. //                          // Aggiorno risorse
  858. //                          ejbUtils.updateOpenSPCoopState(openspcoopstate);
  859. //                          msgRequest.updateOpenSPCoopState(openspcoopstate);                          
  860. //                          System.out.println("[RISPOSTA] rinegoziata: "+
  861. //                                  (((org.openspcoop2.pdd.core.state.OpenSPCoopState)openspcoopstate).getConnectionDB()!=null && !((OpenSPCoopState)openspcoopstate).getConnectionDB().isClosed()));
  862.                         }catch(Exception e){
  863.                             throw new Exception("Rinegoziazione connessione dopo la verifica di risposta duplicata fallita: "+e.getMessage(),e);
  864.                         }
  865.                     }
  866.                     if(!gestoreFiltroDuplicati.releaseRuntimeResourceBeforeCheck() && initConnectionForDuplicate) {
  867.                         openspcoopstate.commit();
  868.                     }
  869.                    
  870.                     if (bustaDuplicata){
  871.        
  872.                         if(sendRispostaApplicativa){
  873.                             /*this.xmlBuilder.msgErroreApplicativo_Processamento(proprietaErroreAppl,
  874.                                         CostantiPdD.CODICE_528_RISPOSTA_RICHIESTA_NON_VALIDA,
  875.                                         CostantiPdD.MSG_5XX_SISTEMA_NON_DISPONIBILE);*/
  876.                             OpenSPCoop2Message responseMessageError =
  877.                                     this.generatoreErrore.build(pddContext, IntegrationFunctionError.CONFLICT_RESPONSE,
  878.                                             Eccezione.getEccezioneValidazione(ErroriCooperazione.IDENTIFICATIVO_MESSAGGIO_GIA_PROCESSATO.getErroreCooperazione(),
  879.                                                         protocolFactory), identitaPdD, parseException);
  880.                             esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  881.                                     msgDiag.getMessaggio_replaceKeywords("ricezioneBustaDuplicata"));
  882.                             ejbUtils.setRollbackRichiestaInCasoErrore_rollbackHistory(false); // non devo cancellare la busta per la gestione dei duplicati
  883.                             ejbUtils.sendRispostaApplicativaErrore(responseMessageError,richiestaDelegata,rollbackRiferimentoMessaggio,pd,sa);
  884.                         }else{
  885.                             // Devo rilasciare il messaggio, senza cancellarlo dalla history.
  886.                             ejbUtils.releaseInboxMessage(false,true);
  887.                             esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,
  888.                                     msgDiag.getMessaggio_replaceKeywords("ricezioneBustaDuplicata"));
  889.                         }
  890.        
  891.                         openspcoopstate.commit();
  892.                         openspcoopstate.releaseResource();
  893.                         esito.setEsitoInvocazione(true);
  894.                         return esito;
  895.        
  896.                     }
  897.                    
  898.                 }catch(Exception e) {
  899.                     msgDiag.logErroreGenerico(e, "GestioneHistoryBusteRicevute");
  900.                     if(sendRispostaApplicativa){
  901.                         OpenSPCoop2Message responseMessageError =
  902.                                 this.generatoreErrore.build(pddContext, IntegrationFunctionError.INTERNAL_RESPONSE_ERROR,
  903.                                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  904.                                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),e,
  905.                                                 parseException);
  906.                         ejbUtils.sendRispostaApplicativaErrore(responseMessageError,richiestaDelegata,rollbackRiferimentoMessaggio,pd,sa);
  907.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"GestioneHistoryBusteRicevute");
  908.                     }else{
  909.                         ejbUtils.releaseInboxMessage(false);
  910.                         esito.setStatoInvocazioneErroreNonGestito(e);
  911.                     }
  912.                     openspcoopstate.releaseResource();
  913.                     esito.setEsitoInvocazione(true);
  914.                     return esito;
  915.                 }
  916.                
  917.                 pddContext.removeObject(org.openspcoop2.core.constants.Costanti.OPENSPCOOP_STATE);
  918.             }
  919.            













  920.             /* ------------  Validazione profilo di collaborazione Atteso  ------------- */
  921.             Eccezione ecc = null;
  922.             msgDiag.addKeyword(CostantiPdD.KEY_SCENARIO_COOPERAZIONE_GESTITO, richiestaDelegata.getScenario());
  923.             if(Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(richiestaDelegata.getScenario())){
  924.                 msgDiag.mediumDebug("Gestione profilo di collaborazione OneWay...");
  925.                 // Deve arrivare al massimo una busta con profilo null, o oneWay per compatibilita' con altre PdD
  926.                 if(bustaRisposta.getProfiloDiCollaborazione()!=null &&
  927.                         org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(bustaRisposta.getProfiloDiCollaborazione()) == false){
  928.                    
  929.                     msgDiag.logPersonalizzato("profiloCollaborazioneRisposta.diversoScenarioGestito");
  930.                     ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.PROFILO_COLLABORAZIONE_NON_VALIDO.getErroreProfiloCollaborazioneNonValido(
  931.                             "Profilo di collaborazione diverso dallo scenario di cooperazione (atteso OneWay)."),
  932.                     protocolFactory);
  933.                 }
  934.                 // Se arriva un riferimento msg deve comunque essere quello della richiesta
  935.                 // La validazione non valida il rifMsg per OneWay poiche' e' solo per compatibilita' con HPPdD
  936.                 else if(bustaRisposta.getRiferimentoMessaggio()!=null &&
  937.                         !bustaRisposta.getRiferimentoMessaggio().equals(idMessageRequest) &&
  938.                         !bustaRisposta.getRiferimentoMessaggio().equals(jtiIdModIRequest)){
  939.                     msgDiag.logPersonalizzato("riferimentoMessaggioNonValido");
  940.                     ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.RIFERIMENTO_MESSAGGIO_NON_VALIDO.getErroreCooperazione(),protocolFactory);
  941.                 }
  942.             }
  943.             if(Costanti.SCENARIO_SINCRONO_INVOCAZIONE_SERVIZIO.equals(richiestaDelegata.getScenario())){
  944.                 msgDiag.mediumDebug("Gestione profilo di collaborazione Sincrono...");
  945.                 if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(bustaRisposta.getProfiloDiCollaborazione()) == false){
  946.                     msgDiag.logPersonalizzato("profiloCollaborazioneRisposta.diversoScenarioGestito");
  947.                     ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.PROFILO_COLLABORAZIONE_NON_VALIDO.getErroreProfiloCollaborazioneNonValido(
  948.                     "Profilo di collaborazione diverso dallo scenario di cooperazione (atteso Sincrono)."),
  949.                     protocolFactory);
  950.                 }else if(bustaRisposta.getRiferimentoMessaggio()==null){
  951.                     msgDiag.logPersonalizzato("riferimentoMessaggioNonPresente");
  952.                     ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.RIFERIMENTO_MESSAGGIO_NON_PRESENTE.getErroreCooperazione(),protocolFactory);
  953.                 }else if(bustaRisposta.getRiferimentoMessaggio()!=null &&
  954.                         !bustaRisposta.getRiferimentoMessaggio().equals(idMessageRequest) &&
  955.                         !bustaRisposta.getRiferimentoMessaggio().equals(jtiIdModIRequest)){
  956.                     msgDiag.logPersonalizzato("riferimentoMessaggioNonValido");
  957.                     ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.RIFERIMENTO_MESSAGGIO_NON_VALIDO.getErroreCooperazione(),protocolFactory);
  958.                 }
  959.             }else if(Costanti.SCENARIO_ASINCRONO_SIMMETRICO_INVOCAZIONE_SERVIZIO.equals(richiestaDelegata.getScenario()) ||
  960.                     Costanti.SCENARIO_ASINCRONO_SIMMETRICO_CONSEGNA_RISPOSTA.equals(richiestaDelegata.getScenario()) ){
  961.                 msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoSimmetrico...");
  962.                 if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(bustaRisposta.getProfiloDiCollaborazione()) == false){
  963.                     msgDiag.logPersonalizzato("profiloCollaborazioneRisposta.diversoScenarioGestito");
  964.                     ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.PROFILO_COLLABORAZIONE_NON_VALIDO.getErroreProfiloCollaborazioneNonValido(
  965.                     "Profilo di collaborazione diverso dallo scenario di cooperazione (atteso AsincronoSimmetrico)."),
  966.                     protocolFactory);
  967.                 }else if(bustaRisposta.getRiferimentoMessaggio()==null){
  968.                     msgDiag.logPersonalizzato("riferimentoMessaggioNonPresente");
  969.                     ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.RIFERIMENTO_MESSAGGIO_NON_PRESENTE.getErroreCooperazione(),protocolFactory);
  970.                 }else if(bustaRisposta.getRiferimentoMessaggio()!=null &&
  971.                         !bustaRisposta.getRiferimentoMessaggio().equals(idMessageRequest) &&
  972.                         !bustaRisposta.getRiferimentoMessaggio().equals(jtiIdModIRequest)){
  973.                     msgDiag.logPersonalizzato("riferimentoMessaggioNonValido");
  974.                     ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.RIFERIMENTO_MESSAGGIO_NON_VALIDO.getErroreCooperazione(),protocolFactory);
  975.                 }
  976.             }
  977.             else if(Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_INVOCAZIONE_SERVIZIO.equals(richiestaDelegata.getScenario()) ||
  978.                     Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_POLLING.equals(richiestaDelegata.getScenario()) ){
  979.                 msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoAsimmetrico...");
  980.                 if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(bustaRisposta.getProfiloDiCollaborazione()) == false){
  981.                     msgDiag.logPersonalizzato("profiloCollaborazioneRisposta.diversoScenarioGestito");
  982.                     ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.PROFILO_COLLABORAZIONE_NON_VALIDO.getErroreProfiloCollaborazioneNonValido(
  983.                     "Profilo di collaborazione diverso dallo scenario di cooperazione (atteso AsincronoAsimmetrico)."),
  984.                     protocolFactory);
  985.                 }else if(bustaRisposta.getRiferimentoMessaggio()==null){
  986.                     msgDiag.logPersonalizzato("riferimentoMessaggioNonPresente");
  987.                     ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.RIFERIMENTO_MESSAGGIO_NON_PRESENTE.getErroreCooperazione(),protocolFactory);
  988.                 }else if(bustaRisposta.getRiferimentoMessaggio()!=null &&
  989.                         !bustaRisposta.getRiferimentoMessaggio().equals(idMessageRequest) &&
  990.                         !bustaRisposta.getRiferimentoMessaggio().equals(jtiIdModIRequest)){
  991.                     msgDiag.logPersonalizzato("riferimentoMessaggioNonValido");
  992.                     ecc = Eccezione.getEccezioneValidazione(ErroriCooperazione.RIFERIMENTO_MESSAGGIO_NON_VALIDO.getErroreCooperazione(),protocolFactory);
  993.                 }
  994.             }
  995.             if(ecc!=null){
  996.                 if(sendRispostaApplicativa){
  997.                     OpenSPCoop2Message responseMessageError =
  998.                             this.generatoreErrore.build(pddContext, IntegrationFunctionError.INVALID_INTEROPERABILITY_PROFILE_RESPONSE,ecc,
  999.                                 richiestaDelegata.getIdSoggettoFruitore(),parseException);
  1000.                     ejbUtils.sendRispostaApplicativaErrore(responseMessageError,richiestaDelegata,rollbackRiferimentoMessaggio,pd,sa);
  1001.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,ecc.toString(protocolFactory));
  1002.                 }else{
  1003.                     ejbUtils.releaseInboxMessage(false);
  1004.                     esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,ecc.toString(protocolFactory));
  1005.                 }
  1006.                 openspcoopstate.releaseResource();
  1007.                 esito.setEsitoInvocazione(true);
  1008.                 return esito;
  1009.             }














  1010.             /* ------------  Profilo di collaborazione  ------------- */
  1011.             msgDiag.mediumDebug("Gestione profilo...");
  1012.             if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(bustaRisposta.getProfiloDiCollaborazione())){
  1013.                 msgDiag.logPersonalizzato("rispostaOneway");
  1014.             }
  1015.             else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(bustaRisposta.getProfiloDiCollaborazione())){

  1016.                 // Eliminazione informazioni sincrone
  1017.                 msgDiag.mediumDebug("Gestione profilo di collaborazione Sincrono (elimina richiesta in OutBox)...");
  1018.                 try{
  1019.                     profiloCollaborazione.sincrono_eliminaRichiestaInOutBox(bustaRisposta.getRiferimentoMessaggio());
  1020.                 }catch(Exception e){
  1021.                     msgDiag.logErroreGenerico(e, "profiloCollaborazione.sincrono_eliminaRichiestaInOutBox");
  1022.                     OpenSPCoop2Message responseMessageError =
  1023.                             this.generatoreErrore.build(pddContext, IntegrationFunctionError.INTERNAL_RESPONSE_ERROR,
  1024.                                     ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1025.                                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),e,
  1026.                                             parseException);
  1027.                     ejbUtils.sendRispostaApplicativaErrore(responseMessageError,richiestaDelegata,rollbackRiferimentoMessaggio,pd,sa);
  1028.                     openspcoopstate.releaseResource();
  1029.                     esito.setEsitoInvocazione(true);
  1030.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO, "profiloCollaborazione.sincrono_eliminaRichiestaInOutBox");
  1031.                     return esito;
  1032.                 }
  1033.             }
  1034.             else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(bustaRisposta.getProfiloDiCollaborazione())) {

  1035.                 // un riferimento msg vi e' per forza, altrimenti non supera il controllo precedente sullo scenario

  1036.                 //  Ricevuta alla richiesta.
  1037.                 if(RuoloBusta.RICEVUTA_RICHIESTA.equals(ruoloBustaRicevuta.toString())){
  1038.                     ricevutaAsincrona = "ricevuta di una richiesta asincrona simmetrica";
  1039.                 }
  1040.                 //  Ricevuta alla risposta.
  1041.                 else if(RuoloBusta.RICEVUTA_RISPOSTA.equals(ruoloBustaRicevuta.toString())){
  1042.                     ricevutaAsincrona = "ricevuta di una risposta asincrona simmetrica";
  1043.                 }
  1044.                 else{
  1045.                     String motivazioneErrore = "Gestione busta di risposta asincrona simmetrica non permessa (Busta "+bustaRisposta.getID()+"); il modulo attendeva una ricevuta asincrona";
  1046.                     msgDiag.logErroreGenerico(motivazioneErrore,"GestioneProfiloAsincronoSimmetrico");
  1047.                     ejbUtils.releaseInboxMessage(false);
  1048.                     openspcoopstate.releaseResource();
  1049.                     esito.setEsitoInvocazione(true);
  1050.                     esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,motivazioneErrore);
  1051.                     return esito;
  1052.                 }
  1053.             }else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(bustaRisposta.getProfiloDiCollaborazione())) {

  1054.                 // un riferimento msg vi e' per forza, altrimenti non supera il controllo precedente sullo scenario
  1055.                
  1056.                 //  Ricevuta alla richiesta.
  1057.                 if(RuoloBusta.RICEVUTA_RICHIESTA.equals(ruoloBustaRicevuta.toString())){
  1058.                        
  1059.                     ricevutaAsincrona = "ricevuta di una richiesta asincrona asimmetrica";
  1060.                        
  1061.                 }
  1062.                 //  Ricevuta alla risposta.
  1063.                 else if(RuoloBusta.RICEVUTA_RISPOSTA.equals(ruoloBustaRicevuta.toString())){
  1064.                    
  1065.                     ricevutaAsincrona = "ricevuta di una risposta asincrona asimmetrica contenente l'esito della richiesta stato";
  1066.                                                    
  1067.                 }
  1068.                 else{
  1069.                     String motivazioneErrore = "Gestione busta di risposta asincrona asimmetrica non permessa (Busta "+bustaRisposta.getID()+"); il modulo attendeva una ricevuta asincrona";
  1070.                     msgDiag.logErroreGenerico(motivazioneErrore, "GestioneProfiloAsincronoAsimmetrico");
  1071.                     ejbUtils.releaseInboxMessage(false);
  1072.                     openspcoopstate.releaseResource();
  1073.                     esito.setEsitoInvocazione(true);
  1074.                     esito.setStatoInvocazione(EsitoLib.ERRORE_NON_GESTITO,motivazioneErrore);
  1075.                     return esito;
  1076.                        
  1077.                 }
  1078.             }    











  1079.             /* ----------------- GestioneBustaArrivata ----------------- */
  1080.             if(sendRispostaApplicativa){

  1081.                 // Spedisco risposta applicativa

  1082.                 if(Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(richiestaDelegata.getScenario())){


  1083.                     msgResponse = new GestoreMessaggi(openspcoopstate, false, bustaRisposta.getID(), Costanti.INBOX, msgDiag,pddContext);
  1084.                     msgDiag.mediumDebug("Aggiorno proprietario messaggio...");
  1085.                     // Aggiorno proprietario messaggio
  1086.                     msgResponse.aggiornaProprietarioMessaggio(TimerGestoreMessaggi.ID_MODULO);
  1087.                     msgDiag.mediumDebug("Elimino accesso da PdD...");
  1088.                     // Elimino accesso daPdD
  1089.                     repositoryBuste.eliminaUtilizzoPdDFromInBox(idResponse);

  1090.                     msgDiag.mediumDebug("Invio messaggio 'OK' al modulo di RicezioneContenutiApplicativi, oneway con scenario sincrono...");

  1091.                     if(protocolManager.isHttpEmptyResponseOneWay())
  1092.                         msgResponse = ejbUtils.sendRispostaApplicativaOK(MessageUtilities.buildEmptyMessage(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),
  1093.                                 requestInfo.getIntegrationRequestMessageType(),MessageRole.RESPONSE),richiestaDelegata,pd,sa);
  1094.                     else
  1095.                         msgResponse = ejbUtils.sendRispostaApplicativaOK(ejbUtils.buildOpenSPCoopOK(requestInfo.getIntegrationRequestMessageType(), idMessageRequest),richiestaDelegata,pd,sa);
  1096.                    
  1097.                 } else {
  1098.                     msgDiag.mediumDebug("Send risposta applicativa...");
  1099.                     msgResponse = ejbUtils.sendRispostaApplicativa(richiestaDelegata,pd,sa);
  1100.                 }

  1101.             } else {

  1102.                 // Elimino la risposta
  1103.                 msgResponse = new GestoreMessaggi(openspcoopstate, false, bustaRisposta.getID(),Costanti.INBOX,msgDiag,pddContext);
  1104.                 msgDiag.mediumDebug("Aggiorno proprietario messaggio...");
  1105.                 // Aggiorno proprietario messaggio
  1106.                 msgResponse.aggiornaProprietarioMessaggio(TimerGestoreMessaggi.ID_MODULO);
  1107.                 msgDiag.mediumDebug("Elimino accesso da PdD...");
  1108.                 // Elimino accesso daPdD
  1109.                 repositoryBuste.eliminaUtilizzoPdDFromInBox(idResponse,statelessAsincrono);
  1110.             }

  1111.             msgDiag.mediumDebug("Commit delle operazioni per la gestione della busta...");
  1112.             openspcoopstate.commit();

  1113.         }catch(Throwable e){
  1114.             this.log.error("ErroreGenerale",e);
  1115.             msgDiag.logErroreGenerico(e, "Generale");
  1116.            
  1117.             if(sendRispostaApplicativa){
  1118.                 OpenSPCoop2Message responseMessageError =
  1119.                         this.generatoreErrore.build(pddContext, IntegrationFunctionError.INTERNAL_RESPONSE_ERROR,
  1120.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreIntegrazione(),e,
  1121.                                     parseException);
  1122.                 try{
  1123.                     ejbUtils.sendRispostaApplicativaErrore(responseMessageError,richiestaDelegata,rollbackRiferimentoMessaggio,pd,sa);
  1124.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"ErroreGenerale");
  1125.                     esito.setEsitoInvocazione(true);
  1126.                 }catch(Exception er){
  1127.                     msgDiag.logErroreGenerico(er,"ejbUtils.sendErroreGenerale(profiloConRisposta)");
  1128.                     ejbUtils.rollbackMessage("Spedizione Errore al Mittente durante una richiesta sincrona non riuscita", esito);
  1129.                     esito.setStatoInvocazioneErroreNonGestito(er);
  1130.                     esito.setEsitoInvocazione(false);
  1131.                 }
  1132.             }else{
  1133.                 ejbUtils.rollbackMessage("ErroreGenerale:"+e.getMessage(), esito);
  1134.                 esito.setEsitoInvocazione(false);
  1135.                 esito.setStatoInvocazioneErroreNonGestito(e);
  1136.             }
  1137.             openspcoopstate.releaseResource();
  1138.             return esito;
  1139.         }

  1140.         // Aggiornamento cache messaggio
  1141.         if(msgResponse!=null)
  1142.             msgResponse.addMessaggiIntoCache_readFromTable(SbustamentoRisposte.ID_MODULO, "risposte");

  1143.         // Aggiornamento cache proprietario messaggio
  1144.         if(msgResponse!=null)
  1145.             msgResponse.addProprietariIntoCache_readFromTable(SbustamentoRisposte.ID_MODULO, "risposte",idMessageRequest,false);

  1146.         //  Gestione ricevute
  1147.         if(ricevutaAsincrona!=null){
  1148.             msgDiag.mediumDebug("Gestione ricevute asincrone...");
  1149.             try{

  1150.                 boolean forzaEliminazioneMessaggio = false;
  1151.                 if( (openspcoopstate instanceof OpenSPCoopStateless) &&  
  1152.                         ("ricevuta di una richiesta asincrona simmetrica".equals(ricevutaAsincrona)) ){
  1153.                     forzaEliminazioneMessaggio = true;
  1154.                 }
  1155.                
  1156.                 GestoreMessaggi msgRiscontrato = new GestoreMessaggi(openspcoopstate, false ,bustaRisposta.getRiferimentoMessaggio(),Costanti.OUTBOX,msgDiag,pddContext);
  1157.                 msgRiscontrato.setReadyForDrop(forzaEliminazioneMessaggio);
  1158.                 msgRiscontrato.validateAndDeleteMsgAsincronoRiscontrato(bustaRisposta);
  1159.                 msgDiag.addKeyword(CostantiPdD.KEY_TIPO_RICEVUTA_ASINCRONA, ricevutaAsincrona);
  1160.                 msgDiag.logPersonalizzato("validazioneRicevutaAsincrona");
  1161.             }catch(Exception e){
  1162.                 msgDiag.logErroreGenerico(e,"Validazione("+ricevutaAsincrona+")");
  1163.             }
  1164.         }

  1165.         //  Rilascio connessione al DB
  1166.         msgDiag.mediumDebug("Rilascio connessione al database...");
  1167.         openspcoopstate.releaseResource();

  1168.         msgDiag.mediumDebug("Lavoro Terminato.");
  1169.         esito.setStatoInvocazione(EsitoLib.OK, null);

  1170.         esito.setEsitoInvocazione(true);
  1171.         return esito;

  1172.     }
  1173. }