Sbustamento.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.PortaApplicativa;
  22. import org.openspcoop2.core.config.PortaDelegata;
  23. import org.openspcoop2.core.config.ServizioApplicativo;
  24. import org.openspcoop2.core.config.constants.CostantiConfigurazione;
  25. import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
  26. import org.openspcoop2.core.constants.TipoPdD;
  27. import org.openspcoop2.core.eccezione.details.DettaglioEccezione;
  28. import org.openspcoop2.core.eccezione.details.constants.TipoEccezione;
  29. import org.openspcoop2.core.eccezione.details.utils.XMLUtils;
  30. import org.openspcoop2.core.id.IDPortaDelegata;
  31. import org.openspcoop2.core.id.IDServizio;
  32. import org.openspcoop2.core.id.IDServizioApplicativo;
  33. import org.openspcoop2.core.id.IDSoggetto;
  34. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  35. import org.openspcoop2.message.OpenSPCoop2Message;
  36. import org.openspcoop2.message.OpenSPCoop2MessageFactory;
  37. import org.openspcoop2.message.constants.MessageRole;
  38. import org.openspcoop2.message.utils.MessageUtilities;
  39. import org.openspcoop2.pdd.config.ClassNameProperties;
  40. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  41. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  42. import org.openspcoop2.pdd.config.RichiestaApplicativa;
  43. import org.openspcoop2.pdd.config.RichiestaDelegata;
  44. import org.openspcoop2.pdd.core.CostantiPdD;
  45. import org.openspcoop2.pdd.core.EJBUtils;
  46. import org.openspcoop2.pdd.core.EJBUtilsConsegnaException;
  47. import org.openspcoop2.pdd.core.GestoreMessaggi;
  48. import org.openspcoop2.pdd.core.PdDContext;
  49. import org.openspcoop2.pdd.core.behaviour.Behaviour;
  50. import org.openspcoop2.pdd.core.state.IOpenSPCoopState;
  51. import org.openspcoop2.pdd.core.state.OpenSPCoopState;
  52. import org.openspcoop2.pdd.core.state.OpenSPCoopStateException;
  53. import org.openspcoop2.pdd.core.state.OpenSPCoopStateless;
  54. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  55. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  56. import org.openspcoop2.pdd.services.error.RicezioneBusteExternalErrorGenerator;
  57. import org.openspcoop2.pdd.services.error.RicezioneContenutiApplicativiInternalErrorGenerator;
  58. import org.openspcoop2.protocol.engine.constants.Costanti;
  59. import org.openspcoop2.protocol.engine.driver.History;
  60. import org.openspcoop2.protocol.engine.driver.IFiltroDuplicati;
  61. import org.openspcoop2.protocol.engine.driver.ProfiloDiCollaborazione;
  62. import org.openspcoop2.protocol.engine.driver.RepositoryBuste;
  63. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  64. import org.openspcoop2.protocol.registry.RisultatoValidazione;
  65. import org.openspcoop2.protocol.sdk.Busta;
  66. import org.openspcoop2.protocol.sdk.Eccezione;
  67. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  68. import org.openspcoop2.protocol.sdk.Integrazione;
  69. import org.openspcoop2.protocol.sdk.Riscontro;
  70. import org.openspcoop2.protocol.sdk.builder.ProprietaErroreApplicativo;
  71. import org.openspcoop2.protocol.sdk.config.IProtocolConfiguration;
  72. import org.openspcoop2.protocol.sdk.config.IProtocolManager;
  73. import org.openspcoop2.protocol.sdk.config.IProtocolVersionManager;
  74. import org.openspcoop2.protocol.sdk.config.ITraduttore;
  75. import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
  76. import org.openspcoop2.protocol.sdk.constants.CodiceErroreIntegrazione;
  77. import org.openspcoop2.protocol.sdk.constants.ErroreCooperazione;
  78. import org.openspcoop2.protocol.sdk.constants.ErroreIntegrazione;
  79. import org.openspcoop2.protocol.sdk.constants.ErroriCooperazione;
  80. import org.openspcoop2.protocol.sdk.constants.ErroriIntegrazione;
  81. import org.openspcoop2.protocol.sdk.constants.FunzionalitaProtocollo;
  82. import org.openspcoop2.protocol.sdk.constants.Inoltro;
  83. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  84. import org.openspcoop2.protocol.sdk.constants.RuoloBusta;
  85. import org.openspcoop2.protocol.sdk.constants.TipoOraRegistrazione;
  86. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  87. import org.openspcoop2.utils.date.DateManager;
  88. import org.openspcoop2.utils.date.DateUtils;
  89. import org.openspcoop2.utils.resources.Loader;
  90. import org.slf4j.Logger;


  91. /**
  92.  *
  93.  * Contiene la libreria Sbustamento
  94.  *
  95.  * @author Poli Andrea (apoli@link.it)
  96.  * @author Tronci Fabio (tronci@link.it)
  97.  * @author $Author$
  98.  * @version $Rev$, $Date$
  99.  *
  100.  */
  101. public class Sbustamento extends GenericLib{

  102.     public static final String ID_MODULO = "Sbustamento";

  103.     /** XMLBuilder */
  104.     private RicezioneContenutiApplicativiInternalErrorGenerator generatoreErrore;


  105.     public Sbustamento(Logger log) throws GenericLibException {
  106.         super(Sbustamento.ID_MODULO, log);
  107.         inizializza();
  108.     }

  109.     @Override
  110.     protected synchronized void inizializza() throws GenericLibException {
  111.         super.inizializza();
  112.     }

  113.     @Override
  114.     public EsitoLib _onMessage(IOpenSPCoopState openspcoopstate,
  115.             RegistroServiziManager registroServiziManager,ConfigurazionePdDManager configurazionePdDManager,
  116.             MsgDiagnostico msgDiag) throws OpenSPCoopStateException {

  117.         SbustamentoMessage sbustamentoMsg = (SbustamentoMessage) openspcoopstate.getMessageLib();
  118.        
  119.         EsitoLib esito = new EsitoLib();

  120.         /* PddContext */
  121.         PdDContext pddContext = sbustamentoMsg.getPddContext();
  122.         String idTransazione = PdDContext.getValue(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE, pddContext);
  123.         RequestInfo requestInfo = (RequestInfo) pddContext.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  124.        
  125.         /* Protocol Factory */
  126.         IProtocolFactory<?> protocolFactory = null;
  127.         IProtocolVersionManager protocolManager = null;
  128.         ITraduttore traduttore = null;
  129.         try{
  130.             protocolFactory = this.protocolFactoryManager.getProtocolFactoryByName((String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME));
  131.             protocolManager = protocolFactory.createProtocolVersionManager(sbustamentoMsg.getRichiestaApplicativa().getProfiloGestione());
  132.             traduttore = protocolFactory.createTraduttore();
  133.         }catch(Exception e){
  134.             msgDiag.logErroreGenerico(e, "ProtocolFactory.instanziazione");
  135.             openspcoopstate.releaseResource();
  136.             esito.setEsitoInvocazione(false);
  137.             esito.setStatoInvocazioneErroreNonGestito(e);
  138.             return esito;
  139.         }
  140.        
  141.        
  142.         msgDiag.setPddContext(pddContext, protocolFactory);
  143.        
  144.         /* Busta e tipo di implementazione PdD con cui interoperare */
  145.         Busta bustaRichiesta = sbustamentoMsg.getBusta();
  146.         String implementazionePdDMittente = sbustamentoMsg.getImplementazionePdDSoggettoMittente();
  147.        
  148.         /* Intrepretazione informazioni */
  149.         RichiestaApplicativa richiestaApplicativa = sbustamentoMsg.getRichiestaApplicativa();
  150.         if(richiestaApplicativa==null) {
  151.             msgDiag.logErroreGenerico("RichiestaApplicativa is null", "RichiestaApplicativa.checkNull");
  152.             openspcoopstate.releaseResource();
  153.             esito.setEsitoInvocazione(false);
  154.             return esito;
  155.         }
  156.    
  157.         TipoPdD tipoPdD = TipoPdD.APPLICATIVA;
  158.         if(msgDiag.getPorta()==null) {
  159.             if(richiestaApplicativa!=null && richiestaApplicativa.getIdPortaApplicativa()!=null) {
  160.                 msgDiag.updatePorta(tipoPdD, richiestaApplicativa.getIdPortaApplicativa().getNome(), requestInfo);
  161.             }
  162.         }
  163.        
  164.         IDServizio idServizio = richiestaApplicativa.getIDServizio();
  165.         IDSoggetto idSoggettoFruitore = richiestaApplicativa.getSoggettoFruitore();
  166.         java.util.List<Eccezione> errors = sbustamentoMsg.getErrors();
  167.         IntegrationFunctionError validazione_integrationFunctionError = sbustamentoMsg.getIntegrationFunctionErrorValidazione();
  168.         boolean isMessaggioErroreProtocollo = sbustamentoMsg.isMessaggioErroreProtocollo();
  169.         boolean bustaDiServizio = sbustamentoMsg.getIsBustaDiServizio();
  170.         IDSoggetto identitaPdD = sbustamentoMsg.getRichiestaApplicativa().getDominio();
  171.        
  172.         msgDiag.setDominio(identitaPdD);  // imposto anche il dominio nel msgDiag
  173.         msgDiag.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_SBUSTAMENTO);
  174.         msgDiag.addKeywords(bustaRichiesta, true);
  175.         if(richiestaApplicativa.getIdentitaServizioApplicativoFruitore()!=null){
  176.             msgDiag.addKeyword(CostantiPdD.KEY_SA_FRUITORE, richiestaApplicativa.getIdentitaServizioApplicativoFruitore());
  177.         }
  178.         msgDiag.setIdCorrelazioneApplicativa(richiestaApplicativa.getIdCorrelazioneApplicativa());
  179.         msgDiag.addKeyword(CostantiPdD.KEY_ID_CORRELAZIONE_APPLICATIVA, richiestaApplicativa.getIdCorrelazioneApplicativa());
  180.        
  181.         String profiloGestione = richiestaApplicativa.getProfiloGestione();
  182.         msgDiag.mediumDebug("Profilo di gestione ["+Sbustamento.ID_MODULO+"] della busta: "+profiloGestione);
  183.        
  184.         try{
  185.             this.generatoreErrore = new RicezioneContenutiApplicativiInternalErrorGenerator(this.log, this.idModulo, requestInfo);
  186.             this.generatoreErrore.updateInformazioniCooperazione(idSoggettoFruitore, idServizio);
  187.             this.generatoreErrore.updateTipoPdD(TipoPdD.APPLICATIVA);
  188.         }catch(Exception e){
  189.             msgDiag.logErroreGenerico(e, "RicezioneContenutiApplicativiGeneratoreErrore.instanziazione");
  190.             openspcoopstate.releaseResource();
  191.             esito.setEsitoInvocazione(false);
  192.             esito.setStatoInvocazioneErroreNonGestito(e);
  193.             return esito;
  194.         }
  195.        

  196.         /* ------------------ Inizializzo stato OpenSPCoop  --------------- */
  197.         msgDiag.mediumDebug("Inizializzo stato per la gestione della richiesta...");
  198.         openspcoopstate.initResource(identitaPdD, Sbustamento.ID_MODULO,idTransazione);
  199.         registroServiziManager = registroServiziManager.refreshState(openspcoopstate.getStatoRichiesta(),openspcoopstate.getStatoRisposta());
  200.         configurazionePdDManager = configurazionePdDManager.refreshState(registroServiziManager);
  201.         msgDiag.updateState(configurazionePdDManager);


  202.         /* ------------- STATO RICHIESTA E STATO RISPOSTA ------------------------------- */
  203.         //  IState statoRichiesta = openSPCoopState.getStatoRichiesta();
  204.         //  IState statoRisposta = openSPCoopState.getStatoRisposta();

  205.         /* ----------------- ID RICHIESTA ---------------------------------------------- */
  206.         String idMessageRequest = openspcoopstate.getIDMessaggioSessione();


  207.         // Aggiornamento Informazioni
  208.         msgDiag.setIdMessaggioRichiesta(idMessageRequest);
  209.         msgDiag.setFruitore(idSoggettoFruitore);
  210.         msgDiag.setServizio(idServizio);



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

  213.         // EJBUtils (per eventuali errori)
  214.         EJBUtils ejbUtils = null;
  215.         try{
  216.             ejbUtils = new EJBUtils(identitaPdD,tipoPdD,Sbustamento.ID_MODULO,idMessageRequest, idMessageRequest,Costanti.INBOX,openspcoopstate,msgDiag,false,
  217.                     sbustamentoMsg.getImplementazionePdDSoggettoMittente(),
  218.                     sbustamentoMsg.getImplementazionePdDSoggettoDestinatario(),
  219.                     profiloGestione,pddContext);
  220.         }catch(Exception e){
  221.             msgDiag.logErroreGenerico(e, "EJBUtils.new");
  222.             openspcoopstate.releaseResource();
  223.             esito.setEsitoInvocazione(false);
  224.             esito.setStatoInvocazioneErroreNonGestito(e);
  225.             return esito;
  226.         }
  227.        
  228.         try{
  229.             RicezioneBusteExternalErrorGenerator generatoreErrorePA = new RicezioneBusteExternalErrorGenerator(this.log, this.idModulo, requestInfo, openspcoopstate.getStatoRichiesta());
  230.             generatoreErrorePA.updateInformazioniCooperazione(idSoggettoFruitore, idServizio);
  231.             generatoreErrorePA.updateInformazioniCooperazione(richiestaApplicativa.getIdentitaServizioApplicativoFruitore());
  232.             generatoreErrorePA.updateTipoPdD(TipoPdD.APPLICATIVA);
  233.             ejbUtils.setGeneratoreErrorePortaApplicativa(generatoreErrorePA);
  234.         }catch(Exception e){
  235.             msgDiag.logErroreGenerico(e, "RicezioneBusteExternalErrorGenerator.instanziazione");
  236.             openspcoopstate.releaseResource();
  237.             esito.setEsitoInvocazione(false);
  238.             esito.setStatoInvocazioneErroreNonGestito(e);
  239.             return esito;
  240.         }

  241.         // Oneway versione 11
  242.         boolean oneWayVersione11 = sbustamentoMsg.isOneWayVersione11();
  243.         ejbUtils.setOneWayVersione11(oneWayVersione11);
  244.         ejbUtils.setPortaDiTipoStateless_esclusoOneWay11(sbustamentoMsg.isStateless());
  245.        
  246.         // Gestori funzionalita'
  247.         ProfiloDiCollaborazione profiloCollaborazione = null;
  248.         try{
  249.             profiloCollaborazione = new ProfiloDiCollaborazione(openspcoopstate.getStatoRichiesta(),protocolFactory);
  250.         }catch(Exception e){
  251.             msgDiag.logErroreGenerico(e, "ProfiloDiCollaborazione.new");
  252.             openspcoopstate.releaseResource();
  253.             esito.setEsitoInvocazione(false);
  254.             esito.setStatoInvocazioneErroreNonGestito(e);
  255.             return esito;
  256.         }
  257.         History historyBuste = new History(openspcoopstate.getStatoRichiesta());
  258.         RepositoryBuste repositoryBuste = new RepositoryBuste(openspcoopstate.getStatoRichiesta(), true,protocolFactory);
  259.         String ricevutaAsincrona = null;

  260.        
  261.         // Gestore Messaggi
  262.         GestoreMessaggi msgRequest = new GestoreMessaggi(openspcoopstate,true, idMessageRequest,Costanti.INBOX,msgDiag,pddContext);
  263.         GestoreMessaggi msgResponse = null; // Evenutuale busta spedita indietro contenente riscontri...
  264.         msgRequest.setOneWayVersione11(oneWayVersione11);
  265.        
  266.         // Informazioni di integrazione
  267.         String servizioApplicativoFruitore = richiestaApplicativa.getIdentitaServizioApplicativoFruitore();
  268.         String idCorrelazioneApplicativa = richiestaApplicativa.getIdCorrelazioneApplicativa();

  269.                
  270.         // Modalita' gestione risposta (Sincrona/Fault/Ricevute...)
  271.         // Per i profili diversi dal sincrono e' possibile impostare dove far ritornare l'errore
  272.         boolean newConnectionForResponse = false;
  273.         if( (org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(bustaRichiesta.getProfiloDiCollaborazione())==false) &&
  274.                 (sbustamentoMsg.isStateless()==false) ) {
  275.             newConnectionForResponse = configurazionePdDManager.newConnectionForResponse();
  276.         }
  277.         ejbUtils.setReplyOnNewConnection(newConnectionForResponse);
  278.        
  279.         // Gestione indirizzo telematico
  280.         boolean gestioneIndirizzoTelematico = false;
  281.         if(sbustamentoMsg.isStateless()==false){
  282.             gestioneIndirizzoTelematico = configurazionePdDManager.isUtilizzoIndirizzoTelematico();
  283.         }
  284.         ejbUtils.setUtilizzoIndirizzoTelematico(gestioneIndirizzoTelematico);
  285.    
  286.        

  287.         // Indicazione se deve essere spedito lo sblocco al moduloRicezione
  288.         // non deve essere spedito SOLO se il modulo ha gia' terminato di gestire.
  289.         // Succede se:
  290.         // - e' abilitata la gestione dell'indirizzo telematico e la busta lo possiede nel mittente
  291.         // - profilo della busta non è sincrono e le risposte vengono mandate su di una nuova connessione
  292.         boolean sendSbloccoRicezioneBuste = true;
  293.         if ( configurazionePdDManager.isUtilizzoIndirizzoTelematico() && bustaRichiesta.getIndirizzoMittente()!=null &&
  294.                 (sbustamentoMsg.isStateless()==false) ){
  295.             sendSbloccoRicezioneBuste = false;
  296.         }else if( newConnectionForResponse ) {
  297.             sendSbloccoRicezioneBuste = false;
  298.         }

  299.         // Ruolo Busta ricevuta
  300.         RuoloBusta ruoloBustaRicevuta = sbustamentoMsg.getRuoloBustaRicevuta();



  301.        



  302.         // Punto di inizio per la transazione.
  303.         Busta bustaHTTPReply = null;
  304.         try{

  305.             boolean ricezioneRiscontri = false;
  306.             switch (protocolManager.getConsegnaAffidabile(bustaRichiesta)) {
  307.             case ABILITATA:
  308.                 ricezioneRiscontri = true;
  309.                 break;
  310.             case DISABILITATA:
  311.                 ricezioneRiscontri = false;
  312.                 break;
  313.             default:
  314.                 ricezioneRiscontri = this.propertiesReader.isGestioneRiscontri(implementazionePdDMittente);
  315.                 break;
  316.             }

  317.             boolean consegnaAffidabile = false;
  318.             switch (protocolManager.getConsegnaAffidabile(bustaRichiesta)) {
  319.             case ABILITATA:
  320.                 consegnaAffidabile = true;
  321.                 break;
  322.             case DISABILITATA:
  323.                 consegnaAffidabile = false;
  324.                 break;
  325.             default:
  326.                 consegnaAffidabile = this.propertiesReader.isGestioneRiscontri(implementazionePdDMittente) && bustaRichiesta.isConfermaRicezione();
  327.                 break;
  328.             }
  329.            
  330.             boolean idCollaborazione = false;
  331.             switch (protocolManager.getCollaborazione(bustaRichiesta)) {
  332.             case ABILITATA:
  333.                 idCollaborazione = true;
  334.                 break;
  335.             case DISABILITATA:
  336.                 idCollaborazione = false;
  337.                 break;
  338.             default:
  339.                 idCollaborazione = this.propertiesReader.isGestioneElementoCollaborazione(implementazionePdDMittente) && (bustaRichiesta.getCollaborazione()!=null);
  340.                 break;
  341.             }
  342.                    
  343.             boolean consegnaInOrdine = false;
  344.             switch (protocolManager.getConsegnaInOrdine(bustaRichiesta)) {
  345.                 case ABILITATA:
  346.                     consegnaInOrdine = true;
  347.                     break;
  348.                 case DISABILITATA:
  349.                     consegnaInOrdine = false;
  350.                     break;
  351.                 default:
  352.                     boolean gestioneConsegnaInOrdineAbilitata =  this.propertiesReader.isGestioneRiscontri(implementazionePdDMittente) &&
  353.                     this.propertiesReader.isGestioneElementoCollaborazione(implementazionePdDMittente) &&
  354.                     this.propertiesReader.isGestioneConsegnaInOrdine(implementazionePdDMittente);  
  355.                     consegnaInOrdine = gestioneConsegnaInOrdineAbilitata &&
  356.                         bustaRichiesta.getSequenza()!=-1;
  357.                     break;
  358.             }
  359.            
  360.             boolean imbustamentoFiltroDuplicatiAbilitato = false;
  361.             switch (protocolManager.getFiltroDuplicati(bustaRichiesta)) {
  362.             case ABILITATA:
  363.                 imbustamentoFiltroDuplicatiAbilitato = true;
  364.                 break;
  365.             case DISABILITATA:
  366.                 imbustamentoFiltroDuplicatiAbilitato = false;
  367.                 break;
  368.             default:
  369.                 imbustamentoFiltroDuplicatiAbilitato = (Inoltro.SENZA_DUPLICATI.equals(bustaRichiesta.getInoltro())) ||
  370.                 (this.propertiesReader.isCheckFromRegistroFiltroDuplicatiAbilitato(implementazionePdDMittente) && sbustamentoMsg.isFiltroDuplicatiRichiestoAccordo());
  371.                 break;
  372.             }
  373.            
  374.            
  375.            
  376.            
  377.            
  378.             // ------------- Controllo funzionalita di protocollo richieste siano compatibili con il protocollo -----------------------------
  379.             try{
  380.                
  381.                 // NOTA: Usare getIntegrationServiceBinding poichè le funzionalità si riferiscono al tipo di integrazione scelta
  382.                
  383.                 IProtocolConfiguration protocolConfiguration = protocolFactory.createProtocolConfiguration();
  384.                 if(bustaRichiesta.getProfiloDiCollaborazione()!=null &&
  385.                         !org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.UNKNOWN.equals(bustaRichiesta.getProfiloDiCollaborazione())){
  386.                     if(protocolConfiguration.isSupportato(requestInfo.getIntegrationServiceBinding(),bustaRichiesta.getProfiloDiCollaborazione())==false){
  387.                         throw new Exception("Profilo di Collaborazione ["+bustaRichiesta.getProfiloDiCollaborazione().getEngineValue()+"]");
  388.                     }
  389.                 }
  390.                 if(imbustamentoFiltroDuplicatiAbilitato){
  391.                     if(protocolConfiguration.isSupportato(requestInfo.getIntegrationServiceBinding(),FunzionalitaProtocollo.FILTRO_DUPLICATI)==false){
  392.                         throw new Exception(FunzionalitaProtocollo.FILTRO_DUPLICATI.getEngineValue());
  393.                     }
  394.                 }
  395.                 if(consegnaAffidabile){
  396.                     if(protocolConfiguration.isSupportato(requestInfo.getIntegrationServiceBinding(),FunzionalitaProtocollo.CONFERMA_RICEZIONE)==false){
  397.                         throw new Exception(FunzionalitaProtocollo.CONFERMA_RICEZIONE.getEngineValue());
  398.                     }
  399.                 }
  400.                 if(idCollaborazione){
  401.                     if(protocolConfiguration.isSupportato(requestInfo.getIntegrationServiceBinding(),FunzionalitaProtocollo.COLLABORAZIONE)==false){
  402.                         throw new Exception(FunzionalitaProtocollo.COLLABORAZIONE.getEngineValue());
  403.                     }
  404.                 }
  405.                 if(consegnaInOrdine){
  406.                     if(protocolConfiguration.isSupportato(requestInfo.getIntegrationServiceBinding(),FunzionalitaProtocollo.CONSEGNA_IN_ORDINE)==false){
  407.                         throw new Exception(FunzionalitaProtocollo.CONSEGNA_IN_ORDINE.getEngineValue());
  408.                     }
  409.                 }              
  410.             }catch(Exception e){    
  411.                 msgDiag.addKeywordErroreProcessamento(e);
  412.                 msgDiag.logPersonalizzato("protocolli.funzionalita.unsupported");
  413.                 ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.NOT_SUPPORTED_BY_PROTOCOL);
  414.                 ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  415.                         ErroriIntegrazione.ERRORE_439_FUNZIONALITA_NOT_SUPPORTED_BY_PROTOCOL.
  416.                         getErrore439_FunzionalitaNotSupportedByProtocol(e.getMessage(), protocolFactory),
  417.                         idCorrelazioneApplicativa,servizioApplicativoFruitore,null,
  418.                         null);
  419.                 openspcoopstate.releaseResource();
  420.                 esito.setEsitoInvocazione(true);    
  421.                 esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  422.                         msgDiag.getMessaggio_replaceKeywords("protocolli.funzionalita.unsupported"));
  423.                 return esito;
  424.             }
  425.            
  426.            
  427.            
  428.            
  429.            
  430.            
  431.            
  432.            




  433.             /*   -------------- Validazione: Gestione messaggio Errore Protocollo -----------------  */
  434.             if(isMessaggioErroreProtocollo){

  435.                 msgDiag.mediumDebug("Gestione messaggio errore protocollo...");
  436.                 boolean msgErroreProtocolloValido = true;

  437.                 // validazione
  438.                 if(configurazionePdDManager.getTipoValidazione(implementazionePdDMittente).equals(CostantiConfigurazione.STATO_CON_WARNING_DISABILITATO) == false){

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

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

  443.                         // Registrazione eccezioni riscontrate dalla validazione della busta
  444.                         StringBuilder eccBuffer = new StringBuilder();
  445.                         for(int k = 0; k < errors.size() ; k++){
  446.                             Eccezione er = errors.get(k);
  447.                             if(k>0)
  448.                                 eccBuffer.append("\n");
  449.                             eccBuffer.append(er.toString(protocolFactory));
  450.                         }
  451.                        
  452.                         msgDiag.addKeyword(CostantiPdD.KEY_NUMERO_ECCEZIONI, errors.size()+"");
  453.                         msgDiag.addKeyword(CostantiPdD.KEY_ECCEZIONI, eccBuffer.toString());
  454.                         msgDiag.logPersonalizzato("validazioneBustaErrore.listaEccezioniMalformata");

  455.                         // Il lavoro deve essere terminato solo in caso di Modalita Active
  456.                         if(configurazionePdDManager.getTipoValidazione(implementazionePdDMittente).equals(CostantiConfigurazione.STATO_CON_WARNING_ABILITATO) == true){
  457.                             msgErroreProtocolloValido=false;
  458.                         }  
  459.                     }

  460.                 }// -- end if not active

  461.                 if(msgErroreProtocolloValido){
  462.                     //   Registrazione eccezioni portate nella busta
  463.                     if(bustaRichiesta.sizeListaEccezioni()>0){
  464.                         msgDiag.addKeyword(CostantiPdD.KEY_ECCEZIONI, bustaRichiesta.toStringListaEccezioni(protocolFactory));
  465.                         msgDiag.addKeyword(CostantiPdD.KEY_NUMERO_ECCEZIONI, bustaRichiesta.sizeListaEccezioni()+"");
  466.                         msgDiag.logPersonalizzato("ricezioneBustaErrore");
  467.                     }
  468.                 }

  469.                 DettaglioEccezione dettaglioEccezione = sbustamentoMsg.getDettaglioEccezione();
  470.                 if(dettaglioEccezione!=null){
  471.                     msgDiag.addKeyword(CostantiPdD.KEY_OPENSPCOOP2_DETAILS, XMLUtils.toString(dettaglioEccezione));
  472.                     msgDiag.logPersonalizzato("ricezioneBustaErroreDetails");
  473.                 }
  474.                
  475.                 if(sendSbloccoRicezioneBuste){
  476.                     msgDiag.mediumDebug("Invio messaggio di sblocco a RicezioneBuste...");
  477.                     msgResponse = ejbUtils.sendSbloccoRicezioneBuste(richiestaApplicativa.getIdModuloInAttesa());
  478.                 }

  479.                 // spedizioneErrore  (se la validazione e' disattivata)
  480.                 msgDiag.mediumDebug("Invio eventuale messaggio di errore al servizio applicativo (gestione errore)...");
  481.                 Eccezione eccezioneDaInviareServizioApplicativo =
  482.                         Eccezione.getEccezioneValidazione(ErroriCooperazione.ERRORE_GENERICO_PROTOCOLLO_NON_CORRETTO.getErroreCooperazione(), protocolFactory);
  483.                 ErroreIntegrazione erroreIntegrazioneDaInviareServizioApplicativo = null;
  484.                 if(msgErroreProtocolloValido){
  485.                     if(bustaRichiesta.sizeListaEccezioni()>1){
  486.                         StringBuilder bfDescrizione = new StringBuilder();
  487.                         for(int k=0; k<bustaRichiesta.sizeListaEccezioni();k++){
  488.                             Eccezione eccLista = bustaRichiesta.getEccezione(k);
  489.                             if(eccLista.getDescrizione(protocolFactory)!=null)
  490.                                 bfDescrizione.append("["+traduttore.toString(eccLista.getCodiceEccezione(),eccLista.getSubCodiceEccezione())+"] "+eccLista.getDescrizione(protocolFactory)+"\n");
  491.                         }
  492.                         if(bfDescrizione.length()>0)
  493.                             eccezioneDaInviareServizioApplicativo.setDescrizione(bfDescrizione.toString());
  494.                     }   else {
  495.                         if(bustaRichiesta.sizeListaEccezioni()==1){
  496.                             eccezioneDaInviareServizioApplicativo = bustaRichiesta.getEccezione(0);
  497.                         }else{
  498.                             if(dettaglioEccezione!=null && dettaglioEccezione.getExceptions()!=null && dettaglioEccezione.getExceptions().sizeExceptionList()>0){
  499.                                 org.openspcoop2.core.eccezione.details.Eccezione e = dettaglioEccezione.getExceptions().getException(0);
  500.                                 if(TipoEccezione.PROTOCOL.equals(e.getType())){
  501.                                     ErroreCooperazione msgErroreCooperazione =
  502.                                             new ErroreCooperazione(e.getDescription(), traduttore.toCodiceErroreCooperazione(e.getCode()));
  503.                                     eccezioneDaInviareServizioApplicativo = new Eccezione(msgErroreCooperazione, false, Sbustamento.ID_MODULO, protocolFactory);
  504.                                 }else{
  505. //                                  erroreIntegrazioneDaInviareServizioApplicativo =
  506. //                                          new ErroreIntegrazione(e.getDescrizione(), traduttore.toCodiceErroreIntegrazione(e.getCodiceAAA(), propertiesReader.getProprietaGestioneErrorePD(protocolManager).getFaultPrefixCode()));
  507.                                     // Se e' arrivato un details di errore di integrazione, comunque genero una busta di errore di processamento, visto che di fatto ho ricevuto questa.
  508.                                     eccezioneDaInviareServizioApplicativo = Eccezione.
  509.                                             getEccezioneProcessamento(ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreProcessamento(e.getDescription()), protocolFactory);
  510.                                 }
  511.                             }else{
  512.                                 eccezioneDaInviareServizioApplicativo =
  513.                                         new Eccezione(ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreCooperazione(),
  514.                                                 false, Sbustamento.ID_MODULO, protocolFactory);
  515.                             }
  516.                         }
  517.                     }                  
  518.                 }
  519.                 else{
  520.                     if(errors.size()>1){
  521.                         StringBuilder bfDescrizione = new StringBuilder();
  522.                         for(int k=0; k<errors.size();k++){
  523.                             Eccezione error = errors.get(k);
  524.                             if(error.getDescrizione(protocolFactory)!=null)
  525.                                 bfDescrizione.append("["+traduttore.toString(error.getCodiceEccezione(),error.getSubCodiceEccezione())+"] "+error.getDescrizione(protocolFactory)+"\n");
  526.                         }
  527.                         if(bfDescrizione.length()>0)
  528.                             eccezioneDaInviareServizioApplicativo.setDescrizione(bfDescrizione.toString());
  529.                     }else{
  530.                         eccezioneDaInviareServizioApplicativo = errors.get(0);
  531.                     }
  532.                 }

  533.                 IntegrationFunctionError integrationFunctionError = validazione_integrationFunctionError;
  534.                 if(integrationFunctionError==null) {
  535.                     if( ruoloBustaRicevuta!=null && RuoloBusta.RISPOSTA.equals(ruoloBustaRicevuta.toString()) ){
  536.                         integrationFunctionError = IntegrationFunctionError.INTERNAL_RESPONSE_ERROR;
  537.                     }
  538.                     else {
  539.                         integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  540.                     }
  541.                 }
  542.                
  543.                 gestioneErroreProtocollo(configurazionePdDManager,ejbUtils,profiloCollaborazione,repositoryBuste,
  544.                         bustaRichiesta,identitaPdD,eccezioneDaInviareServizioApplicativo,erroreIntegrazioneDaInviareServizioApplicativo,
  545.                         new IDSoggetto(bustaRichiesta.getTipoMittente(),bustaRichiesta.getMittente()),
  546.                         dettaglioEccezione, protocolFactory, protocolManager, pddContext, requestInfo,
  547.                         integrationFunctionError);

  548.                 // Commit modifiche
  549.                 openspcoopstate.commit();
  550.                
  551.                 msgDiag.mediumDebug("Rilascio connessione...");
  552.                 openspcoopstate.releaseResource();
  553.                 esito.setEsitoInvocazione(true);
  554.                 esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"RicevutoMsgBustaErrore");
  555.                 return esito;
  556.             }













  557.             /*   -------------- Validazione: Gestione messaggio di protocollo  -----------------  */
  558.             else if(isMessaggioErroreProtocollo == false){
  559.                 if(configurazionePdDManager.getTipoValidazione(implementazionePdDMittente).equals(CostantiConfigurazione.STATO_CON_WARNING_DISABILITATO) == false){

  560.                     // Redirigo Errori presenti nella Busta
  561.                     boolean validazioneConErrori = (errors.size() > 0);
  562.                     if( protocolManager.isIgnoraEccezioniLivelloNonGrave() || (this.propertiesReader.ignoraEccezioniNonGraviValidazione())){
  563.                         validazioneConErrori = Busta.containsEccezioniGravi(errors);
  564.                     }

  565.                     if(validazioneConErrori){  

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

  567.                         // Registrazione eccezioni riscontrate dalla validazione della busta
  568.                         boolean mittenteRegistrato = true;
  569.                         StringBuilder eccBuffer = new StringBuilder();
  570.                         java.util.List<Eccezione> errorsClone =  new java.util.ArrayList<Eccezione>();
  571.                         for(int k = 0; k < errors.size() ; k++){
  572.                             Eccezione er = errors.get(k);
  573.                             errorsClone.add(er);
  574.                             if(k>0)
  575.                                 eccBuffer.append("\n");
  576.                             eccBuffer.append(er.toString(protocolFactory));
  577.                             if(CodiceErroreCooperazione.isEccezioneMittente(er.getCodiceEccezione())){
  578.                                 mittenteRegistrato = false;
  579.                             }
  580.                         }

  581.                         // Registrazione degli errori effettuata solo in caso la modalita di Validazione
  582.                         // della busta sia "Warning Only" o "active"
  583.                         msgDiag.addKeyword(CostantiPdD.KEY_ECCEZIONI, eccBuffer.toString());
  584.                         msgDiag.addKeyword(CostantiPdD.KEY_NUMERO_ECCEZIONI, errors.size()+"");
  585.                         msgDiag.logPersonalizzato("validazioneBusta.bustaNonCorretta");

  586.                         // Spedizione BustaErrore contenente gli errori riscontrati, solo se
  587.                         // la modalita di validazione della busta e' "active"
  588.                         // e il Mittente e' comunque conosciuto.
  589.                         if( configurazionePdDManager.getTipoValidazione(implementazionePdDMittente).equals(CostantiConfigurazione.STATO_CON_WARNING_ABILITATO) == true) {

  590.                             // bustaOriginale per gestione errore
  591.                             Busta bustaNonValida = bustaRichiesta.newInstance();

  592.                             // Spedisco un Errore ad un mittente conosciuto...
  593.                             ejbUtils.setRollbackRichiestaInCasoErrore(false); // viene effettuato da gestioneErrore
  594.                             if(mittenteRegistrato){
  595.                                 msgDiag.mediumDebug("Invio segnalazione di errore ...");
  596.                                 IntegrationFunctionError integrationFunctionError = validazione_integrationFunctionError;
  597.                                 if(integrationFunctionError==null) {
  598.                                     if( ruoloBustaRicevuta!=null && RuoloBusta.RISPOSTA.equals(ruoloBustaRicevuta.toString()) ){
  599.                                         integrationFunctionError = IntegrationFunctionError.INVALID_INTEROPERABILITY_PROFILE_RESPONSE;
  600.                                     }
  601.                                     else {
  602.                                         integrationFunctionError = IntegrationFunctionError.INVALID_INTEROPERABILITY_PROFILE_REQUEST;
  603.                                     }
  604.                                 }
  605.                                 ejbUtils.setIntegrationFunctionErrorPortaApplicativa(integrationFunctionError);
  606.                                 ejbUtils.sendAsRispostaBustaErroreValidazione(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,errorsClone,
  607.                                         idCorrelazioneApplicativa,null,servizioApplicativoFruitore);
  608.                             }
  609.                             else{
  610.                                 if(sendSbloccoRicezioneBuste){
  611.                                     msgDiag.mediumDebug("Invio messaggio di sblocco a RicezioneBuste...");
  612.                                     // se il mittente non e' conosciuto sblocco solo Ricezione
  613.                                     msgResponse = ejbUtils.sendSbloccoRicezioneBuste(richiestaApplicativa.getIdModuloInAttesa());
  614.                                 }
  615.                             }
  616.                             ejbUtils.setRollbackRichiestaInCasoErrore(true); // viene effettuato da gestioneErrore

  617.                             Eccezione eccezioneDaInviareServizioApplicativo = null;
  618.                             if(errors.size()>1){
  619.                                 eccezioneDaInviareServizioApplicativo =
  620.                                         Eccezione.getEccezioneValidazione(ErroriCooperazione.ERRORE_GENERICO_PROTOCOLLO_NON_CORRETTO.getErroreCooperazione(), protocolFactory);
  621.                                 StringBuilder bfDescrizione = new StringBuilder();
  622.                                 for(int k=0; k<errors.size();k++){
  623.                                     Eccezione error = errors.get(k);
  624.                                     if(error.getDescrizione(protocolFactory)!=null)
  625.                                         bfDescrizione.append("["+traduttore.toString(error.getCodiceEccezione(),error.getSubCodiceEccezione())+"] "+error.getDescrizione(protocolFactory)+"\n");
  626.                                 }
  627.                                 if(bfDescrizione.length()>0)
  628.                                     eccezioneDaInviareServizioApplicativo.setDescrizione(bfDescrizione.toString());
  629.                             }else{
  630.                                 eccezioneDaInviareServizioApplicativo = errors.get(0);
  631.                             }

  632.                             // GESTIONE ERRORE INTERNO
  633.                             msgDiag.mediumDebug("Invio eventuale messaggio di errore al servizio applicativo (gestione errore)...");
  634.                             IntegrationFunctionError integrationFunctionError = validazione_integrationFunctionError;
  635.                             if(integrationFunctionError==null) {
  636.                                 if( ruoloBustaRicevuta!=null && RuoloBusta.RISPOSTA.equals(ruoloBustaRicevuta.toString()) ){
  637.                                     integrationFunctionError = IntegrationFunctionError.INTERNAL_RESPONSE_ERROR;
  638.                                 }
  639.                                 else {
  640.                                     integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  641.                                 }
  642.                             }
  643.                             if(validazione_integrationFunctionError!=null) {
  644.                                 integrationFunctionError = validazione_integrationFunctionError;
  645.                             }
  646.                             gestioneErroreProtocollo(configurazionePdDManager, ejbUtils, profiloCollaborazione, repositoryBuste,
  647.                                     bustaNonValida, identitaPdD, eccezioneDaInviareServizioApplicativo,null,
  648.                                     identitaPdD, null, protocolFactory, protocolManager, pddContext, requestInfo,
  649.                                     integrationFunctionError);

  650.                             // Commit modifiche
  651.                             openspcoopstate.commit();
  652.                            
  653.                             msgDiag.mediumDebug("Rilascio connessione...");
  654.                             openspcoopstate.releaseResource();
  655.                             esito.setEsitoInvocazione(true);
  656.                             esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  657.                                     msgDiag.getMessaggio_replaceKeywords("validazioneBusta.bustaNonCorretta"));
  658.                             return esito;
  659.                         }
  660.                     }
  661.                 }
  662.             }







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










  675.             /* ------  Ricezione riscontri per il NAL (deve essere la prima attivita', poiche' effettua commit JDBC) -------- */
  676.             if(ricezioneRiscontri){
  677.                 if(bustaRichiesta.sizeListaRiscontri() > 0){
  678.                     for(int i=0;i<bustaRichiesta.sizeListaRiscontri();i++){  
  679.                         Riscontro r = bustaRichiesta.getRiscontro(i);
  680.                        
  681.                         msgDiag.addKeyword(CostantiPdD.KEY_ID_BUSTA_RISCONTRATA, r.getID());
  682.                         msgDiag.addKeyword(CostantiPdD.KEY_DATA_RISCONTRO, r.getOraRegistrazione().toString());
  683.                         msgDiag.logPersonalizzato("ricezioneRiscontro");
  684.                         try{
  685.                             GestoreMessaggi msgRiscontrato = new GestoreMessaggi(openspcoopstate,true, r.getID(),Costanti.OUTBOX,msgDiag,pddContext);
  686.                             msgRiscontrato.validateAndDeleteMsgOneWayRiscontrato();
  687.                         }catch(Exception e){
  688.                             msgDiag.logErroreGenerico(e, "msgRiscontrato.validateAndDeleteMsgOneWayRiscontrato("+r.getID()+")");
  689.                         }
  690.                     }
  691.                 }
  692.             }





  693.             /*   -------------- Controllo esistenza soggetto destinatario  ------------------ */
  694.             msgDiag.mediumDebug("Controllo appartenenza Destinazione Busta (controllo esistenza soggetto)...");
  695.             boolean existsSoggetto = false;
  696.             try{
  697.                 existsSoggetto = configurazionePdDManager.existsSoggetto(idServizio.getSoggettoErogatore(), requestInfo);
  698.             }catch(Exception e){
  699.                 if(idServizio!=null && idServizio.getSoggettoErogatore()!=null)
  700.                     msgDiag.logErroreGenerico(e,"existsSoggetto("+idServizio.getSoggettoErogatore().toString()+")");
  701.                 else
  702.                     msgDiag.logErroreGenerico(e,"existsSoggetto()");
  703.                 ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  704.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  705.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),
  706.                         idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  707.                         null);
  708.                 openspcoopstate.releaseResource();
  709.                 esito.setEsitoInvocazione(true);    
  710.                 esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  711.                         "existsSoggetto()");
  712.                 return esito;
  713.             }
  714.             boolean isSoggettoVirtuale = configurazionePdDManager.isSoggettoVirtuale(idServizio.getSoggettoErogatore(), requestInfo);
  715.             if(!existsSoggetto && !isSoggettoVirtuale){
  716.                 msgDiag.logPersonalizzato("soggettoDestinatarioNonGestito");
  717.                 ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  718.                         ErroriIntegrazione.ERRORE_451_SOGGETTO_INESISTENTE.getErroreIntegrazione(),
  719.                         idCorrelazioneApplicativa,servizioApplicativoFruitore,null,
  720.                         null);
  721.                 openspcoopstate.releaseResource();
  722.                 esito.setEsitoInvocazione(true);    
  723.                 esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  724.                         msgDiag.getMessaggio_replaceKeywords("soggettoDestinatarioNonGestito"));
  725.                 return esito;
  726.             }






  727.             /* -------------------
  728.              *  Controllo se la busta porta Dati in caso ad es. di riscontri ... arrivera' una busta senza dati,
  729.                          e senza profilo di collaborazione.  o comunque non devono essere considerati   --------------------- */
  730.             if(bustaDiServizio == true) {

  731.                 msgDiag.logPersonalizzato("ricezioneBustaServizio");

  732.                 // Send Sblocco a RicezioneBuste
  733.                 if(sendSbloccoRicezioneBuste){
  734.                     msgResponse = ejbUtils.sendSbloccoRicezioneBuste(richiestaApplicativa.getIdModuloInAttesa());
  735.                 }
  736.                 ejbUtils.releaseInboxMessage(false);
  737.                 openspcoopstate.releaseResource();
  738.                 esito.setEsitoInvocazione(true);    
  739.                 esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  740.                         msgDiag.getMessaggio_replaceKeywords("ricezioneBustaServizio"));
  741.                 return esito;
  742.             }





  743.             /* ------------
  744.              * Dichiarazione Busta per HTTP Reply, utilizzata SOLO se il profilo e' asincrono  o oneway.
  745.              * Contiene la dichiarazione di eventuali:
  746.              * 1) Riscontri da ritornare
  747.              * 2) Ricevute da ritornare
  748.              * ------------- */
  749.             // Variabile che sara' settata a true se si verifica una situazione in cui nella busta HTTPReply
  750.             // vengono impostati parametri di ritorno (ricevute,riscontri.....)
  751.             boolean returnProtocolReply = false;        
  752.             TipoOraRegistrazione tipoOraRegistrazione = this.propertiesReader.getTipoTempoBusta(implementazionePdDMittente);
  753.             bustaHTTPReply = bustaRichiesta.invertiBusta(tipoOraRegistrazione,protocolFactory.createTraduttore().toString(tipoOraRegistrazione));






  754.            
  755.            
  756.            
  757.            
  758.            
  759.            
  760.            
  761.             /* ------------  Check funzionalita' richieste nel registro dei servizi che combacino con quelle presente nella busta ------------- */
  762.             // Profilo di collaborazione: controllato durante la validazione
  763.             // Filtro duplicati: controllato dal blocco di codice seguente, e casomai forzato
  764.             // Consegna in ordine: se la busta non la possiede, ma e' richiesta viene sollevata una eccezione
  765.             // Conferma ricezione: se la busta non la possiede, ma e' richiesta viene sollevata una eccezione
  766.            
  767.             if( org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(bustaRichiesta.getProfiloDiCollaborazione()) ){
  768.                
  769.                 // ConfermaRicezione check
  770.                 if((this.propertiesReader.isCheckFromRegistroConfermaRicezioneAbilitato(implementazionePdDMittente) && sbustamentoMsg.isConfermaRicezioneRichiestoAccordo() &&
  771.                         (bustaRichiesta.isConfermaRicezione()==false)) && !consegnaAffidabile){
  772.                     msgDiag.logPersonalizzato("funzionalitaRichiestaAccordo.confermaRicezioneNonPresente");
  773.                     Eccezione e = Eccezione.getEccezioneValidazione(ErroriCooperazione.PROFILO_TRASMISSIONE_CONFERMA_RICEZIONE_NON_PRESENTE.getErroreCooperazione(),protocolFactory);
  774.                     ejbUtils.sendAsRispostaBustaErroreValidazione(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,e,
  775.                             idCorrelazioneApplicativa,servizioApplicativoFruitore);
  776.                     openspcoopstate.releaseResource();
  777.                     esito.setEsitoInvocazione(true);
  778.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  779.                             msgDiag.getMessaggio_replaceKeywords("funzionalitaRichiestaAccordo.confermaRicezioneNonPresente"));
  780.                     return esito;
  781.                 }
  782.                
  783.                 if((this.propertiesReader.isCheckFromRegistroConsegnaInOrdineAbilitato(implementazionePdDMittente) && sbustamentoMsg.isConsegnaOrdineRichiestoAccordo()) &&
  784.                         (bustaRichiesta.getSequenza()<0) ){
  785.                     msgDiag.logPersonalizzato("funzionalitaRichiestaAccordo.consegnaInOrdineNonPresente");
  786.                     Eccezione e = Eccezione.getEccezioneValidazione(ErroriCooperazione.CONSEGNA_IN_ORDINE_NON_GESTIBILE.getErroreCooperazione(),protocolFactory);
  787.                     ejbUtils.sendAsRispostaBustaErroreValidazione(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,e,
  788.                             idCorrelazioneApplicativa,servizioApplicativoFruitore);
  789.                     openspcoopstate.releaseResource();
  790.                     esito.setEsitoInvocazione(true);
  791.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  792.                             msgDiag.getMessaggio_replaceKeywords("funzionalitaRichiestaAccordo.consegnaInOrdineNonPresente"));
  793.                     return esito;
  794.                 }
  795.             }
  796.            
  797.            
  798.            
  799.            
  800.            
  801.            
  802.            









  803.             /* ------------  Gestione Duplicati ------------- */
  804.                        
  805.             boolean checkDuplicato = imbustamentoFiltroDuplicatiAbilitato ;        
  806.             if(checkDuplicato){
  807.                                        
  808.                 /*
  809.                  * 1) duplicato in caso di oneWay: se confermaRicezione=true e la gestione dei riscontri e' attiva, re-invio un riscontro
  810.                  * 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
  811.                  * 2) duplicati in caso sincrono: genero un msg Errore
  812.                  * 3) duplicati in caso asincrono: rigenero la ricevuta
  813.                  */
  814.                 try{
  815.                    
  816.                     // Istanzio gestore filtro duplicati
  817.                     IFiltroDuplicati gestoreFiltroDuplicati = getGestoreFiltroDuplicati(this.propertiesReader, this.loader,
  818.                             openspcoopstate, pddContext, historyBuste, repositoryBuste, oneWayVersione11);
  819.                    
  820.                     boolean oldGestioneConnessione = false;
  821.                     boolean rinegozia = false;
  822.                     if(gestoreFiltroDuplicati.releaseRuntimeResourceBeforeCheck() && !openspcoopstate.resourceReleased()) {
  823.                         rinegozia = true;
  824. //                      System.out.println("[RICHIESTA] rilascio!!");
  825.                         msgDiag.mediumDebug("Rilascio connessione al database prima di verificare se la richiesta è duplicata ...");
  826.                         oldGestioneConnessione = ((OpenSPCoopState)openspcoopstate).isUseConnection();
  827.                         ((OpenSPCoopState)openspcoopstate).setUseConnection(true);
  828.                         openspcoopstate.commit();
  829.                         openspcoopstate.releaseResource();
  830. //                      System.out.println("[RICHIESTA] rilasciata: "+
  831. //                              (((org.openspcoop2.pdd.core.state.OpenSPCoopState)openspcoopstate).getConnectionDB()==null || ((OpenSPCoopState)openspcoopstate).getConnectionDB().isClosed()));
  832.                     }
  833.                     boolean initConnectionForDuplicate = false;
  834.                     if(!gestoreFiltroDuplicati.releaseRuntimeResourceBeforeCheck() && openspcoopstate.resourceReleased()) {
  835.                         // il vecchio engine che verifica il filtro duplicati ha bisogno della connessione
  836.                         // inizializzo
  837.                         ((OpenSPCoopState)openspcoopstate).setUseConnection(true);
  838.                         openspcoopstate.initResource(identitaPdD, this.idModulo, idTransazione);
  839.                         historyBuste.updateState(openspcoopstate.getStatoRichiesta());
  840.                         repositoryBuste.updateState(openspcoopstate.getStatoRichiesta());
  841.                         profiloCollaborazione.updateState(openspcoopstate.getStatoRichiesta());
  842.                         ejbUtils.updateOpenSPCoopState(openspcoopstate);
  843.                         initConnectionForDuplicate = true;
  844.                     }
  845.                    
  846.                     boolean bustaDuplicata = gestoreFiltroDuplicati.isDuplicata(protocolFactory, bustaRichiesta.getID());
  847.                                    
  848.                     // BUSTA GIA' PRECEDENTEMENTE RICEVUTA
  849.                     if (bustaDuplicata){
  850.    
  851.                         pddContext.addObject(org.openspcoop2.core.constants.Costanti.RICHIESTA_DUPLICATA, "true");
  852.                        
  853.                         // Aggiorno duplicati
  854.                         msgDiag.logPersonalizzato("ricezioneBustaDuplicata.count");
  855.                         gestoreFiltroDuplicati.incrementaNumeroDuplicati(protocolFactory,bustaRichiesta.getID());
  856.                         msgDiag.logPersonalizzato("ricezioneBustaDuplicata");
  857.                        
  858.                     }else {
  859.    
  860.                         // REGISTRAZIONE BUSTA RICEVUTA NELL'HISTORY
  861.                         gestoreFiltroDuplicati.registraBusta(protocolFactory, bustaRichiesta);
  862.                         msgDiag.logPersonalizzato("ricezioneBusta.registrazionePerFiltroDuplicati");
  863.                        
  864.                     }  
  865.                    
  866.                     if(gestoreFiltroDuplicati.releaseRuntimeResourceBeforeCheck() && rinegozia) {
  867. //                      System.out.println("[RICHIESTA] rinegozio!!");
  868.                         msgDiag.mediumDebug("Rinegozio connessione dopo la verifica di richiesta duplicata ...");
  869.                         try{
  870.                             openspcoopstate.updateResource(idTransazione);
  871.                             ((OpenSPCoopState)openspcoopstate).setUseConnection(oldGestioneConnessione);
  872. //                          // Aggiorno risorse
  873. //                          ejbUtils.updateOpenSPCoopState(openspcoopstate);
  874. //                          msgRequest.updateOpenSPCoopState(openspcoopstate);                          
  875. //                          System.out.println("[RICHIESTA] rinegoziata: "+
  876. //                                  (((org.openspcoop2.pdd.core.state.OpenSPCoopState)openspcoopstate).getConnectionDB()!=null && !((OpenSPCoopState)openspcoopstate).getConnectionDB().isClosed()));
  877.                         }catch(Exception e){
  878.                             throw new Exception("Rinegoziazione connessione dopo la verifica di richiesta duplicata fallita: "+e.getMessage(),e);
  879.                         }
  880.                     }
  881.                     if(!gestoreFiltroDuplicati.releaseRuntimeResourceBeforeCheck() && initConnectionForDuplicate) {
  882.                         openspcoopstate.commit();
  883.                     }
  884.                    
  885.                     if (bustaDuplicata){
  886.    
  887.                         // 1)
  888.                         if( org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(bustaRichiesta.getProfiloDiCollaborazione()) && consegnaAffidabile){
  889.                             //System.out.println("CASO 1");
  890.                             msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_BUSTE,"generazioneRiscontro");
  891.    
  892.                             // Costruisco riscontro da re-inviare
  893.                             Riscontro r = new Riscontro();
  894.                             r.setID(bustaRichiesta.getID());
  895.                             r.setOraRegistrazione(bustaHTTPReply.getOraRegistrazione());
  896.                             r.setTipoOraRegistrazione(this.propertiesReader.getTipoTempoBusta(implementazionePdDMittente));
  897.                             bustaHTTPReply.setTipoServizioRichiedenteBustaDiServizio(bustaRichiesta.getTipoServizio());
  898.                             bustaHTTPReply.setServizioRichiedenteBustaDiServizio(bustaRichiesta.getServizio());
  899.                             bustaHTTPReply.setVersioneServizioRichiedenteBustaDiServizio(bustaRichiesta.getVersioneServizio());
  900.                             bustaHTTPReply.setAzioneRichiedenteBustaDiServizio(bustaRichiesta.getAzione());
  901.                             bustaHTTPReply.addRiscontro(r);
  902.    
  903.                             // Re-invio Riscontro
  904.                             msgResponse = ejbUtils.buildAndSendBustaRisposta(richiestaApplicativa.getIdModuloInAttesa(),bustaHTTPReply,
  905.                                     MessageUtilities.buildEmptyMessage(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),
  906.                                             requestInfo.getProtocolRequestMessageType(),MessageRole.RESPONSE),profiloGestione,
  907.                                             idCorrelazioneApplicativa,servizioApplicativoFruitore);
  908.                         }
  909.                         // 1b)
  910.                         else if( org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(bustaRichiesta.getProfiloDiCollaborazione()) &&
  911.                                 ( (this.propertiesReader.isGestioneRiscontri(implementazionePdDMittente)==false) || (bustaRichiesta.isConfermaRicezione()==false) )  &&
  912.                                 ( protocolManager.isGenerazioneErroreMessaggioOnewayDuplicato() || this.propertiesReader.isGenerazioneErroreProtocolloFiltroDuplicati(implementazionePdDMittente))){
  913.                             //System.out.println("CASO 1b");
  914.                             ejbUtils.setRollbackRichiestaInCasoErrore_rollbackHistory(false); // non devo cancellare l'history
  915.                             ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.CONFLICT);
  916.                             ejbUtils.sendAsRispostaBustaErroreValidazione(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  917.                                     Eccezione.getEccezioneValidazione(ErroriCooperazione.IDENTIFICATIVO_MESSAGGIO_GIA_PROCESSATO.getErroreCooperazione(),protocolFactory),
  918.                                     idCorrelazioneApplicativa,servizioApplicativoFruitore);
  919.                             openspcoopstate.releaseResource();
  920.                             esito.setEsitoInvocazione(true);
  921.                             esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  922.                                     msgDiag.getMessaggio_replaceKeywords("ricezioneBustaDuplicata"));
  923.                             return esito;
  924.                         }
  925.    
  926.                         // 2)
  927.                         else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(bustaRichiesta.getProfiloDiCollaborazione())){
  928.                             //System.out.println("CASO 2");
  929.                             ejbUtils.setRollbackRichiestaInCasoErrore_rollbackHistory(false); // non devo cancellare l'history
  930.                             ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.CONFLICT);
  931.                             ejbUtils.sendAsRispostaBustaErroreValidazione(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  932.                                     Eccezione.getEccezioneValidazione(ErroriCooperazione.IDENTIFICATIVO_MESSAGGIO_GIA_PROCESSATO.getErroreCooperazione(),protocolFactory),
  933.                                     idCorrelazioneApplicativa,servizioApplicativoFruitore);
  934.                             openspcoopstate.releaseResource();
  935.                             esito.setEsitoInvocazione(true);
  936.                             esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  937.                                     msgDiag.getMessaggio_replaceKeywords("ricezioneBustaDuplicata"));
  938.                             return esito;
  939.                         }
  940.    
  941.                         // 3
  942.                         else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(bustaRichiesta.getProfiloDiCollaborazione()) ||
  943.                                 org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(bustaRichiesta.getProfiloDiCollaborazione())){
  944.                             String ricevuta = null;
  945.                             if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(bustaRichiesta.getProfiloDiCollaborazione())){
  946.                                 //System.out.println("CASO 3 Asincrono Simmetrico");
  947.                                 // Asincrono Simmetrico
  948.                        
  949.                                 boolean ricevutaAbilitata = true; // Default SICA
  950.                                 try{
  951.                                     if( RuoloBusta.RISPOSTA.equals(ruoloBustaRicevuta.toString()) ){
  952.                                         msgDiag.mediumDebug("Lettura Porta Delegata ...");
  953.                                         String idAsincronoCorrelazioneRichiesta = bustaRichiesta.getRiferimentoMessaggio();
  954.                                         if(idAsincronoCorrelazioneRichiesta==null){
  955.                                             idAsincronoCorrelazioneRichiesta = bustaRichiesta.getCollaborazione();
  956.                                         }
  957.                                         Integrazione integrazione = repositoryBuste.getInfoIntegrazioneFromOutBox(idAsincronoCorrelazioneRichiesta);
  958.                                         IDPortaDelegata idPD = new IDPortaDelegata();
  959.                                         idPD.setNome(integrazione.getNomePorta());
  960.                                         PortaDelegata pd = configurazionePdDManager.getPortaDelegataSafeMethod(idPD, requestInfo);
  961.                                         ricevutaAbilitata = configurazionePdDManager.ricevutaAsincronaSimmetricaAbilitata(pd);
  962.                                     }else{
  963.                                         msgDiag.mediumDebug("Lettura Porta Applicativa ...");
  964.                                         PortaApplicativa pa = configurazionePdDManager.getPortaApplicativaSafeMethod(richiestaApplicativa.getIdPortaApplicativa(), requestInfo);
  965.                                         ricevutaAbilitata = configurazionePdDManager.ricevutaAsincronaSimmetricaAbilitata(pa);
  966.                                     }
  967.                                 }catch(Exception e){
  968.                                     this.log.error("Errore durante l'identificazione della Porta (Delegata/Applicativa) associata alla busta: "+e.getMessage(),e);
  969.                                 }
  970.                                
  971.                                 if(ricevutaAbilitata==false){
  972.                                     if(bustaRichiesta.getRiferimentoMessaggio()==null)
  973.                                         ricevuta = "ricevuta di una richiesta asincrona simmetrica";
  974.                                     else if( RuoloBusta.RISPOSTA.equals(ruoloBustaRicevuta.toString()) ){
  975.                                         ricevuta = "ricevuta di una risposta asincrona simmetrica";
  976.                                     }
  977.                                 }else{
  978.                                     //System.out.println("CASO 3 Asincrono Simmetrico con ricevuta sincrona");
  979.                                     ejbUtils.setRollbackRichiestaInCasoErrore_rollbackHistory(false); // non devo cancellare l'history
  980.                                     ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.CONFLICT);
  981.                                     ejbUtils.sendAsRispostaBustaErroreValidazione(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  982.                                             Eccezione.getEccezioneValidazione(ErroriCooperazione.IDENTIFICATIVO_MESSAGGIO_GIA_PROCESSATO.getErroreCooperazione(),protocolFactory),
  983.                                             idCorrelazioneApplicativa,servizioApplicativoFruitore);
  984.                                     openspcoopstate.releaseResource();
  985.                                     esito.setEsitoInvocazione(true);
  986.                                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  987.                                             msgDiag.getMessaggio_replaceKeywords("ricezioneBustaDuplicata"));
  988.                                     return esito;
  989.                                 }
  990.    
  991.                             }else{
  992.                                 //System.out.println("CASO 3 Asincrono Asimmetrico");
  993.                                 //  Asincrono Asimmetrico
  994.                                
  995.                                 msgDiag.mediumDebug("Lettura Porta Applicativa ...");
  996.                                 PortaApplicativa pa = configurazionePdDManager.getPortaApplicativaSafeMethod(richiestaApplicativa.getIdPortaApplicativa(), requestInfo);
  997.                                
  998.                                 if(configurazionePdDManager.ricevutaAsincronaAsimmetricaAbilitata(pa)==false){
  999.                                     if(bustaRichiesta.getRiferimentoMessaggio()==null){
  1000.                                         ricevuta = "ricevuta di una richiesta asincrona asimmetrica";
  1001.                                         // ServizioCorrelato da impostare nella ricevuta asincrona
  1002.                                     }else if( RuoloBusta.RISPOSTA.equals(ruoloBustaRicevuta.toString()) ){
  1003.                                         ricevuta = "ricevuta di una risposta asincrona asimmetrica";
  1004.                                     }
  1005.                                 }else{
  1006.                                     //System.out.println("CASO 3 Asincrono Asimmetrico con ricevuta sincrona");
  1007.                                     ejbUtils.setRollbackRichiestaInCasoErrore_rollbackHistory(false); // non devo cancellare l'history
  1008.                                     ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.CONFLICT);
  1009.                                     ejbUtils.sendAsRispostaBustaErroreValidazione(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1010.                                             Eccezione.getEccezioneValidazione(ErroriCooperazione.IDENTIFICATIVO_MESSAGGIO_GIA_PROCESSATO.getErroreCooperazione(),protocolFactory),
  1011.                                             idCorrelazioneApplicativa,servizioApplicativoFruitore);
  1012.                                     openspcoopstate.releaseResource();
  1013.                                     esito.setEsitoInvocazione(true);
  1014.                                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  1015.                                             msgDiag.getMessaggio_replaceKeywords("ricezioneBustaDuplicata"));
  1016.                                     return esito;
  1017.                                 }
  1018.                             }
  1019.    
  1020.                             if(ricevuta!=null){
  1021.                                 //System.out.println("CASO 3 creazione ricevuta");
  1022.                                 msgDiag.addKeyword(CostantiPdD.KEY_TIPO_RICEVUTA_ASINCRONA, ricevuta);
  1023.                                 msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_BUSTE,"generazioneRicevutaAsincrona");
  1024.                                
  1025.                                 // Costruisco ricevuta da re-inviare
  1026.                                 bustaHTTPReply.setVersioneServizio(bustaRichiesta.getVersioneServizio());
  1027.                                 bustaHTTPReply.setServizio(bustaRichiesta.getServizio());
  1028.                                 bustaHTTPReply.setTipoServizio(bustaRichiesta.getTipoServizio());
  1029.                                 bustaHTTPReply.setAzione(bustaRichiesta.getAzione());
  1030.                                 bustaHTTPReply.setProfiloDiCollaborazione(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO);
  1031.                                 bustaHTTPReply.setRiferimentoMessaggio(bustaRichiesta.getID());
  1032.                                 // (per gli asincroni devono sempre essere presenti la collaborazione)
  1033.                                 if( this.propertiesReader.isGestioneElementoCollaborazione(implementazionePdDMittente))
  1034.                                     bustaHTTPReply.setCollaborazione(bustaRichiesta.getCollaborazione());  
  1035.                                 if(!consegnaAffidabile){
  1036.                                     bustaHTTPReply.setConfermaRicezione(false);
  1037.                                 }
  1038.                                 if(imbustamentoFiltroDuplicatiAbilitato){
  1039.                                     bustaHTTPReply.setInoltro(Inoltro.SENZA_DUPLICATI,protocolFactory.createTraduttore().toString(Inoltro.SENZA_DUPLICATI));
  1040.                                 }
  1041.                                 //  Re-invio Ricevuta
  1042.                                 msgResponse = ejbUtils.buildAndSendBustaRisposta(richiestaApplicativa.getIdModuloInAttesa(),bustaHTTPReply,
  1043.                                         MessageUtilities.buildEmptyMessage(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),
  1044.                                                 requestInfo.getProtocolRequestMessageType(),MessageRole.RESPONSE),profiloGestione,
  1045.                                                 idCorrelazioneApplicativa,servizioApplicativoFruitore);
  1046.                             }
  1047.    
  1048.                         }
  1049.    
  1050.                         // 4
  1051.                         else{
  1052.                             //System.out.println("Caso 4");
  1053.                             if( protocolManager.isGenerazioneErroreMessaggioOnewayDuplicato() || this.propertiesReader.isGenerazioneErroreProtocolloFiltroDuplicati(implementazionePdDMittente)){
  1054.                                 //System.out.println("Caso 4, spedizione errore di segnalazione id duplicato");
  1055.                                 ejbUtils.setRollbackRichiestaInCasoErrore_rollbackHistory(false); // non devo cancellare l'history
  1056.                                 ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.CONFLICT);
  1057.                                 ejbUtils.sendAsRispostaBustaErroreValidazione(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1058.                                         Eccezione.getEccezioneValidazione(ErroriCooperazione.IDENTIFICATIVO_MESSAGGIO_GIA_PROCESSATO.getErroreCooperazione(),protocolFactory),
  1059.                                         idCorrelazioneApplicativa,servizioApplicativoFruitore);
  1060.                                 openspcoopstate.releaseResource();
  1061.                                 esito.setEsitoInvocazione(true);
  1062.                                 esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  1063.                                         msgDiag.getMessaggio_replaceKeywords("ricezioneBustaDuplicata"));
  1064.                                 return esito;
  1065.                             }
  1066.    
  1067.                             // Msg di Sblocco per il modulo 'RicezioneBuste'
  1068.                             if(sendSbloccoRicezioneBuste){
  1069.                                 //System.out.println("Caso 4, solo segnalazione errore");
  1070.                                 msgResponse = ejbUtils.sendSbloccoRicezioneBuste(richiestaApplicativa.getIdModuloInAttesa());
  1071.                             }
  1072.    
  1073.                         }
  1074.                         //System.out.println("RELEASE");
  1075.                         // Devo rilasciare il messaggio, senza cancellarlo dalla history.
  1076.                         ejbUtils.releaseInboxMessage(false,true);
  1077.    
  1078.                         // Aggiornamento cache messaggio risposta
  1079.                         if(msgResponse!=null)
  1080.                             msgResponse.addMessaggiIntoCache_readFromTable(Sbustamento.ID_MODULO, "risposta in seguito a busta duplicata");
  1081.    
  1082.                         // Aggiornamento cache proprietario messaggio risposta
  1083.                         if(msgResponse!=null)
  1084.                             msgResponse.addProprietariIntoCache_readFromTable(Sbustamento.ID_MODULO, "risposta in seguito a busta duplicata",idMessageRequest,false);
  1085.    
  1086.                         openspcoopstate.releaseResource();
  1087.                         esito.setEsitoInvocazione(true);  
  1088.                         esito.setStatoInvocazione(EsitoLib.OK,null);
  1089.                         return esito;
  1090.    
  1091.                     }
  1092.                    
  1093.                 }catch(Exception e) {
  1094.                     msgDiag.logErroreGenerico(e, "GestioneHistoryBusteRicevute");
  1095.                     ejbUtils.rollbackMessage("Gestione dell'history delle buste ricevute non riuscita", esito);
  1096.                     openspcoopstate.releaseResource();
  1097.                     esito.setEsitoInvocazione(false);
  1098.                     esito.setStatoInvocazioneErroreNonGestito(e);
  1099.                     return esito;
  1100.                 }
  1101.                
  1102.                 pddContext.removeObject(org.openspcoop2.core.constants.Costanti.OPENSPCOOP_STATE);
  1103.             }
  1104.            
  1105.            








  1106.             /* ------------  Invio Riscontri (solo per profilo OneWay) ------------- */
  1107.             if(consegnaAffidabile){
  1108.                 msgDiag.mediumDebug("Gestione eventuali riscontri da inviare...");
  1109.                 boolean senza_piggy_backing = true;
  1110.                 if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(bustaRichiesta.getProfiloDiCollaborazione()) ) {    
  1111.                     if ( (senza_piggy_backing) && (bustaRichiesta.isConfermaRicezione())){

  1112.                         // Riscontro ad hoc
  1113.                         Riscontro r = new Riscontro();
  1114.                         r.setID(bustaRichiesta.getID());
  1115.                         r.setOraRegistrazione(bustaHTTPReply.getOraRegistrazione());
  1116.                         r.setTipoOraRegistrazione(this.propertiesReader.getTipoTempoBusta(implementazionePdDMittente));
  1117.                         bustaHTTPReply.addRiscontro(r);
  1118.                         bustaHTTPReply.setTipoServizioRichiedenteBustaDiServizio(bustaRichiesta.getTipoServizio());
  1119.                         bustaHTTPReply.setServizioRichiedenteBustaDiServizio(bustaRichiesta.getServizio());
  1120.                         bustaHTTPReply.setAzioneRichiedenteBustaDiServizio(bustaRichiesta.getAzione());

  1121.                         returnProtocolReply = true;
  1122.                     }
  1123.                 }
  1124.             }









  1125.             /* ------------  Collaborazione e Sequenza  ------------- */
  1126.             // check Funzionalita' fornita solo con OneWay
  1127.             // Sequenza: deve essere abilitata la consegna affidabile + la collaborazione e infine la consegna in ordine
  1128.             if( consegnaInOrdine &&
  1129.                     (org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(bustaRichiesta.getProfiloDiCollaborazione())==false)  ){

  1130.                 msgDiag.mediumDebug("Gestione vincoli consegna in ordine...");

  1131.                 msgDiag.logPersonalizzato("consegnaInOrdine.profiloDiversoOneway");
  1132.                 Eccezione e = Eccezione.getEccezioneValidazione(ErroriCooperazione.CONSEGNA_IN_ORDINE_NON_SUPPORTATA.getErroreCooperazione(),protocolFactory);
  1133.                 ejbUtils.sendAsRispostaBustaErroreValidazione(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,e,
  1134.                         idCorrelazioneApplicativa,servizioApplicativoFruitore);
  1135.                 openspcoopstate.releaseResource();
  1136.                 esito.setEsitoInvocazione(true);
  1137.                 esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  1138.                         msgDiag.getMessaggio_replaceKeywords("consegnaInOrdine.profiloDiversoOneway"));
  1139.                 return esito;
  1140.             }








  1141.             /* ------------  Profilo di Collaborazione  ------------- */
  1142.             String scenarioCooperazione = null;
  1143.             boolean generazioneMsgOK = false;
  1144.             boolean existsPA = true;
  1145.             PortaApplicativa pa = null;
  1146.             ServizioApplicativo sa = null;
  1147.             Integrazione integrazioneAsincrona = null;
  1148.             if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ONEWAY.equals(bustaRichiesta.getProfiloDiCollaborazione())) {

  1149.                 msgDiag.mediumDebug("Gestione profilo di collaborazione OneWay...");

  1150.                 scenarioCooperazione = Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO;

  1151.                 //  check esistenza porta applicativa
  1152.                 msgDiag.mediumDebug("Gestione profilo di collaborazione OneWay (existsPA)...");
  1153.                 try{
  1154.                     existsPA=configurazionePdDManager.existsPA(richiestaApplicativa, requestInfo);
  1155.                 }catch(Exception e){
  1156.                     msgDiag.logErroreGenerico(e, "existsPA(richiestaApplicativa,oneway)");
  1157.                     ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1158.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1159.                                 get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),
  1160.                             idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1161.                             null);
  1162.                     openspcoopstate.releaseResource();
  1163.                     esito.setEsitoInvocazione(true);
  1164.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"existsPA(richiestaApplicativa,oneway)");
  1165.                     return esito;
  1166.                 }
  1167.                 if(!existsPA){
  1168.                     String nomePA = "";
  1169.                     if(richiestaApplicativa.getIdPortaApplicativa()!=null && richiestaApplicativa.getIdPortaApplicativa().getNome()!=null){
  1170.                         nomePA = " ["+richiestaApplicativa.getIdPortaApplicativa().getNome()+"]";
  1171.                     }
  1172.                     msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, "Porta Applicativa"+nomePA+" non esistente");
  1173.                     msgDiag.logPersonalizzato("portaApplicativaNonEsistente");
  1174.                     ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.API_IN_UNKNOWN);
  1175.                     ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1176.                             ErroriIntegrazione.ERRORE_450_PA_INESISTENTE.getErroreIntegrazione(),
  1177.                             idCorrelazioneApplicativa,servizioApplicativoFruitore,null,
  1178.                             null);
  1179.                     openspcoopstate.releaseResource();
  1180.                     esito.setEsitoInvocazione(true);
  1181.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  1182.                             msgDiag.getMessaggio_replaceKeywords("portaApplicativaNonEsistente"));
  1183.                     return esito;
  1184.                 }
  1185.                
  1186.                 // Lettura Porta Applicativa
  1187.                 msgDiag.mediumDebug("Lettura Porta Applicativa ...");
  1188.                 pa = configurazionePdDManager.getPortaApplicativaSafeMethod(richiestaApplicativa.getIdPortaApplicativa(), requestInfo);
  1189.                
  1190.                 // Soggetto Virtuale
  1191.                 boolean soggettoVirtuale = false;
  1192.                 try{
  1193.                     if(richiestaApplicativa.getDominio()!=null) {
  1194.                         soggettoVirtuale = configurazionePdDManager.isSoggettoVirtuale( richiestaApplicativa.getDominio(), requestInfo );
  1195.                     }
  1196.                 }catch(Exception e){
  1197.                     msgDiag.logErroreGenerico(e, "isSoggettoVirtuale(richiestaApplicativa,oneway)");
  1198.                     ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1199.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1200.                                 get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),
  1201.                             idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1202.                             null);
  1203.                     openspcoopstate.releaseResource();
  1204.                     esito.setEsitoInvocazione(true);
  1205.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"isSoggettoVirtuale(richiestaApplicativa,oneway)");
  1206.                     return esito;
  1207.                 }
  1208.                
  1209.                 // Modalita di trasmissione sincrona/asincrona
  1210.                 if(!soggettoVirtuale) {
  1211.                     if(configurazionePdDManager.isModalitaStateless(pa, bustaRichiesta.getProfiloDiCollaborazione())==false){
  1212.                         generazioneMsgOK = true;
  1213.                     }else{
  1214.                         generazioneMsgOK = false;
  1215.                     }
  1216.                 }
  1217.                 else {
  1218.                     generazioneMsgOK = true;
  1219.                 }

  1220.             }else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(bustaRichiesta.getProfiloDiCollaborazione())) {

  1221.                 msgDiag.mediumDebug("Gestione profilo di collaborazione Sincrono...");

  1222.                 if(bustaRichiesta.getRiferimentoMessaggio()!=null &&
  1223.                         (ruoloBustaRicevuta==null || !ruoloBustaRicevuta.equals(RuoloBusta.RICHIESTA))
  1224.                         ){
  1225.                     msgDiag.logPersonalizzato("ricezioneRispostaSincrona");
  1226.                     ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1227.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1228.                                 get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),
  1229.                             idCorrelazioneApplicativa,servizioApplicativoFruitore,null,
  1230.                             null);
  1231.                     openspcoopstate.releaseResource();
  1232.                     esito.setEsitoInvocazione(true);
  1233.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  1234.                             msgDiag.getMessaggio_replaceKeywords("ricezioneRispostaSincrona"));
  1235.                     return esito;
  1236.                 }

  1237.                 scenarioCooperazione = Costanti.SCENARIO_SINCRONO_INVOCAZIONE_SERVIZIO;

  1238.                 //  check esistenza porta applicativa
  1239.                 msgDiag.mediumDebug("Gestione profilo di collaborazione Sincrono (existsPA)...");
  1240.                 try{
  1241.                     existsPA=configurazionePdDManager.existsPA(richiestaApplicativa, requestInfo);
  1242.                 }catch(Exception e){
  1243.                     msgDiag.logErroreGenerico(e, "existsPA(richiestaApplicativa,sincrono)");
  1244.                     ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1245.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1246.                                 get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),
  1247.                             idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1248.                             null);
  1249.                     openspcoopstate.releaseResource();
  1250.                     esito.setEsitoInvocazione(true);
  1251.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"existsPA(richiestaApplicativa,sincrono)");
  1252.                     return esito;
  1253.                 }
  1254.                 if(!existsPA){
  1255.                     String nomePA = "";
  1256.                     if(richiestaApplicativa.getIdPortaApplicativa()!=null && richiestaApplicativa.getIdPortaApplicativa().getNome()!=null){
  1257.                         nomePA = " ["+richiestaApplicativa.getIdPortaApplicativa().getNome()+"]";
  1258.                     }
  1259.                     msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, "Porta Applicativa"+nomePA+" non esistente");
  1260.                     msgDiag.logPersonalizzato("portaApplicativaNonEsistente");
  1261.                     ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.API_IN_UNKNOWN);
  1262.                     ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1263.                             ErroriIntegrazione.ERRORE_450_PA_INESISTENTE.getErroreIntegrazione(),
  1264.                             idCorrelazioneApplicativa,servizioApplicativoFruitore,null,
  1265.                             null);
  1266.                     openspcoopstate.releaseResource();
  1267.                     esito.setEsitoInvocazione(true);
  1268.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  1269.                             msgDiag.getMessaggio_replaceKeywords("portaApplicativaNonEsistente"));
  1270.                     return esito;
  1271.                 }

  1272.                 // Lettura Porta Applicativa
  1273.                 msgDiag.mediumDebug("Lettura Porta Applicativa ...");
  1274.                 pa = configurazionePdDManager.getPortaApplicativaSafeMethod(richiestaApplicativa.getIdPortaApplicativa(), requestInfo);
  1275.                
  1276.                 msgDiag.mediumDebug("Gestione profilo di collaborazione Sincrono (registra busta ricevuta)...");
  1277.                 try{
  1278.                     profiloCollaborazione.registraBustaRicevuta(bustaRichiesta.getID());
  1279.                 }catch(Exception e){
  1280.                     msgDiag.logErroreGenerico(e, "profiloCollaborazione.registraBustaRicevuta("+bustaRichiesta.getID()+")");
  1281.                     ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1282.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1283.                                 get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),
  1284.                             idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1285.                             null);
  1286.                     openspcoopstate.releaseResource();
  1287.                     esito.setEsitoInvocazione(true);
  1288.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"profiloCollaborazione.registraBustaRicevuta("+bustaRichiesta.getID()+")");
  1289.                     return esito;
  1290.                 }

  1291.             }else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(bustaRichiesta.getProfiloDiCollaborazione())) {

  1292.                 if(openspcoopstate.resourceReleased()) {
  1293.                     // il vecchio engine che verifica il filtro duplicati ha bisogno della connessione
  1294.                     // inizializzo
  1295.                     ((OpenSPCoopState)openspcoopstate).setUseConnection(true);
  1296.                     openspcoopstate.initResource(identitaPdD, this.idModulo, idTransazione);
  1297.                     profiloCollaborazione.updateState(openspcoopstate.getStatoRichiesta());
  1298.                     repositoryBuste.updateState(openspcoopstate.getStatoRichiesta());
  1299.                 }
  1300.                
  1301.                 // Richiesta Asincrona
  1302.                 if(RuoloBusta.RICHIESTA.equals(ruoloBustaRicevuta.toString())){

  1303.                     msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoSimmetrico richiesta...");

  1304.                     scenarioCooperazione = Costanti.SCENARIO_ASINCRONO_SIMMETRICO_INVOCAZIONE_SERVIZIO;

  1305.                     //  check esistenza porta applicativa
  1306.                     msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoSimmetrico richiesta (existsPA)...");
  1307.                     try{
  1308.                         existsPA=configurazionePdDManager.existsPA(richiestaApplicativa, requestInfo);
  1309.                     }catch(Exception e){
  1310.                         msgDiag.logErroreGenerico(e, "existsPA(richiestaApplicativa,asincronoSimmetricoRichiesta)");
  1311.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1312.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1313.                                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),
  1314.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1315.                                 null);
  1316.                         openspcoopstate.releaseResource();
  1317.                         esito.setEsitoInvocazione(true);
  1318.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"existsPA(richiestaApplicativa,asincronoSimmetricoRichiesta)");
  1319.                         return esito;
  1320.                     }
  1321.                     if(!existsPA){
  1322.                         String nomePA = "";
  1323.                         if(richiestaApplicativa.getIdPortaApplicativa()!=null && richiestaApplicativa.getIdPortaApplicativa().getNome()!=null){
  1324.                             nomePA = " ["+richiestaApplicativa.getIdPortaApplicativa().getNome()+"]";
  1325.                         }
  1326.                         msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, "Porta Applicativa"+nomePA+" non esistente");
  1327.                         msgDiag.logPersonalizzato("portaApplicativaNonEsistente");
  1328.                         ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.API_IN_UNKNOWN);
  1329.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1330.                                 ErroriIntegrazione.ERRORE_450_PA_INESISTENTE.getErroreIntegrazione(),
  1331.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,null,
  1332.                                 null);
  1333.                         openspcoopstate.releaseResource();
  1334.                         esito.setEsitoInvocazione(true);
  1335.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  1336.                                 msgDiag.getMessaggio_replaceKeywords("portaApplicativaNonEsistente"));
  1337.                         return esito;
  1338.                     }

  1339.                    
  1340.                     // Lettura Porta Applicativa
  1341.                     msgDiag.mediumDebug("Lettura Porta Applicativa ...");
  1342.                     pa = configurazionePdDManager.getPortaApplicativaSafeMethod(richiestaApplicativa.getIdPortaApplicativa(), requestInfo);
  1343.                    
  1344.                    
  1345.                     //  gestione ricevute asincrone
  1346.                     msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoSimmetrico richiesta (controllo ricevuta abilitata)...");
  1347.                     try{
  1348.                         richiestaApplicativa.setRicevutaAsincrona(configurazionePdDManager.ricevutaAsincronaSimmetricaAbilitata(pa));
  1349.                     }catch(Exception e){
  1350.                         msgDiag.logErroreGenerico(e, "ricevutaAsincronaSimmetricaAbilitata(pa)");
  1351.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1352.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1353.                                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),
  1354.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1355.                                 null);
  1356.                         openspcoopstate.releaseResource();
  1357.                         esito.setEsitoInvocazione(true);
  1358.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"ricevutaAsincronaSimmetricaAbilitata(pa)");
  1359.                         return esito;
  1360.                     }

  1361.                     //  deve essere generato un msg OK se non e' abilitata la funzionalita' di ricevuta asincrona
  1362.                     // Modalita di trasmissione stateless/stateful
  1363.                     if(configurazionePdDManager.isModalitaStateless(pa,bustaRichiesta.getProfiloDiCollaborazione())==false){
  1364.                         generazioneMsgOK = !richiestaApplicativa.isRicevutaAsincrona();
  1365.                     }
  1366.                     else{
  1367.                         generazioneMsgOK = false;
  1368.                     }

  1369.                     // registrazione
  1370.                     msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoSimmetrico richiesta (registrazione busta ricevuta)...");
  1371.                     try{
  1372.                         String tipoServizioCorrelato = null;
  1373.                         String servizioCorrelato = null;
  1374.                         Integer versioneServizioCorrelato = null;
  1375.                         if(bustaRichiesta.getTipoServizioCorrelato()!=null &&
  1376.                                 bustaRichiesta.getServizioCorrelato() != null){
  1377.                             tipoServizioCorrelato = bustaRichiesta.getTipoServizioCorrelato();
  1378.                             servizioCorrelato = bustaRichiesta.getServizioCorrelato();
  1379.                             if(bustaRichiesta.getVersioneServizioCorrelato()!=null && bustaRichiesta.getVersioneServizioCorrelato().intValue()>0) {
  1380.                                 versioneServizioCorrelato = bustaRichiesta.getVersioneServizioCorrelato();
  1381.                             }
  1382.                             else {
  1383.                                 versioneServizioCorrelato = 1;
  1384.                             }
  1385.                         }else{
  1386.                             RisultatoValidazione validazione = registroServiziManager.validaServizio(idSoggettoFruitore,idServizio,null);
  1387.                             if( (validazione==null) || (validazione.getServizioRegistrato()==false))
  1388.                                 throw new Exception("Servizio ["+idServizio.toString()+"] non esiste nel registro dei servizi");
  1389.                             if( (validazione.getServizioCorrelato()==null) || (validazione.getTipoServizioCorrelato()==null) || (validazione.getVersioneServizioCorrelato()==null) )
  1390.                                 throw new Exception("Servizio ["+idServizio.toString()+"] non possiede un servizio correlato associato");
  1391.                             tipoServizioCorrelato = validazione.getTipoServizioCorrelato();
  1392.                             servizioCorrelato = validazione.getServizioCorrelato();
  1393.                             versioneServizioCorrelato = validazione.getVersioneServizioCorrelato();
  1394.                         }

  1395.                         String collaborazione = null;
  1396.                         // (per gli asincroni devono sempre essere presenti)
  1397.                         if(this.propertiesReader.isGestioneElementoCollaborazione(implementazionePdDMittente))
  1398.                             collaborazione = bustaRichiesta.getCollaborazione();
  1399.                         profiloCollaborazione.asincronoSimmetrico_registraRichiestaRicevuta(bustaRichiesta.getID(),collaborazione,
  1400.                                 tipoServizioCorrelato,servizioCorrelato,versioneServizioCorrelato,richiestaApplicativa.isRicevutaAsincrona(),
  1401.                                 this.propertiesReader.getRepositoryIntervalloScadenzaMessaggi());
  1402.                     }catch(Exception e){
  1403.                         msgDiag.logErroreGenerico(e, "SalvataggioInformazioniProfiloAsincronoSimmetrico");
  1404.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1405.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1406.                                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),
  1407.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1408.                                 null);
  1409.                         openspcoopstate.releaseResource();
  1410.                         esito.setEsitoInvocazione(true);
  1411.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"SalvataggioInformazioniProfiloAsincronoSimmetrico");
  1412.                         return esito;
  1413.                     }

  1414.                     // RicevutaAsincrona immediata
  1415.                     if(generazioneMsgOK){
  1416.                         returnProtocolReply = true;
  1417.                         bustaHTTPReply.setServizio(bustaRichiesta.getServizio());
  1418.                         bustaHTTPReply.setTipoServizio(bustaRichiesta.getTipoServizio());
  1419.                         bustaHTTPReply.setAzione(bustaRichiesta.getAzione());
  1420.                         bustaHTTPReply.setProfiloDiCollaborazione(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO);
  1421.                         bustaHTTPReply.setRiferimentoMessaggio(bustaRichiesta.getID());
  1422.                         // (per gli asincroni devono sempre essere presenti)
  1423.                         if(this.propertiesReader.isGestioneElementoCollaborazione(implementazionePdDMittente))
  1424.                             bustaHTTPReply.setCollaborazione(bustaRichiesta.getCollaborazione());
  1425.                         if(!consegnaAffidabile){
  1426.                             bustaHTTPReply.setConfermaRicezione(false);
  1427.                         }
  1428.                         if(imbustamentoFiltroDuplicatiAbilitato){
  1429.                             bustaHTTPReply.setInoltro(Inoltro.SENZA_DUPLICATI,protocolFactory.createTraduttore().toString(Inoltro.SENZA_DUPLICATI));
  1430.                         }
  1431.                     }
  1432.                 }else{

  1433.                     // Risposta Asincrona
  1434.                     if(RuoloBusta.RISPOSTA.equals(ruoloBustaRicevuta.toString())){

  1435.                         msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoSimmetrico risposta...");
  1436.                         scenarioCooperazione = Costanti.SCENARIO_ASINCRONO_SIMMETRICO_CONSEGNA_RISPOSTA;

  1437.                     }
  1438.                     //  Ricevuta alla richiesta.
  1439.                     else if(RuoloBusta.RICEVUTA_RICHIESTA.equals(ruoloBustaRicevuta.toString())){

  1440.                         msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoSimmetrico ricevuta richiesta asincrona...");
  1441.                         ricevutaAsincrona = "ricevuta di una richiesta asincrona simmetrica";

  1442.                     }
  1443.                     //  Ricevuta alla risposta.
  1444.                     else if(RuoloBusta.RICEVUTA_RISPOSTA.equals(ruoloBustaRicevuta.toString())){

  1445.                         msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoSimmetrico ricevuta risposta asincrona ...");
  1446.                         ricevutaAsincrona = "ricevuta di una risposta asincrona simmetrica";

  1447.                     }
  1448.                     else{

  1449.                         msgDiag.logPersonalizzato("profiloAsincrono.flussoRicevutaRichiestaRispostaNonCorretto");
  1450.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1451.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1452.                                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),
  1453.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,null,
  1454.                                 null);
  1455.                         openspcoopstate.releaseResource();
  1456.                         esito.setEsitoInvocazione(true);
  1457.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  1458.                                 msgDiag.getMessaggio_replaceKeywords("profiloAsincrono.flussoRicevutaRichiestaRispostaNonCorretto"));
  1459.                         return esito;

  1460.                     }

  1461.                     //  Raccolgo dati consegna per Risposta o Ricevute
  1462.                     msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoSimmetrico risposta (raccolta dati per consegna risposta)...");
  1463.                     try{
  1464.                         if(ricevutaAsincrona==null){
  1465.                             integrazioneAsincrona = profiloCollaborazione.asincronoSimmetrico_getDatiConsegnaRisposta(protocolManager.getIdCorrelazioneAsincrona(bustaRichiesta));
  1466.                         }else{
  1467.                             integrazioneAsincrona = profiloCollaborazione.asincronoSimmetrico_getDatiConsegnaRicevuta(bustaRichiesta.getRiferimentoMessaggio());
  1468.                         }
  1469.                     }catch(Exception e){
  1470.                         msgDiag.logErroreGenerico(e, "RaccoltaDatiIntegrazioneProfiloAsincronoSimmetrico");
  1471.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1472.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1473.                                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),
  1474.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1475.                                 null);
  1476.                         openspcoopstate.releaseResource();
  1477.                         esito.setEsitoInvocazione(true);
  1478.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"RaccoltaDatiIntegrazioneProfiloAsincronoSimmetrico");
  1479.                         return esito;
  1480.                     }

  1481.                 }  

  1482.             } else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(bustaRichiesta.getProfiloDiCollaborazione())) {  
  1483.                
  1484.                 if(openspcoopstate.resourceReleased()) {
  1485.                     // il vecchio engine che verifica il filtro duplicati ha bisogno della connessione
  1486.                     // inizializzo
  1487.                     ((OpenSPCoopState)openspcoopstate).setUseConnection(true);
  1488.                     openspcoopstate.initResource(identitaPdD, this.idModulo, idTransazione);
  1489.                     profiloCollaborazione.updateState(openspcoopstate.getStatoRichiesta());
  1490.                     repositoryBuste.updateState(openspcoopstate.getStatoRichiesta());
  1491.                 }
  1492.                
  1493.                 //  Richiesta Asincrona
  1494.                 if(RuoloBusta.RICHIESTA.equals(ruoloBustaRicevuta.toString())){
  1495.                     msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoAsimmetrico richiesta...");

  1496.                     scenarioCooperazione = Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_INVOCAZIONE_SERVIZIO;

  1497.                     //  check esistenza porta applicativa
  1498.                     msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoAsimmetrico richiesta (existsPA)...");
  1499.                     try{
  1500.                         existsPA=configurazionePdDManager.existsPA(richiestaApplicativa, requestInfo);
  1501.                     }catch(Exception e){
  1502.                         msgDiag.logErroreGenerico(e, "existsPA(richiestaApplicativa,asincronoAsimmetricoRichiesta)");
  1503.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1504.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1505.                                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),
  1506.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1507.                                 null);
  1508.                         openspcoopstate.releaseResource();
  1509.                         esito.setEsitoInvocazione(true);
  1510.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"existsPA(richiestaApplicativa,asincronoAsimmetricoRichiesta)");
  1511.                         return esito;
  1512.                     }
  1513.                     if(!existsPA){
  1514.                         String nomePA = "";
  1515.                         if(richiestaApplicativa.getIdPortaApplicativa()!=null && richiestaApplicativa.getIdPortaApplicativa().getNome()!=null){
  1516.                             nomePA = " ["+richiestaApplicativa.getIdPortaApplicativa().getNome()+"]";
  1517.                         }
  1518.                         msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, "Porta Applicativa"+nomePA+" non esistente");
  1519.                         msgDiag.logPersonalizzato_prefix("(Richiesta) ", "portaApplicativaNonEsistente");
  1520.                         ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.API_IN_UNKNOWN);
  1521.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1522.                                 ErroriIntegrazione.ERRORE_450_PA_INESISTENTE.getErroreIntegrazione(),
  1523.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,null,
  1524.                                 null);
  1525.                         openspcoopstate.releaseResource();
  1526.                         esito.setEsitoInvocazione(true);
  1527.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  1528.                                 "(Richiesta) "+msgDiag.getMessaggio_replaceKeywords("portaApplicativaNonEsistente"));
  1529.                         return esito;
  1530.                     }

  1531.                     // Lettura Porta Applicativa
  1532.                     msgDiag.mediumDebug("Lettura Porta Applicativa ...");
  1533.                     pa = configurazionePdDManager.getPortaApplicativaSafeMethod(richiestaApplicativa.getIdPortaApplicativa(), requestInfo);
  1534.                    
  1535.                     // assegnamento servizioApplicativo
  1536.                     msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoAsimmetrico richiesta (lettura servizio applicativo)...");
  1537.                     String [] servizioApplicativo = null;
  1538.                     try{
  1539.                         servizioApplicativo = configurazionePdDManager.getServiziApplicativi(pa);
  1540.                         if(servizioApplicativo==null)
  1541.                             throw new Exception("Servizio applicativo non esistente");
  1542.                         if(servizioApplicativo.length>1)
  1543.                             throw new Exception("profilo non utilizzabile con una porta applicativa a cui sono stati associati piu' servizi applicativi");
  1544.                         if(servizioApplicativo.length<=0)
  1545.                             throw new Exception("Non sono stati associati servizi applicativi alla porta applicativa");
  1546.                     }
  1547.                     catch(Exception e){
  1548.                         msgDiag.logErroreGenerico(e, "LetturaServizioApplicatiProfiloAsincronoAsimmetrico");
  1549.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1550.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1551.                                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),
  1552.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1553.                                 null);
  1554.                         openspcoopstate.releaseResource();
  1555.                         esito.setEsitoInvocazione(true);  
  1556.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"LetturaServizioApplicatiProfiloAsincronoAsimmetrico");
  1557.                         return esito;
  1558.                     }
  1559.                     richiestaApplicativa.setServizioApplicativo(servizioApplicativo[0]);


  1560.                     //  Lettura Servizio Applicativo
  1561.                     msgDiag.mediumDebug("Lettura Servizio Applicativo ...");
  1562.                     try{
  1563.                         IDServizioApplicativo idSA = new IDServizioApplicativo();
  1564.                         idSA.setNome(servizioApplicativo[0]);
  1565.                         idSA.setIdSoggettoProprietario(richiestaApplicativa.getIDServizio().getSoggettoErogatore());
  1566.                         sa = configurazionePdDManager.getServizioApplicativo(idSA, requestInfo );
  1567.                     }catch(DriverConfigurazioneNotFound e){
  1568.                         msgDiag.logErroreGenerico("Servizio applicativo ["+servizioApplicativo[0]+"] non esistente", "getServizioApplicativoProfiloAsincronoAsimmetrico");
  1569.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1570.                                 ErroriIntegrazione.ERRORE_453_SA_INESISTENTE.getErroreIntegrazione(),
  1571.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1572.                                 null);
  1573.                         openspcoopstate.releaseResource();
  1574.                         esito.setEsitoInvocazione(true);
  1575.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"Servizio applicativo ["+servizioApplicativo[0]+"] non esistente");
  1576.                         return esito;
  1577.                     }
  1578.                     catch(Exception e){
  1579.                         msgDiag.logErroreGenerico(e, "getServizioApplicativoProfiloAsincronoAsimmetrico");
  1580.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1581.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1582.                                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),
  1583.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1584.                                 null);
  1585.                         openspcoopstate.releaseResource();
  1586.                         esito.setEsitoInvocazione(true);
  1587.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"getServizioApplicativoProfiloAsincronoAsimmetrico");
  1588.                         return esito;
  1589.                     }
  1590.                    
  1591.                    
  1592.                     // check esistenza ConsegnaRispostaAsincrona
  1593.                     msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoAsimmetrico richiesta (exists ConsegnaRispostAsincrona)...");
  1594.                     boolean existsConsegnaRispostaAsincrona = false;
  1595.                     msgDiag.addKeyword(CostantiPdD.KEY_SA_EROGATORE, sa.getNome());
  1596.                     try{
  1597.                         existsConsegnaRispostaAsincrona = configurazionePdDManager.existsConsegnaRispostaAsincrona(sa);
  1598.                     }catch(Exception e){
  1599.                         msgDiag.logErroreGenerico(e, "existsConsegnaRispostaAsincrona_ProfiloAsincronoAsimmetrico");
  1600.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1601.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),
  1602.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1603.                                 null);
  1604.                         openspcoopstate.releaseResource();
  1605.                         esito.setEsitoInvocazione(true);
  1606.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"existsConsegnaRispostaAsincrona_ProfiloAsincronoAsimmetrico");
  1607.                         return esito;
  1608.                     }
  1609.                     if (existsConsegnaRispostaAsincrona == false){
  1610.                         msgDiag.logPersonalizzato("profiloAsincronoAsimmetrico.saSenzaRispostaAsincrona");
  1611.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1612.                                 ErroriIntegrazione.ERRORE_411_RICEZIONE_CONTENUTI_ASINCRONA_RICHIESTA.getErroreIntegrazione(),
  1613.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,null,
  1614.                                 null);
  1615.                         openspcoopstate.releaseResource();
  1616.                         esito.setEsitoInvocazione(true);
  1617.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  1618.                                 msgDiag.getMessaggio_replaceKeywords("profiloAsincronoAsimmetrico.saSenzaRispostaAsincrona"));
  1619.                         return esito;
  1620.                     }

  1621.                     // check esistenza ServizioCorrelato associato al Servizio
  1622.                     msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoAsimmetrico richiesta (servizio correlato)...");
  1623.                     if(sbustamentoMsg.getServizioCorrelato()==null || sbustamentoMsg.getTipoServizioCorrelato()==null){
  1624.                         msgDiag.logPersonalizzato("profiloAsincronoAsimmetrico.servizioCorrelatoNonEsistente");
  1625.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1626.                                 ErroriIntegrazione.ERRORE_408_SERVIZIO_CORRELATO_NON_TROVATO.getErroreIntegrazione(),
  1627.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,null,
  1628.                                 null);
  1629.                         openspcoopstate.releaseResource();
  1630.                         esito.setEsitoInvocazione(true);
  1631.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  1632.                                 msgDiag.getMessaggio_replaceKeywords("profiloAsincronoAsimmetrico.servizioCorrelatoNonEsistente"));
  1633.                         return esito;
  1634.                     }

  1635.                     //  gestione ricevute asincrone
  1636.                     msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoAsimmetrico richiesta (ricevuta abilitata)...");
  1637.                     try{
  1638.                         richiestaApplicativa.setRicevutaAsincrona(configurazionePdDManager.ricevutaAsincronaAsimmetricaAbilitata(pa));
  1639.                     }catch(Exception e){
  1640.                         msgDiag.logErroreGenerico(e, "ricevutaAsincronaAsimmetricaAbilitata(pa)");
  1641.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1642.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),
  1643.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1644.                                 null);
  1645.                         openspcoopstate.releaseResource();
  1646.                         esito.setEsitoInvocazione(true);
  1647.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"ricevutaAsincronaAsimmetricaAbilitata(pa)");
  1648.                         return esito;
  1649.                     }

  1650.                     // deve essere generato un msg OK se non e' abilitata la funzionalita' di ricevuta asincrona
  1651.                     // Modalita di trasmissione stateless/stateful
  1652.                     if(configurazionePdDManager.isModalitaStateless(pa, bustaRichiesta.getProfiloDiCollaborazione())==false){
  1653.                         generazioneMsgOK = !richiestaApplicativa.isRicevutaAsincrona();
  1654.                     }
  1655.                     else{
  1656.                         generazioneMsgOK = false;
  1657.                     }

  1658.                     // registrazione
  1659.                     msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoAsimmetrico richiesta (registrazione busta ricevuta)...");
  1660.                     try{
  1661.                         String collaborazione = null;
  1662.                         // (per gli asincroni devono sempre essere presenti)
  1663.                         if(this.propertiesReader.isGestioneElementoCollaborazione(implementazionePdDMittente))
  1664.                             collaborazione = bustaRichiesta.getCollaborazione();
  1665.                         profiloCollaborazione.asincronoAsimmetrico_registraRichiestaRicevuta(bustaRichiesta.getID(),collaborazione,
  1666.                                 sbustamentoMsg.getTipoServizioCorrelato(),sbustamentoMsg.getServizioCorrelato(),sbustamentoMsg.getVersioneServizioCorrelato(),
  1667.                                 richiestaApplicativa.isRicevutaAsincrona(),
  1668.                                 this.propertiesReader.getRepositoryIntervalloScadenzaMessaggi());
  1669.                     }catch(Exception e){
  1670.                         msgDiag.logErroreGenerico(e, "SalvataggioInformazioniProfiloAsincronoAsimmetrico");
  1671.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1672.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1673.                                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),
  1674.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1675.                                 null);
  1676.                         openspcoopstate.releaseResource();
  1677.                         esito.setEsitoInvocazione(true);
  1678.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"SalvataggioInformazioniProfiloAsincronoAsimmetrico");
  1679.                         return esito;
  1680.                     }

  1681.                     // RicevutaAsincrona immediata
  1682.                     if(generazioneMsgOK){
  1683.                         returnProtocolReply = true;
  1684.                         bustaHTTPReply.setServizio(bustaRichiesta.getServizio());
  1685.                         bustaHTTPReply.setTipoServizio(bustaRichiesta.getTipoServizio());

  1686.                         // PRODUZIONE tipo e nome Servizio Correlato
  1687.                         if( protocolManager.isGenerazioneInformazioniServizioCorrelatoAsincronoAsimmetrico() &&
  1688.                                 this.propertiesReader.isGenerazioneAttributiAsincroni(implementazionePdDMittente)){
  1689.                             bustaHTTPReply.setServizioCorrelato(sbustamentoMsg.getServizioCorrelato());
  1690.                             bustaHTTPReply.setTipoServizioCorrelato(sbustamentoMsg.getTipoServizioCorrelato());
  1691.                         }

  1692.                         bustaHTTPReply.setAzione(bustaRichiesta.getAzione());
  1693.                         bustaHTTPReply.setProfiloDiCollaborazione(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO);
  1694.                         bustaHTTPReply.setRiferimentoMessaggio(bustaRichiesta.getID());

  1695.                         // (per gli asincroni devono sempre essere presenti)
  1696.                         if(this.propertiesReader.isGestioneElementoCollaborazione(implementazionePdDMittente))
  1697.                             bustaHTTPReply.setCollaborazione(bustaRichiesta.getCollaborazione());

  1698.                         if(!consegnaAffidabile){
  1699.                             bustaHTTPReply.setConfermaRicezione(false);
  1700.                         }
  1701.                         if(imbustamentoFiltroDuplicatiAbilitato){
  1702.                             bustaHTTPReply.setInoltro(Inoltro.SENZA_DUPLICATI,protocolFactory.createTraduttore().toString(Inoltro.SENZA_DUPLICATI));    
  1703.                         }
  1704.                     }
  1705.                 }else{

  1706.                     // Risposta Asincrona
  1707.                     if(RuoloBusta.RISPOSTA.equals(ruoloBustaRicevuta.toString())){

  1708.                         msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoAsimmetrico richiesta Stato...");
  1709.                         scenarioCooperazione = Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_POLLING;

  1710.                         IDServizio idServizioOriginale = null;
  1711.                         msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoAsimmetrico richiesta Stato (lettura servizio originale)...");
  1712.                         try{
  1713.                             idServizioOriginale = profiloCollaborazione.asincronoAsimmetrico_getDatiConsegnaRisposta(protocolManager.getIdCorrelazioneAsincrona(bustaRichiesta));
  1714.                         }catch(Exception e){
  1715.                             msgDiag.logErroreGenerico(e, "profiloCollaborazione.asincronoAsimmetrico_getDatiConsegnaRisposta");
  1716.                             ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1717.                                     ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1718.                                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),
  1719.                                     idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1720.                                     null);
  1721.                             openspcoopstate.releaseResource();
  1722.                             esito.setEsitoInvocazione(true);
  1723.                             esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"profiloCollaborazione.asincronoAsimmetrico_getDatiConsegnaRisposta");
  1724.                             return esito;
  1725.                         }

  1726.                         // ripristino richiestaApplicativa con valori del servizio di richiesta (sovrascrivendo i valori del servizio correlato)
  1727.                         IDServizio idServizioRichiesta =
  1728.                                 IDServizioFactory.getInstance().getIDServizioFromValues(idServizioOriginale.getTipo(), idServizioOriginale.getNome(),
  1729.                                         richiestaApplicativa.getIDServizio().getSoggettoErogatore(), idServizioOriginale.getVersione());
  1730.                         idServizioRichiesta.setAzione(idServizioOriginale.getAzione());
  1731.                         idServizioRichiesta.setTipologia(richiestaApplicativa.getIDServizio().getTipologia());
  1732.                         idServizioRichiesta.setUriAccordoServizioParteComune(richiestaApplicativa.getIDServizio().getUriAccordoServizioParteComune());
  1733.                         richiestaApplicativa.updateIDServizio(idServizioRichiesta);
  1734.                        
  1735.                         // check esistenza porta applicativa
  1736.                         msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoSimmetrico richiesta Stato (existsPA)...");
  1737.                         try{
  1738.                             existsPA=configurazionePdDManager.existsPA(richiestaApplicativa, requestInfo);
  1739.                         }catch(Exception e){
  1740.                             msgDiag.logErroreGenerico(e, "existsPA(richiestaApplicativa,asincronoAsimmetricoRichiestaStato)");
  1741.                             ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1742.                                     ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1743.                                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE),
  1744.                                     idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1745.                                     null);
  1746.                             openspcoopstate.releaseResource();
  1747.                             esito.setEsitoInvocazione(true);  
  1748.                             esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"existsPA(richiestaApplicativa,asincronoAsimmetricoRichiestaStato)");
  1749.                             return esito;
  1750.                         }
  1751.                         if(!existsPA){
  1752.                             String nomePA = "";
  1753.                             if(richiestaApplicativa.getIdPortaApplicativa()!=null && richiestaApplicativa.getIdPortaApplicativa().getNome()!=null){
  1754.                                 nomePA = " ["+richiestaApplicativa.getIdPortaApplicativa().getNome()+"]";
  1755.                             }
  1756.                             msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, "Porta Applicativa"+nomePA+" non esistente");
  1757.                             msgDiag.logPersonalizzato_prefix("(RichiestaStato) ", "portaApplicativaNonEsistente");
  1758.                             ejbUtils.setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError.API_IN_UNKNOWN);
  1759.                             ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1760.                                     ErroriIntegrazione.ERRORE_450_PA_INESISTENTE.getErroreIntegrazione(),
  1761.                                     idCorrelazioneApplicativa,servizioApplicativoFruitore,null,
  1762.                                     null);
  1763.                             openspcoopstate.releaseResource();
  1764.                             esito.setEsitoInvocazione(true);  
  1765.                             esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  1766.                                     "(RichiestaStato) "+msgDiag.getMessaggio_replaceKeywords("portaApplicativaNonEsistente"));
  1767.                             return esito;
  1768.                         }
  1769.                        
  1770.                        
  1771.                         // Lettura Porta Applicativa
  1772.                         msgDiag.mediumDebug("Lettura Porta Applicativa ...");
  1773.                         pa = configurazionePdDManager.getPortaApplicativaSafeMethod(richiestaApplicativa.getIdPortaApplicativa(), requestInfo);
  1774.                        

  1775.                     }
  1776.                     //  Ricevuta alla richiesta.
  1777.                     else if(RuoloBusta.RICEVUTA_RICHIESTA.equals(ruoloBustaRicevuta.toString())){

  1778.                         msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoSimmetrico ricevuta richiesta...");
  1779.                         ricevutaAsincrona = "ricevuta di una richiesta asincrona asimmetrica";

  1780.                     }
  1781.                     //  Ricevuta alla risposta.
  1782.                     else if(RuoloBusta.RICEVUTA_RISPOSTA.equals(ruoloBustaRicevuta.toString())){

  1783.                         msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoSimmetrico ricevuta risposta...");
  1784.                         ricevutaAsincrona = "ricevuta di una risposta asincrona asimmetrica contenente l'esito della richiesta stato";

  1785.                     }
  1786.                     else{

  1787.                         msgDiag.logPersonalizzato("profiloAsincrono.flussoRicevutaRichiestaRispostaNonCorretto");
  1788.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1789.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1790.                                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),
  1791.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,null,
  1792.                                 null);
  1793.                         openspcoopstate.releaseResource();
  1794.                         esito.setEsitoInvocazione(true);  
  1795.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  1796.                                 msgDiag.getMessaggio_replaceKeywords("profiloAsincrono.flussoRicevutaRichiestaRispostaNonCorretto"));
  1797.                         return esito;

  1798.                     }


  1799.                     //  Raccolgo dati consegna per Ricevute
  1800.                     try{
  1801.                         if(ricevutaAsincrona!=null){
  1802.                             msgDiag.mediumDebug("Gestione profilo di collaborazione AsincronoAsimmetrico ricevuta (raccolta dati consegna per ricevuta)...");
  1803.                             integrazioneAsincrona = profiloCollaborazione.asincronoAsimmetrico_getDatiConsegnaRicevuta(bustaRichiesta.getRiferimentoMessaggio());
  1804.                         }
  1805.                     }catch(Exception e){
  1806.                         msgDiag.logErroreGenerico(e, "RaccoltaDatiIntegrazioneProfiloAsincronoAsimmetrico");
  1807.                         ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1808.                                 ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1809.                                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),
  1810.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1811.                                 null);
  1812.                         openspcoopstate.releaseResource();
  1813.                         esito.setEsitoInvocazione(true);
  1814.                         esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"RaccoltaDatiIntegrazioneProfiloAsincronoAsimmetrico");
  1815.                         return esito;
  1816.                     }

  1817.                 }  

  1818.             }else{

  1819.                 // profilo non conosciuto
  1820.                 Eccezione ecc =
  1821.                         Eccezione.getEccezioneValidazione(ErroriCooperazione.PROFILO_COLLABORAZIONE_SCONOSCIUTO.
  1822.                                 getErroreProfiloCollaborazioneSconosciuto(bustaRichiesta.getProfiloDiCollaborazioneValue()),
  1823.                                     protocolFactory);
  1824.                 msgDiag.addKeyword(CostantiPdD.KEY_ECCEZIONI, ecc.toString(protocolFactory));
  1825.                 msgDiag.addKeyword(CostantiPdD.KEY_NUMERO_ECCEZIONI, "1");
  1826.                 msgDiag.logPersonalizzato("validazioneBusta.bustaNonCorretta");
  1827.                 ejbUtils.sendAsRispostaBustaErroreValidazione(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,ecc,
  1828.                         idCorrelazioneApplicativa,servizioApplicativoFruitore);
  1829.                 openspcoopstate.releaseResource();
  1830.                 esito.setEsitoInvocazione(true);
  1831.                 esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,
  1832.                         msgDiag.getMessaggio_replaceKeywords("validazioneBusta.bustaNonCorretta"));
  1833.                 return esito;

  1834.             }  











  1835.             /*   -------------- Creazione dati consegna applicativa per profili asincroni  ------------------ */
  1836.             msgDiag.mediumDebug("Gestione profilo di collaborazione Asincrono, raccolta dati consegna...");
  1837.             RichiestaDelegata consegnaApplicativaAsincrona = null;
  1838.             PortaDelegata pdConsegnaApplicativaAsincrona = null;
  1839.             ServizioApplicativo saConsegnaApplicativaAsincrona = null;
  1840.             try{
  1841.                 if(integrazioneAsincrona!=null){
  1842.                     IDSoggetto soggettoFruitoreRichiestaAsincrona = new IDSoggetto(bustaRichiesta.getTipoDestinatario(),bustaRichiesta.getDestinatario());
  1843.                     IDSoggetto soggettoErogatoreRichiestaAsincrona = new IDSoggetto(bustaRichiesta.getTipoMittente(),bustaRichiesta.getMittente());
  1844.                     IDServizio servizioRichiestaAsincrona =
  1845.                         IDServizioFactory.getInstance().getIDServizioFromValues(bustaRichiesta.getTipoServizio(),bustaRichiesta.getServizio(),
  1846.                                 soggettoErogatoreRichiestaAsincrona, bustaRichiesta.getVersioneServizio());
  1847.                     servizioRichiestaAsincrona.setAzione(bustaRichiesta.getAzione());
  1848.                     ProprietaErroreApplicativo proprietaErroreApplAsincrono = this.propertiesReader.getProprietaGestioneErrorePD(protocolManager);
  1849.                     proprietaErroreApplAsincrono.setDominio(identitaPdD.getCodicePorta());
  1850.                     proprietaErroreApplAsincrono.setIdModulo(Sbustamento.ID_MODULO);
  1851.                     IDPortaDelegata idPD = configurazionePdDManager.getIDPortaDelegata(integrazioneAsincrona.getNomePorta(), requestInfo, protocolFactory);
  1852.                     consegnaApplicativaAsincrona = new RichiestaDelegata(idPD,
  1853.                             integrazioneAsincrona.getServizioApplicativo(),null,proprietaErroreApplAsincrono,identitaPdD);
  1854.                     consegnaApplicativaAsincrona.setScenario(scenarioCooperazione);
  1855.                     consegnaApplicativaAsincrona.setProfiloGestione(profiloGestione);
  1856.                    
  1857.                     pdConsegnaApplicativaAsincrona = configurazionePdDManager.getPortaDelegata(consegnaApplicativaAsincrona.getIdPortaDelegata(), requestInfo);
  1858.                     try{
  1859.                         IDServizioApplicativo idSA = new IDServizioApplicativo();
  1860.                         idSA.setNome(consegnaApplicativaAsincrona.getServizioApplicativo());
  1861.                         idSA.setIdSoggettoProprietario(soggettoFruitoreRichiestaAsincrona);
  1862.                         saConsegnaApplicativaAsincrona = configurazionePdDManager.getServizioApplicativo(idSA, requestInfo);
  1863.                     }catch(Exception e){
  1864.                         if( !(e instanceof DriverConfigurazioneNotFound) ||
  1865.                                 !(CostantiPdD.SERVIZIO_APPLICATIVO_ANONIMO.equals(consegnaApplicativaAsincrona.getServizioApplicativo())) ){
  1866.                             throw e;
  1867.                         }
  1868.                     }
  1869.                    
  1870.                     configurazionePdDManager.aggiornaProprietaGestioneErrorePD(proprietaErroreApplAsincrono,saConsegnaApplicativaAsincrona);
  1871.                    

  1872.                     // gestione ricevute asincrone
  1873.                     if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(bustaRichiesta.getProfiloDiCollaborazione())){
  1874.                         // asincrono simmetrico
  1875.                         consegnaApplicativaAsincrona.setRicevutaAsincrona(configurazionePdDManager.ricevutaAsincronaSimmetricaAbilitata(pdConsegnaApplicativaAsincrona));
  1876.                     } else {
  1877.                         // asincrono asimmetrico, se sono in un contesto di richiestaStato pooling, devo sempre ritornare il contenuto applicativo nella richiesta
  1878.                         if(RuoloBusta.RICEVUTA_RISPOSTA.equals(ruoloBustaRicevuta.toString())){
  1879.                             consegnaApplicativaAsincrona.setRicevutaAsincrona(true);
  1880.                         }else{
  1881.                             consegnaApplicativaAsincrona.setRicevutaAsincrona(configurazionePdDManager.ricevutaAsincronaAsimmetricaAbilitata(pdConsegnaApplicativaAsincrona));
  1882.                         }
  1883.                     }

  1884.                     // Ricevute Asincrone Simmetriche e Asimmetriche
  1885.                     if(ricevutaAsincrona!=null){
  1886.                         //  di default la ricezioneAsincrona viene utilizzata.
  1887.                         //  Non deve essere utilizzata solo nel caso di richiesta con profilo AsincronoSimmetrico
  1888.                         consegnaApplicativaAsincrona.setUtilizzoConsegnaAsincrona(true);
  1889.                         if(profiloCollaborazione.asincrono_spedizioneRichiestaInCorso(bustaRichiesta.getRiferimentoMessaggio())
  1890.                                 && org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(bustaRichiesta.getProfiloDiCollaborazione())){
  1891.                             consegnaApplicativaAsincrona.setUtilizzoConsegnaAsincrona(false);
  1892.                         }

  1893.                         //  Il modulo in attesa e' il servizio di ricezioneContenutiApplicativi
  1894.                         consegnaApplicativaAsincrona.setIdModuloInAttesa(integrazioneAsincrona.getIdModuloInAttesa());
  1895.                     }

  1896.                     // Risposta Asincrona Simmetrica
  1897.                     else{
  1898.                         // Il modulo in attesa e' il servizio di ricezioneBuste
  1899.                         consegnaApplicativaAsincrona.setIdModuloInAttesa(richiestaApplicativa.getIdModuloInAttesa());

  1900.                         //  elimino busta per profilo se non devo attendere una risposta applicativa (altrimenti la elimino quando prendo la busta per la ricevuta )
  1901.                         if(consegnaApplicativaAsincrona.isRicevutaAsincrona() == false){
  1902.                             profiloCollaborazione.eliminaBustaInviata(protocolManager.getIdCorrelazioneAsincrona(bustaRichiesta),true);
  1903.                         }

  1904.                         //  di default la ricezioneAsincrona viene utilizzata.
  1905.                         //  Non deve essere utilizzata solo nel caso di richiesta con profilo AsincronoSimmetrico
  1906.                         // qua siamo nella risposta asincrona
  1907.                         consegnaApplicativaAsincrona.setUtilizzoConsegnaAsincrona(true);

  1908.                         //  deve essere generato un msg OK se non e' abilitata la funzionalita' di ricevuta asincrona
  1909.                         if(configurazionePdDManager.isModalitaStateless(pdConsegnaApplicativaAsincrona, bustaRichiesta.getProfiloDiCollaborazione())==false){
  1910.                             generazioneMsgOK = !consegnaApplicativaAsincrona.isRicevutaAsincrona();
  1911.                         }
  1912.                         else{
  1913.                             generazioneMsgOK = false;
  1914.                         }
  1915.                        
  1916.                         //  RicevutaAsincrona immediata
  1917.                         if(generazioneMsgOK){
  1918.                             returnProtocolReply = true;
  1919.                             bustaHTTPReply.setServizio(bustaRichiesta.getServizio());
  1920.                             bustaHTTPReply.setTipoServizio(bustaRichiesta.getTipoServizio());
  1921.                             bustaHTTPReply.setAzione(bustaRichiesta.getAzione());
  1922.                             bustaHTTPReply.setProfiloDiCollaborazione(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO);
  1923.                             bustaHTTPReply.setRiferimentoMessaggio(bustaRichiesta.getID());
  1924.                             // (per gli asincroni devono sempre essere presenti)
  1925.                             if(this.propertiesReader.isGestioneElementoCollaborazione(implementazionePdDMittente))
  1926.                                 bustaHTTPReply.setCollaborazione(bustaRichiesta.getCollaborazione());
  1927.                             bustaHTTPReply.setRiferimentoMsgBustaRichiedenteServizio(bustaRichiesta.getRiferimentoMessaggio());

  1928.                             if(!consegnaAffidabile){
  1929.                                 bustaHTTPReply.setConfermaRicezione(false);
  1930.                             }
  1931.                             if(imbustamentoFiltroDuplicatiAbilitato){
  1932.                                 bustaHTTPReply.setInoltro(Inoltro.SENZA_DUPLICATI,protocolFactory.createTraduttore().toString(Inoltro.SENZA_DUPLICATI));    
  1933.                             }
  1934.                         }


  1935.                     }
  1936.                 }  
  1937.             }catch(Exception e){
  1938.                 msgDiag.logErroreGenerico(e, "GestioneConsegnaProfiloAsincrono");
  1939.                 ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1940.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1941.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),
  1942.                         idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1943.                         null);
  1944.                 openspcoopstate.releaseResource();  
  1945.                 esito.setEsitoInvocazione(true);
  1946.                 esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"GestioneConsegnaProfiloAsincrono");
  1947.                 return esito;
  1948.             }
















  1949.             /* ------------  Scenario di Cooperazione  ------------- */
  1950.             msgDiag.mediumDebug("Impostazione scenario di cooperazione...");
  1951.             try{
  1952.                 richiestaApplicativa.setScenario(scenarioCooperazione);
  1953.                 repositoryBuste.aggiornaInfoIntegrazioneIntoInBox_Scenario(bustaRichiesta.getID(), scenarioCooperazione);
  1954.                 ejbUtils.setScenarioCooperazione(scenarioCooperazione);
  1955.             }catch(Exception e){
  1956.                 msgDiag.logErroreGenerico(e, "repository.aggiornaInfoIntegrazioneIntoInBox_Scenario");
  1957.                 ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  1958.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  1959.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_525_GESTIONE_FUNZIONALITA_PROTOCOLLO),
  1960.                         idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  1961.                         null);
  1962.                 openspcoopstate.releaseResource();
  1963.                 esito.setEsitoInvocazione(true);
  1964.                 esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"repository.aggiornaInfoIntegrazioneIntoInBox_Scenario");
  1965.                 return esito;
  1966.             }




  1967.             /* ---------  
  1968.              * Spedizione contenuto applicativi con
  1969.              * - ConsegnaContenutiApplicativiMessage al modulo ConsegnaContenutiApplicativi
  1970.              * - RicezioneContenutiApplicativiMessage al modulo RicezioneContenutiApplicativi
  1971.              * -------- */
  1972.             Behaviour behaviour = null;
  1973.             try{
  1974.                 if(ricevutaAsincrona==null){
  1975.                     if(consegnaApplicativaAsincrona==null){
  1976.                         msgDiag.mediumDebug("Invio messaggio a ConsegnaContenutiApplicativi...");
  1977.                         behaviour = ejbUtils.sendToConsegnaContenutiApplicativi(requestInfo,richiestaApplicativa,bustaRichiesta,msgRequest,pa,repositoryBuste);
  1978.                         if(ejbUtils.isGestioneStatelessConIntegrationManager()){
  1979.                             generazioneMsgOK = true;
  1980.                             sendSbloccoRicezioneBuste = true;
  1981.                         }
  1982.                     }else{
  1983.                         msgDiag.mediumDebug("Invio messaggio a ConsegnaContenutiApplicativi (consegnaAsincrona)...");
  1984.                         ejbUtils.sendToConsegnaContenutiApplicativi_gestioneMessaggio(consegnaApplicativaAsincrona,bustaRichiesta,msgRequest,saConsegnaApplicativaAsincrona);
  1985.                     }  
  1986.                 }else{
  1987.                     if(consegnaApplicativaAsincrona.isRicevutaAsincrona()){
  1988.                         // Aggiorno l'id di sessione al riferimento Messaggio, id utilizzato dal servizio
  1989.                         // RicezioneContenutiApplicativi per l'attesa di una risposta
  1990.                         msgDiag.mediumDebug("Invio messaggio asincrono a Ricezione/Consegna ContenutiApplicativi...");
  1991.                         ejbUtils.updateIdSessione(bustaRichiesta.getRiferimentoMessaggio());

  1992.                         // Spedizione contenuto ricevuta applicativa
  1993.                         msgRequest = ejbUtils.sendRispostaApplicativa(consegnaApplicativaAsincrona,pdConsegnaApplicativaAsincrona,saConsegnaApplicativaAsincrona);

  1994.                         // ripristino old id sessione
  1995.                         ejbUtils.updateIdSessione(idMessageRequest);
  1996.                     }
  1997.                 }
  1998.                 // La gestione puo' avvenire per diversi servizi applicativi di una stessa PA.
  1999.                 // Quindi il servizio applicativo non e' identificavile in questo modulo. Lo sara' in Consegna contenuti applicativi.
  2000.                 // Viene effettuato il log di correlazione in EJBUtils
  2001.                 msgDiag.setServizioApplicativo(null);

  2002.             }catch(EJBUtilsConsegnaException e){
  2003.                 msgDiag.logPersonalizzato_custom(e.getMessaggio(), e.getLivello(), e.getCodice());
  2004.                 if(e.getIntegrationFunctionError()!=null) {
  2005.                     ejbUtils.setIntegrationFunctionErrorPortaApplicativa(e.getIntegrationFunctionError());
  2006.                 }
  2007.                 ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  2008.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2009.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_512_SEND),
  2010.                         idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  2011.                         null);
  2012.                 openspcoopstate.releaseResource();
  2013.                 esito.setEsitoInvocazione(true);
  2014.                 esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,e.getMessaggio());
  2015.                 return esito;
  2016.             }
  2017.             catch(Exception e){
  2018.                 //viene loggato dentro ejbUtils. msgDiag.errorOpenSPCoop("Abilitazione modulo ConsegnaMessaggio non riuscita (Busta "+bustaRichiesta.getID()+"): "+e.getMessage());

  2019.                 ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  2020.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2021.                             get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_512_SEND),
  2022.                         idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  2023.                         null);
  2024.                 openspcoopstate.releaseResource();
  2025.                 esito.setEsitoInvocazione(true);
  2026.                 esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"Abilitazione modulo ConsegnaMessaggio non riuscita (Busta "+bustaRichiesta.getID()+"): "+e.getMessage());
  2027.                 return esito;
  2028.             }








  2029.            
  2030.            
  2031.            







  2032.             /* ------------  Gestione Risposta verso RicezioneBuste ------------- */
  2033.             // se il profilo e' oneWay,
  2034.             // AsincronoSimmetrico o AsincronoAsimmetricoRichiesta senza gestione della ricevuta applicativa
  2035.             // viene generata una risposta inviata al modulo.
  2036.             boolean behaviourResponseTo = behaviour!=null && behaviour.isResponseTo();
  2037.             if(  generazioneMsgOK || behaviourResponseTo ) {
  2038.                 try{
  2039.                     pddContext.addObject(org.openspcoop2.core.constants.Costanti.DATA_PRESA_IN_CARICO,
  2040.                             DateUtils.getSimpleDateFormatMs().format(DateManager.getDate()));
  2041.                    
  2042.                     if(behaviourResponseTo){
  2043.                    
  2044.                         // Invio risposta richiesta dalla configurazione di behaviour
  2045.                         OpenSPCoop2Message msgReplyTo = null;
  2046.                         Busta bustaReplyTo = null;
  2047.                         if(behaviour.getResponseTo()!=null){
  2048.                             msgReplyTo = behaviour.getResponseTo().getMessage();
  2049.                             bustaReplyTo = behaviour.getResponseTo().getBusta();
  2050.                         }
  2051.                         if(msgReplyTo==null){
  2052.                             msgReplyTo = MessageUtilities.buildEmptyMessage(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),
  2053.                                     requestInfo.getProtocolRequestMessageType(),MessageRole.RESPONSE);
  2054.                         }
  2055.                         msgDiag.mediumDebug("Invio messaggio a Ricezione/Consegna ContenutiApplicativi (Behaviour)...");
  2056.                         msgResponse = ejbUtils.buildAndSendBustaRisposta(richiestaApplicativa.getIdModuloInAttesa(),
  2057.                                 bustaReplyTo,
  2058.                                 msgReplyTo,profiloGestione,
  2059.                                 idCorrelazioneApplicativa,servizioApplicativoFruitore);
  2060.                        
  2061.                     }else if( returnProtocolReply == false){
  2062.                         // Invio sblocco se e' attesa una risposta dal modulo
  2063.                         // Se non e' abilitato la risposta su di una nuova connessione, e l'indirizzo telematico
  2064.                         // non e' abilitato o cmq non presente, allora devo inviare lo sblocco
  2065.                         if(sendSbloccoRicezioneBuste){
  2066.                             msgDiag.mediumDebug("Invio messaggio di sblocco a RicezioneBuste...");
  2067.                             msgResponse = ejbUtils.sendSbloccoRicezioneBuste(richiestaApplicativa.getIdModuloInAttesa());
  2068.                         }
  2069.                     }
  2070.                     else{
  2071.                         // Invio risposta immediata in seguito alla richiesta ricevuta
  2072.                         msgDiag.mediumDebug("Invio messaggio a Ricezione/Consegna ContenutiApplicativi...");
  2073.                         msgResponse = ejbUtils.buildAndSendBustaRisposta(richiestaApplicativa.getIdModuloInAttesa(),bustaHTTPReply,
  2074.                                 MessageUtilities.buildEmptyMessage(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),
  2075.                                         requestInfo.getProtocolRequestMessageType(),MessageRole.RESPONSE),profiloGestione,
  2076.                                         idCorrelazioneApplicativa,servizioApplicativoFruitore);
  2077.                     }
  2078.                 }catch(Exception e){
  2079.                     msgDiag.logErroreGenerico(e, "GenerazioneMsgOK(Riscontro/Ricevuta/Sblocco)");
  2080.                     ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  2081.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2082.                                 get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_512_SEND),
  2083.                             idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  2084.                             null);
  2085.                     openspcoopstate.releaseResource();
  2086.                     esito.setEsitoInvocazione(true);
  2087.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"GenerazioneMsgOK(Riscontro/Ricevuta/Sblocco)");
  2088.                     return esito;
  2089.                 }
  2090.             }else if( ricevutaAsincrona !=null ){
  2091.                 try{
  2092.                     pddContext.addObject(org.openspcoop2.core.constants.Costanti.DATA_PRESA_IN_CARICO,
  2093.                             DateUtils.getSimpleDateFormatMs().format(DateManager.getDate()));
  2094.                    
  2095.                     //  Invio sblocco
  2096.                     // Se non e' abilitato la risposta su di una nuova connessione, e l'indirizzo telematico
  2097.                     // non e' abilitato o cmq non presente, allora devo inviare lo sblocco
  2098.                     if(sendSbloccoRicezioneBuste){
  2099.                         msgDiag.mediumDebug("Invio messaggio di sblocco a RicezioneBuste (ricevuta asincrona)...");
  2100.                         msgResponse = ejbUtils.sendSbloccoRicezioneBuste(richiestaApplicativa.getIdModuloInAttesa());
  2101.                     }
  2102.                 }catch(Exception e){
  2103.                     msgDiag.logErroreGenerico(e, "SendSbloccoDopoRicezione("+ricevutaAsincrona+")");
  2104.                     ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  2105.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  2106.                                 get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_512_SEND),
  2107.                             idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  2108.                             null);
  2109.                     openspcoopstate.releaseResource();
  2110.                     esito.setEsitoInvocazione(true);
  2111.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"SendSbloccoDopoRicezione("+ricevutaAsincrona+")");
  2112.                     return esito;
  2113.                 }
  2114.             }
  2115.            
  2116.            







  2117.             /* ---------- Gestione Transazione Modulo ---------------- */
  2118.             // se non ho gestito una ricevuta asincrona, sono andato verso ConsegnaContenutiApplicativi
  2119.             msgDiag.mediumDebug("Aggiornamento proprietario messaggio...");

  2120.             if(ricevutaAsincrona==null){
  2121.                 msgRequest.aggiornaProprietarioMessaggio(org.openspcoop2.pdd.mdb.ConsegnaContenutiApplicativi.ID_MODULO);
  2122.             }
  2123.             // se ho gestito una ricevuta asincrona, guardo se e' abilitata la gestione del contenuto applicativo nella risposta
  2124.             // se non e' abilitato devo cancellare il messaggio.
  2125.             else if(consegnaApplicativaAsincrona!=null){
  2126.                 if(consegnaApplicativaAsincrona.isRicevutaAsincrona()==false){
  2127.                     repositoryBuste.eliminaUtilizzoPdDFromInBox(idMessageRequest,true);
  2128.                     msgRequest.aggiornaProprietarioMessaggio(org.openspcoop2.pdd.timers.TimerGestoreMessaggi.ID_MODULO);
  2129.                 }
  2130.             }
  2131.             // else l'ho gia inviato al modulo di ricezione contenuti applicativi il contenuto della ricevuta asincrona

  2132.             // Commit JDBC
  2133.             msgDiag.mediumDebug("Commit delle operazioni per la gestione della busta...");
  2134.             openspcoopstate.commit();


  2135.         }catch(Throwable e){
  2136.             this.log.error("ErroreGenerale",e);
  2137.             msgDiag.logErroreGenerico(e, "Generale");
  2138.            
  2139.             if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(bustaRichiesta.getProfiloDiCollaborazione()) == true  ) {
  2140.                 try{
  2141.                     ejbUtils.sendAsRispostaBustaErroreProcessamento(richiestaApplicativa.getIdModuloInAttesa(),bustaRichiesta,
  2142.                             ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreIntegrazione(),
  2143.                             idCorrelazioneApplicativa,servizioApplicativoFruitore,e,
  2144.                             null);
  2145.                     esito.setEsitoInvocazione(true);
  2146.                     esito.setStatoInvocazione(EsitoLib.ERRORE_GESTITO,"ErroreGenerale");
  2147.                 }catch(Exception er){
  2148.                     msgDiag.logErroreGenerico(er,"ejbUtils.sendErroreGenerale(profiloConRisposta)");
  2149.                     ejbUtils.rollbackMessage("Spedizione Errore al Mittente durante una richiesta sincrona non riuscita", esito);
  2150.                     esito.setEsitoInvocazione(false);
  2151.                     esito.setStatoInvocazioneErroreNonGestito(er);
  2152.                 }    
  2153.             }else{
  2154.                 ejbUtils.rollbackMessage("ErroreGenerale:"+e.getMessage(), esito);
  2155.                 esito.setStatoInvocazioneErroreNonGestito(e);
  2156.                 esito.setEsitoInvocazione(false);
  2157.             }
  2158.             openspcoopstate.releaseResource();
  2159.             return esito;
  2160.         }

  2161.         // Aggiornamento cache messaggio
  2162.         if(msgRequest!=null)
  2163.             msgRequest.addMessaggiIntoCache_readFromTable(Sbustamento.ID_MODULO, "richiesta");
  2164.         if(msgResponse!=null)
  2165.             msgResponse.addMessaggiIntoCache_readFromTable(Sbustamento.ID_MODULO, "risposta");

  2166.         // Aggiornamento cache proprietario messaggio
  2167.         if(msgRequest!=null)
  2168.             msgRequest.addProprietariIntoCache_readFromTable(Sbustamento.ID_MODULO, "richiesta",null,false);
  2169.         if(msgResponse!=null)
  2170.             msgResponse.addProprietariIntoCache_readFromTable(Sbustamento.ID_MODULO, "risposta",idMessageRequest,false);

  2171.         // Gestione ricevute
  2172.         if(ricevutaAsincrona!=null){
  2173.             msgDiag.mediumDebug("Gestione ricevute asincrone...");
  2174.             try{
  2175.                
  2176.                 boolean forzaEliminazioneMessaggio = false;
  2177.                 if( (openspcoopstate instanceof OpenSPCoopStateless) &&  
  2178.                         ("ricevuta di una richiesta asincrona simmetrica".equals(ricevutaAsincrona)) ){
  2179.                     forzaEliminazioneMessaggio = true;
  2180.                 }
  2181.                
  2182.                 GestoreMessaggi msgRiscontrato = new GestoreMessaggi(openspcoopstate, true, bustaRichiesta.getRiferimentoMessaggio(),Costanti.OUTBOX,msgDiag,pddContext);
  2183.                 msgRiscontrato.setReadyForDrop(forzaEliminazioneMessaggio);
  2184.                 msgRiscontrato.validateAndDeleteMsgAsincronoRiscontrato(bustaRichiesta);
  2185.                 msgDiag.addKeyword(CostantiPdD.KEY_TIPO_RICEVUTA_ASINCRONA, ricevutaAsincrona);
  2186.                 msgDiag.logPersonalizzato("validazioneRicevutaAsincrona");
  2187.             }catch(Exception e){
  2188.                 msgDiag.logErroreGenerico(e,"Validazione("+ricevutaAsincrona+")");
  2189.             }
  2190.         }

  2191.         // Rilascio connessione al DB
  2192.         msgDiag.mediumDebug("Rilascio connessione al database...");
  2193.         openspcoopstate.releaseResource();

  2194.         msgDiag.mediumDebug("Lavoro Terminato.");

  2195.         esito.setEsitoInvocazione(true);
  2196.         esito.setStatoInvocazione(EsitoLib.OK, null);
  2197.         return esito;

  2198.     }



  2199.     /**
  2200.      * Gestione errore.
  2201.      *
  2202.      *
  2203.      */
  2204.     private void gestioneErroreProtocollo(ConfigurazionePdDManager configurazionePdDManager, EJBUtils ejbUtils, ProfiloDiCollaborazione profiloCollaborazione, RepositoryBuste repositoryBuste,
  2205.             Busta busta, IDSoggetto identitaPdD, Eccezione eccezioneProtocollo, ErroreIntegrazione erroreIntegrazione, IDSoggetto soggettoProduttoreEccezione, DettaglioEccezione dettaglioEccezione,
  2206.             IProtocolFactory<?> protocolFactory, IProtocolManager protocolManager, PdDContext pddContext, RequestInfo requestInfo,
  2207.             IntegrationFunctionError integrationFunctionError) throws Exception{

  2208.         // Gestione ERRORE
  2209.         if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.SINCRONO.equals(busta.getProfiloDiCollaborazione()) && busta.getRiferimentoMessaggio()!=null){
  2210.             // oltre al messaggio in ingresso, viene effettuato il rollback sul riferimento messaggio.
  2211.             // una risposta al SIL in attesa verra' ritornata quando scadra il timeout sulla connessione JMS della coda 'RicezioneContenutiApplicativi'
  2212.             ejbUtils.releaseInboxMessage(Costanti.OUTBOX,busta.getRiferimentoMessaggio(), true);
  2213.         }else if(org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(busta.getProfiloDiCollaborazione()) ||
  2214.                 org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(busta.getProfiloDiCollaborazione()) ){
  2215.             Integrazione integrazioneRispostaErrore = null;
  2216.             boolean spedizioneRichiestaInCorso = profiloCollaborazione.asincrono_spedizioneRichiestaInCorso(busta.getRiferimentoMessaggio());
  2217.             boolean spedizioneRispostaInCorso = profiloCollaborazione.asincrono_spedizioneRispostaInCorso(busta.getRiferimentoMessaggio());
  2218.             boolean ricevutaApplicativaAbilitata=true;
  2219.             boolean gestioneEffettuata = false;
  2220.             if(spedizioneRichiestaInCorso || spedizioneRispostaInCorso){
  2221.                 ricevutaApplicativaAbilitata = profiloCollaborazione.asincrono_ricevutaApplicativaAbilitata(busta.getRiferimentoMessaggio());
  2222.                 if(ricevutaApplicativaAbilitata){
  2223.                     try{
  2224.                         integrazioneRispostaErrore = repositoryBuste.getInfoIntegrazioneFromOutBox(busta.getRiferimentoMessaggio());
  2225.                     }catch(Exception e){
  2226.                         throw new Exception("Riscontrato errore durante l'esamina dei dati di integrazione per la generazione di una risposta applicativa asincrona, in seguito alla ricezione di un Messaggio Errore Protocollo: "+e.getMessage());
  2227.                     }
  2228.                     if(integrazioneRispostaErrore!=null){
  2229.                         // Costruzione Richiesta Delegata
  2230.                         IDSoggetto soggettoFruitoreAsincrono = new IDSoggetto(busta.getTipoDestinatario(),busta.getDestinatario());
  2231.                         IDSoggetto soggettoErogatoreAsincrono = new IDSoggetto(busta.getTipoMittente(),busta.getMittente());
  2232.                         IDServizio servizioAsincrono =
  2233.                             IDServizioFactory.getInstance().getIDServizioFromValues(busta.getTipoServizio(),busta.getServizio(),
  2234.                                     soggettoErogatoreAsincrono, busta.getVersioneServizio());
  2235.                         servizioAsincrono.setAzione(busta.getAzione());
  2236.                         ProprietaErroreApplicativo proprietaErroreApplAsincrono = this.propertiesReader.getProprietaGestioneErrorePD(protocolManager);
  2237.                         proprietaErroreApplAsincrono.setDominio(identitaPdD.getCodicePorta());
  2238.                         proprietaErroreApplAsincrono.setIdModulo(Sbustamento.ID_MODULO);
  2239.                        
  2240.                         IDPortaDelegata idPD = configurazionePdDManager.getIDPortaDelegata(integrazioneRispostaErrore.getNomePorta(), requestInfo, protocolFactory);
  2241.                         RichiestaDelegata consegnaApplicativaAsincrona = new RichiestaDelegata(idPD,
  2242.                                 integrazioneRispostaErrore.getServizioApplicativo(),null,proprietaErroreApplAsincrono,identitaPdD);
  2243.                        
  2244.                         PortaDelegata pd = configurazionePdDManager.getPortaDelegata(consegnaApplicativaAsincrona.getIdPortaDelegata(), requestInfo);
  2245.                         ServizioApplicativo sappl = null;
  2246.                         try{
  2247.                             IDServizioApplicativo idSA = new IDServizioApplicativo();
  2248.                             idSA.setNome(consegnaApplicativaAsincrona.getServizioApplicativo());
  2249.                             idSA.setIdSoggettoProprietario(soggettoFruitoreAsincrono);
  2250.                             sappl = configurazionePdDManager.getServizioApplicativo(idSA, requestInfo);
  2251.                         }catch(Exception e){
  2252.                             if( !(e instanceof DriverConfigurazioneNotFound) || !(CostantiPdD.SERVIZIO_APPLICATIVO_ANONIMO.equals(consegnaApplicativaAsincrona.getServizioApplicativo())) ){
  2253.                                 throw e;
  2254.                             }
  2255.                         }
  2256.                         configurazionePdDManager.aggiornaProprietaGestioneErrorePD(proprietaErroreApplAsincrono,sappl);
  2257.                    
  2258.                        
  2259.                         //  di default la ricezioneAsincrona viene utilizzata.
  2260.                         //  Non deve essere utilizzata solo nel caso di richiesta con profilo AsincronoSimmetrico
  2261.                         consegnaApplicativaAsincrona.setUtilizzoConsegnaAsincrona(true);
  2262.                         if(spedizioneRichiestaInCorso && org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(busta.getProfiloDiCollaborazione())){
  2263.                             consegnaApplicativaAsincrona.setUtilizzoConsegnaAsincrona(false);
  2264.                         }
  2265.                         //  Il modulo in attesa e' il servizio di ricezioneContenutiApplicativi
  2266.                         consegnaApplicativaAsincrona.setIdModuloInAttesa(integrazioneRispostaErrore.getIdModuloInAttesa());

  2267.                         this.generatoreErrore.updateDominio(consegnaApplicativaAsincrona.getDominio());
  2268.                         this.generatoreErrore.updateProprietaErroreApplicativo(proprietaErroreApplAsincrono);
  2269.                         this.generatoreErrore.updateTipoPdD(TipoPdD.DELEGATA);
  2270.                         this.generatoreErrore.updateInformazioniCooperazione(consegnaApplicativaAsincrona.getServizioApplicativo());
  2271.                         this.generatoreErrore.updateInformazioniCooperazione(consegnaApplicativaAsincrona.getIdSoggettoFruitore(),consegnaApplicativaAsincrona.getIdServizio());
  2272.                        
  2273.                         OpenSPCoop2Message responseMessageError = null;
  2274.                         if(eccezioneProtocollo!=null){
  2275.                             responseMessageError = this.generatoreErrore.build(pddContext, integrationFunctionError,
  2276.                                     eccezioneProtocollo,soggettoProduttoreEccezione,dettaglioEccezione,
  2277.                                     null);
  2278.                         }else{
  2279.                             responseMessageError = this.generatoreErrore.build(pddContext, integrationFunctionError,erroreIntegrazione,null,null);
  2280.                         }
  2281.                         //  Aggiorno l'id di sessione al riferimento Messaggio, id utilizzato dal servizio
  2282.                         // RicezioneContenutiApplicativi per l'attesa di una risposta
  2283.                         ejbUtils.updateIdSessione(busta.getRiferimentoMessaggio());
  2284.                         ejbUtils.sendRispostaApplicativaErrore(responseMessageError,consegnaApplicativaAsincrona,spedizioneRichiestaInCorso,pd,sappl);
  2285.                         // ripristino old id sessione
  2286.                         ejbUtils.updateIdSessione(busta.getID());

  2287.                         gestioneEffettuata = true;
  2288.                     }
  2289.                     else{
  2290.                         // una risposta al SIL in attesa verra' ritornata quando scadra il timeout sulla connessione JMS della coda 'RicezioneContenutiApplicativi'
  2291.                         if(spedizioneRichiestaInCorso){
  2292.                             //  oltre al messaggio in ingresso, viene effettuato il rollback sul riferimento messaggio.
  2293.                             ejbUtils.releaseInboxMessage(Costanti.OUTBOX,busta.getRiferimentoMessaggio(), true);

  2294.                             gestioneEffettuata = true;
  2295.                         }// else se vi e' una risposta in corso, basta rilasciare la busta di errore.
  2296.                     }
  2297.                 }// else se non e' attiva la gestione della ricevuta applicativa, basta rilasciare la busta di errore.
  2298.             }// else se non e' in corso ne una richiesta ne una risposta, basta rilasciare la busta di errore.
  2299.             if(gestioneEffettuata == false){
  2300.                 ejbUtils.releaseInboxMessage(true);
  2301.             }                  
  2302.         }else{
  2303.             ejbUtils.releaseInboxMessage(true);
  2304.         }

  2305.     }

  2306.    
  2307.     public static IFiltroDuplicati getGestoreFiltroDuplicati(OpenSPCoop2Properties propertiesReader,Loader loader,
  2308.             IOpenSPCoopState openspcoopstate,PdDContext pddContext, History historyBuste, RepositoryBuste repositoryBuste, boolean oneWayVersione11) throws Exception{
  2309.         // Istanzio gestore filtro duplicati
  2310.         String gestoreFiltroDuplicatiType = propertiesReader.getGestoreFiltroDuplicatiRepositoryBuste();
  2311.         ClassNameProperties prop = ClassNameProperties.getInstance();
  2312.         String gestoreFiltroDuplicatiClass = prop.getFiltroDuplicati(gestoreFiltroDuplicatiType);
  2313.         if(gestoreFiltroDuplicatiClass == null){
  2314.             throw new Exception("GestoreFiltroDuplicati non registrato ("+gestoreFiltroDuplicatiType+")");
  2315.         }
  2316.         IFiltroDuplicati gestoreFiltroDuplicati = (IFiltroDuplicati) loader.newInstance(gestoreFiltroDuplicatiClass);
  2317.         if(pddContext!=null) {
  2318.             pddContext.addObject(org.openspcoop2.core.constants.Costanti.OPENSPCOOP_STATE, openspcoopstate );
  2319.         }
  2320.         gestoreFiltroDuplicati.init(pddContext);
  2321.         if(gestoreFiltroDuplicati instanceof org.openspcoop2.protocol.engine.driver.FiltroDuplicati){
  2322.             ((org.openspcoop2.protocol.engine.driver.FiltroDuplicati)gestoreFiltroDuplicati).setHistoryBuste(historyBuste);
  2323.             ((org.openspcoop2.protocol.engine.driver.FiltroDuplicati)gestoreFiltroDuplicati).setRepositoryBuste(repositoryBuste);
  2324.             ((org.openspcoop2.protocol.engine.driver.FiltroDuplicati)gestoreFiltroDuplicati).setGestioneStateless((openspcoopstate instanceof OpenSPCoopStateless) && (oneWayVersione11==false));
  2325.             ((org.openspcoop2.protocol.engine.driver.FiltroDuplicati)gestoreFiltroDuplicati).setRepositoryIntervalloScadenzaMessaggi(propertiesReader.getRepositoryIntervalloScadenzaMessaggi());
  2326.         }
  2327.         else if(gestoreFiltroDuplicati instanceof org.openspcoop2.pdd.core.transazioni.FiltroDuplicati) {
  2328.             if(pddContext!=null && pddContext.containsKey(CostantiPdD.FILTRO_DUPLICATI_TEST)) {
  2329.                 ((org.openspcoop2.pdd.core.transazioni.FiltroDuplicati)gestoreFiltroDuplicati).setUseTransactionIdForTest(true);
  2330.             }
  2331.         }
  2332.         return gestoreFiltroDuplicati;
  2333.     }
  2334. }