EJBUtils.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.core;

  21. import java.sql.Timestamp;
  22. import java.util.ArrayList;
  23. import java.util.Date;
  24. import java.util.HashMap;
  25. import java.util.List;
  26. import java.util.Map;

  27. import javax.xml.soap.SOAPBody;

  28. import org.openspcoop2.core.config.GestioneErrore;
  29. import org.openspcoop2.core.config.PortaApplicativa;
  30. import org.openspcoop2.core.config.PortaApplicativaServizioApplicativo;
  31. import org.openspcoop2.core.config.PortaDelegata;
  32. import org.openspcoop2.core.config.ServizioApplicativo;
  33. import org.openspcoop2.core.config.constants.CostantiConfigurazione;
  34. import org.openspcoop2.core.config.constants.TipoBehaviour;
  35. import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
  36. import org.openspcoop2.core.config.driver.db.DriverConfigurazioneDB;
  37. import org.openspcoop2.core.constants.TipoPdD;
  38. import org.openspcoop2.core.eccezione.details.DettaglioEccezione;
  39. import org.openspcoop2.core.id.IDServizio;
  40. import org.openspcoop2.core.id.IDServizioApplicativo;
  41. import org.openspcoop2.core.id.IDSoggetto;
  42. import org.openspcoop2.core.integrazione.EsitoRichiesta;
  43. import org.openspcoop2.core.integrazione.utils.EsitoRichiestaXMLUtils;
  44. import org.openspcoop2.core.transazioni.IdTransazioneApplicativoServer;
  45. import org.openspcoop2.core.transazioni.TransazioneApplicativoServer;
  46. import org.openspcoop2.message.OpenSPCoop2Message;
  47. import org.openspcoop2.message.OpenSPCoop2MessageFactory;
  48. import org.openspcoop2.message.OpenSPCoop2MessageParseResult;
  49. import org.openspcoop2.message.OpenSPCoop2SoapMessage;
  50. import org.openspcoop2.message.constants.MessageRole;
  51. import org.openspcoop2.message.constants.MessageType;
  52. import org.openspcoop2.message.exception.ParseException;
  53. import org.openspcoop2.message.utils.MessageUtilities;
  54. import org.openspcoop2.pdd.config.ClassNameProperties;
  55. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  56. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  57. import org.openspcoop2.pdd.config.RichiestaApplicativa;
  58. import org.openspcoop2.pdd.config.RichiestaDelegata;
  59. import org.openspcoop2.pdd.config.SoggettoVirtuale;
  60. import org.openspcoop2.pdd.core.behaviour.Behaviour;
  61. import org.openspcoop2.pdd.core.behaviour.BehaviourForwardTo;
  62. import org.openspcoop2.pdd.core.behaviour.BehaviourForwardToConfiguration;
  63. import org.openspcoop2.pdd.core.behaviour.BehaviourForwardToFilter;
  64. import org.openspcoop2.pdd.core.behaviour.BehaviourLoadBalancer;
  65. import org.openspcoop2.pdd.core.behaviour.BehaviourLoader;
  66. import org.openspcoop2.pdd.core.behaviour.IBehaviour;
  67. import org.openspcoop2.pdd.core.behaviour.StatoFunzionalita;
  68. import org.openspcoop2.pdd.core.behaviour.built_in.multi_deliver.ConfigurazioneGestioneConsegnaNotifiche;
  69. import org.openspcoop2.pdd.core.behaviour.built_in.multi_deliver.GestioneConsegnaNotificheUtils;
  70. import org.openspcoop2.pdd.core.behaviour.built_in.multi_deliver.MessaggioDaNotificare;
  71. import org.openspcoop2.pdd.core.behaviour.built_in.multi_deliver.MultiDeliverBehaviour;
  72. import org.openspcoop2.pdd.core.behaviour.built_in.multi_deliver.MultiDeliverUtils;
  73. import org.openspcoop2.pdd.core.handlers.HandlerException;
  74. import org.openspcoop2.pdd.core.node.INodeSender;
  75. import org.openspcoop2.pdd.core.state.IOpenSPCoopState;
  76. import org.openspcoop2.pdd.core.state.OpenSPCoopState;
  77. import org.openspcoop2.pdd.core.state.OpenSPCoopStateful;
  78. import org.openspcoop2.pdd.core.state.OpenSPCoopStateless;
  79. import org.openspcoop2.pdd.core.transazioni.GestoreConsegnaMultipla;
  80. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  81. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  82. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  83. import org.openspcoop2.pdd.mdb.ConsegnaContenutiApplicativi;
  84. import org.openspcoop2.pdd.mdb.ConsegnaContenutiApplicativiBehaviourMessage;
  85. import org.openspcoop2.pdd.mdb.ConsegnaContenutiApplicativiMessage;
  86. import org.openspcoop2.pdd.mdb.EsitoLib;
  87. import org.openspcoop2.pdd.mdb.InoltroRisposte;
  88. import org.openspcoop2.pdd.mdb.InoltroRisposteMessage;
  89. import org.openspcoop2.pdd.services.ServicesUtils;
  90. import org.openspcoop2.pdd.services.core.RicezioneBusteMessage;
  91. import org.openspcoop2.pdd.services.core.RicezioneContenutiApplicativiMessage;
  92. import org.openspcoop2.pdd.services.error.AbstractErrorGenerator;
  93. import org.openspcoop2.pdd.services.error.RicezioneBusteExternalErrorGenerator;
  94. import org.openspcoop2.pdd.timers.TimerGestoreMessaggi;
  95. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  96. import org.openspcoop2.protocol.engine.builder.DettaglioEccezioneOpenSPCoop2Builder;
  97. import org.openspcoop2.protocol.engine.builder.Imbustamento;
  98. import org.openspcoop2.protocol.engine.constants.Costanti;
  99. import org.openspcoop2.protocol.engine.driver.RepositoryBuste;
  100. import org.openspcoop2.protocol.engine.driver.RollbackRepositoryBuste;
  101. import org.openspcoop2.protocol.sdk.Busta;
  102. import org.openspcoop2.protocol.sdk.Eccezione;
  103. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  104. import org.openspcoop2.protocol.sdk.Integrazione;
  105. import org.openspcoop2.protocol.sdk.ProtocolException;
  106. import org.openspcoop2.protocol.sdk.config.IProtocolVersionManager;
  107. import org.openspcoop2.protocol.sdk.config.ITraduttore;
  108. import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
  109. import org.openspcoop2.protocol.sdk.constants.ErroreIntegrazione;
  110. import org.openspcoop2.protocol.sdk.constants.ErroriCooperazione;
  111. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  112. import org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione;
  113. import org.openspcoop2.protocol.sdk.constants.RuoloMessaggio;
  114. import org.openspcoop2.protocol.sdk.state.IState;
  115. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  116. import org.openspcoop2.protocol.sdk.state.StateMessage;
  117. import org.openspcoop2.protocol.sdk.state.StatelessMessage;
  118. import org.openspcoop2.utils.LoggerWrapperFactory;
  119. import org.openspcoop2.utils.UtilsException;
  120. import org.openspcoop2.utils.date.DateManager;
  121. import org.openspcoop2.utils.id.UniqueIdentifierManager;
  122. import org.openspcoop2.utils.resources.Loader;
  123. import org.openspcoop2.utils.transport.http.HttpConstants;
  124. import org.slf4j.Logger;


  125. /**
  126.  * Libreria contenente metodi utili per lo smistamento delle buste
  127.  * all'interno dei moduli EJB di openspcoop.
  128.  *
  129.  * @author Poli Andrea (apoli@link.it)
  130.  * @author $Author$
  131.  * @version $Rev$, $Date$
  132.  */

  133. public class EJBUtils {

  134.     /** Logger utilizzato per debug. */
  135.     private Logger log = null;

  136.     private IOpenSPCoopState openSPCoopState;

  137.     /** Indicazione sul modulo  */
  138.     private String idModulo = null;
  139.     /** Tipo di Porta */
  140.     private TipoPdD tipoPdD;
  141.     /** Indicazione sul codice porta  */
  142.     private IDSoggetto identitaPdD = null;
  143.     /** Identificativo generato per la richiesta ed utilizzato per collegare la gestione del servizio richiesto,
  144.     tra i vari nodi dell'infrastruttura openspcoop. */
  145.     private String idSessione;
  146.     /** Identificativo del messaggio in gestione
  147.     (questo id coincide con l'id della sessione nella richiesta ma non nella risposta) */
  148.     private String idMessage;
  149.     /** Tipo di Messaggio (INBOX/OUTBOX) */
  150.     private String tipo;
  151.     /** Scenario di Cooperazione */
  152.     private String scenarioCooperazione;
  153.     /** MessaggioDiagnostico */
  154.     private MsgDiagnostico msgDiag;
  155.    
  156.     /** Indicazione se siamo in modalita oneway11 */
  157.     private boolean oneWayVersione11 = false;
  158.     /** Indicazione se la porta delegata/applicativa richiesta una modalita stateless (oneway o sincrono)
  159.      *  Il caso oneway11 possiedera questo booleano con il valore false.
  160.      * */
  161.     private boolean portaDiTipoStateless_esclusoOneWay11;
  162.     /** Indicazione se deve essere gestita la richiesta in caso di errore */
  163.     private boolean rollbackRichiestaInCasoErrore = true;
  164.     /** Indicazione se deve essere gestita la richiesta in caso di errore */
  165.     private boolean rollbackRichiestaInCasoErrore_rollbackHistory = true;
  166.     /** Indicazione se siamo in modalita di routing */
  167.     private boolean routing;
  168.    
  169.    
  170.     /** PropertiesReader */
  171.     private OpenSPCoop2Properties propertiesReader;
  172.     /** ConfigurazionePdDReader */
  173.     private ConfigurazionePdDManager configurazionePdDReader;
  174.     /** Indicazione se la classe viene utilizzata dal router */
  175.     private boolean functionAsRouter = false;
  176.    
  177.     /** Gestione tempi di attraversamento */
  178.     private Timestamp spedizioneMsgIngresso;
  179.     private Timestamp ricezioneMsgRisposta;

  180.     /** Reply on new Connection: buste, escluse le buste di risposta sincrona */
  181.     private boolean replyOnNewConnection;
  182.     /** Utilizzo indirizzo telematico: utilizzo dell'indirizzo telematico */
  183.     private boolean utilizzoIndirizzoTelematico;

  184.     /** Tipologia di porta di domino del soggetto mittente */
  185.     private String implementazionePdDSoggettoMittente;
  186.     /** Tipologia di porta di domino del soggetto destinatario */
  187.     private String implementazionePdDSoggettoDestinatario;
  188.    
  189.     /** ServizioApplicativo erogatore */
  190.     private String servizioApplicativoErogatore;
  191.    
  192.     /** PdDContext */
  193.     private PdDContext pddContext;
  194.     public void setPddContext(PdDContext pddContext) {
  195.         this.pddContext = pddContext;
  196.     }
  197.    
  198.     /** OLD Function Name */
  199.     private String oldFunctionName;

  200.     /** INodeSender */
  201.     private INodeSender nodeSender = null;

  202.     /** ProtocolFactory */
  203.     private IProtocolFactory<?> protocolFactory = null;
  204.     private IProtocolVersionManager protocolManager = null;
  205.    
  206.     /** DettaglioEccezioneOpenSPCoop2Builder */
  207.     private DettaglioEccezioneOpenSPCoop2Builder dettaglioBuilder = null;
  208.    
  209.     /** RicezioneBusteExternalErrorGenerator */
  210.     private RicezioneBusteExternalErrorGenerator generatoreErrorePortaApplicativa = null;
  211.     private IntegrationFunctionError _integrationFunctionErrorPortaApplicativa;
  212.     private IntegrationFunctionError getIntegrationFunctionErrorPortaApplicativa(boolean erroreValidazione) {
  213.         if(this._integrationFunctionErrorPortaApplicativa!=null) {
  214.             return this._integrationFunctionErrorPortaApplicativa;
  215.         }
  216.         else {
  217.             IntegrationFunctionError ife = AbstractErrorGenerator.getIntegrationInternalError(this.pddContext); // default
  218.             if(erroreValidazione) {
  219.                 ife = IntegrationFunctionError.INTERNAL_RESPONSE_ERROR.equals(ife) ?
  220.                         IntegrationFunctionError.INVALID_INTEROPERABILITY_PROFILE_RESPONSE :
  221.                         IntegrationFunctionError.INVALID_INTEROPERABILITY_PROFILE_REQUEST;
  222.             }
  223.             return ife;
  224.         }
  225.     }
  226.     public void setGeneratoreErrorePortaApplicativa(RicezioneBusteExternalErrorGenerator generatoreErrorePortaApplicativa) {
  227.         this.generatoreErrorePortaApplicativa = generatoreErrorePortaApplicativa;
  228.     }
  229.     public void setIntegrationFunctionErrorPortaApplicativa(IntegrationFunctionError integrationErrorPortaApplicativa) {
  230.         this._integrationFunctionErrorPortaApplicativa = integrationErrorPortaApplicativa;
  231.     }

  232.     public synchronized void initializeNodeSender(OpenSPCoop2Properties propertiesReader,Logger logCore) throws EJBUtilsException{
  233.         if(this.nodeSender!=null)
  234.             return; // inizializzato da un altro thread

  235.         // Inizializzazione NodeSender
  236.         String classTypeNodeSender = null;
  237.         try{
  238.             classTypeNodeSender = ClassNameProperties.getInstance().getNodeSender(propertiesReader.getNodeSender());
  239.             this.nodeSender = (INodeSender) Loader.getInstance().newInstance(classTypeNodeSender);
  240.             AbstractCore.init(this.nodeSender, this.pddContext, this.protocolFactory);
  241.             logCore.info("Inizializzazione gestore NodeSender di tipo "+classTypeNodeSender+" effettuata.");
  242.         }catch(Exception e){
  243.             throw new EJBUtilsException("Riscontrato errore durante il caricamento della classe ["+classTypeNodeSender+
  244.                     "] da utilizzare per la spedizione nell'infrastruttura: "+e.getMessage());
  245.         }
  246.     }

  247.     public INodeSender getNodeSender(OpenSPCoop2Properties propertiesReader,Logger log)throws EJBUtilsException{
  248.         if(this.nodeSender==null)
  249.             this.initializeNodeSender(propertiesReader, log);
  250.         return this.nodeSender;
  251.     }



  252.     /**
  253.      * Costruttore
  254.      *
  255.      * @param identitaPdD Codice del dominio che sta gestendo la richiesta.
  256.      * @param aIDModulo Identificativo del Sender.
  257.      * @param idSessione Identificativo generato per la richiesta ed utilizzato per collegare la gestione del servizio richiesto,
  258.      *        tra i vari nodi dell'infrastruttura openspcoop (serve per la spedizione verso altri moduli).
  259.      * @param idMessage Identificativo del messaggio in gestione
  260.      *        (questo id coincide con l'id della sessione nella richiesta ma non nella risposta)
  261.      * @param tipo di Messaggio (INBOX/OUTBOX)
  262.      * @param openspcoop_state
  263.      *
  264.      */
  265.     public EJBUtils(IDSoggetto identitaPdD,TipoPdD tipoPdD,String aIDModulo,String idSessione,
  266.             String idMessage,String tipo, IOpenSPCoopState openspcoop_state ,MsgDiagnostico msgDiag,boolean functionAsRouter,
  267.             String implementazionePdDSoggettoMittente, String implementazionePdDSoggettoDestinatario,
  268.             String profiloGestione,PdDContext pddContext) throws EJBUtilsException {
  269.         this.identitaPdD = identitaPdD;
  270.         this.tipoPdD = tipoPdD;
  271.         this.idModulo = aIDModulo;
  272.         this.idSessione = idSessione;
  273.         this.idMessage = idMessage;
  274.         this.tipo = tipo;
  275.         this.openSPCoopState = openspcoop_state;
  276.         this.functionAsRouter = functionAsRouter;
  277.         this.log = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
  278.         if(this.log==null){
  279.             this.log = LoggerWrapperFactory.getLogger(EJBUtils.class);
  280.         }
  281.         this.msgDiag = msgDiag;
  282.         this.propertiesReader = OpenSPCoop2Properties.getInstance();
  283.         if(openspcoop_state==null)
  284.             this.configurazionePdDReader = ConfigurazionePdDManager.getInstance();
  285.         else
  286.             this.configurazionePdDReader = ConfigurazionePdDManager.getInstance(openspcoop_state.getStatoRichiesta(),openspcoop_state.getStatoRisposta());

  287.         this.implementazionePdDSoggettoMittente = implementazionePdDSoggettoMittente;
  288.         this.implementazionePdDSoggettoDestinatario = implementazionePdDSoggettoDestinatario;
  289.        
  290.         this.pddContext = pddContext;
  291.        
  292.         try{
  293.             this.protocolFactory = ProtocolFactoryManager.getInstance().getProtocolFactoryByName((String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME));
  294.             this.protocolManager = this.protocolFactory.createProtocolVersionManager(profiloGestione);
  295.             this.dettaglioBuilder = new DettaglioEccezioneOpenSPCoop2Builder(this.log, this.protocolFactory);
  296.         }catch(Exception e){
  297.             throw new EJBUtilsException(e.getMessage(),e);
  298.         }
  299.        
  300.         // richiede all'interno pddContext e protocolFactory
  301.         this.initializeNodeSender(this.propertiesReader, this.log);
  302.        
  303.     }
  304.     public void setIdMessage(String idMessage) {
  305.         this.idMessage = idMessage;
  306.     }

  307.     private void setEJBSuffixFunctionName(){
  308.         if(this.msgDiag!=null){
  309.             this.oldFunctionName = this.msgDiag.getFunzione();
  310.             this.msgDiag.setFunzione(this.msgDiag.getFunzione()+".EJBUtils");
  311.         }
  312.     }
  313.     private void unsetEJBSuffixFunctionName(){
  314.         if(this.msgDiag!=null && this.oldFunctionName!=null){
  315.             this.msgDiag.setFunzione(this.oldFunctionName);
  316.         }
  317.     }


  318.     /**
  319.      * Aggiorna openspcoop_state
  320.      *
  321.      *
  322.      *
  323.      */
  324.     public void updateOpenSPCoopState(IOpenSPCoopState openSPCoopState){
  325.         this.openSPCoopState = openSPCoopState;
  326.     }


  327.     /**
  328.      * Imposta l'identificativo di Sessione
  329.      *
  330.      * @param id identificativo di Sessione
  331.      *
  332.      */
  333.     public void updateIdSessione(String id){
  334.         this.idSessione = id;
  335.     }
  336.     /**
  337.      * Imposta l'utilizzo della reply su una nuova connessione.
  338.      *
  339.      * @param replyOnNewConnection Utilizzo della reply su una nuova connessione.
  340.      *
  341.      */
  342.     public void setReplyOnNewConnection(boolean replyOnNewConnection) {
  343.         this.replyOnNewConnection = replyOnNewConnection;
  344.     }
  345.     /**
  346.      * Imposta l'utilizzo di un eventuale indirizzo telematico.
  347.      *
  348.      * @param utilizzoIndirizzoTelematico utilizzo di un eventuale indirizzo telematico.
  349.      *
  350.      */
  351.     public void setUtilizzoIndirizzoTelematico(boolean utilizzoIndirizzoTelematico) {
  352.         this.utilizzoIndirizzoTelematico = utilizzoIndirizzoTelematico;
  353.     }














  354.     /** ------------------- Metodi utilizzati per rilasciare le risorse con errore all'interno dell'EJB ---------------- */    

  355.     /*  Tutti questi metodi lavorano senza il riferimento all' ctxEJB perche' il rollback JMS viene delegato al chiamante
  356.      * */
  357.     public void rollbackMessage(String motivoRollbackEJB, EsitoLib esito){

  358.         this.setEJBSuffixFunctionName();
  359.         try{

  360.             // Imposto Motivo dell'errore
  361.             GestoreMessaggi msg = new GestoreMessaggi(this.openSPCoopState, true, this.idMessage,this.tipo,this.msgDiag,this.pddContext);
  362.             msg.setOneWayVersione11(this.oneWayVersione11);
  363.             msg.aggiornaErroreProcessamentoMessaggio(motivoRollbackEJB, null);

  364.             esito.setErroreProcessamentoMessaggioAggiornato(true);
  365.            
  366.         }catch(Exception e){

  367.             this.msgDiag.logErroreGenerico(e, "EJBUtils.rollbackMessage(motivoRollbackEJB)");

  368.         }finally{
  369.             this.unsetEJBSuffixFunctionName();
  370.         }
  371.     }

  372.     public void rollbackMessage(String motivoRollbackEJB, String servizioApplicativo, EsitoLib esito){
  373.         rollbackMessage(motivoRollbackEJB, servizioApplicativo, esito, true);
  374.     }
  375.     public void rollbackMessage(String motivoRollbackEJB, String servizioApplicativo, EsitoLib esito, boolean throwExceptionConnectionNull){

  376.         this.setEJBSuffixFunctionName();
  377.         try{

  378.             // Imposto Motivo dell'errore - lavora sempre sulla richiesta
  379.             GestoreMessaggi msg = new GestoreMessaggi(this.openSPCoopState, true ,this.idMessage,this.tipo,this.msgDiag,this.pddContext);
  380.             msg.setOneWayVersione11(this.oneWayVersione11);
  381.             msg.aggiornaErroreProcessamentoMessaggio(motivoRollbackEJB, servizioApplicativo, throwExceptionConnectionNull);

  382.             esito.setErroreProcessamentoMessaggioAggiornato(true);
  383.            
  384.         }catch(Exception e){

  385.             this.msgDiag.logErroreGenerico(e, "EJBUtils.rollbackMessage(motivoRollbackEJB,servizioApplicativo)");

  386.         }finally{
  387.             this.unsetEJBSuffixFunctionName();
  388.         }
  389.     }

  390.     public void rollbackMessage(String motivoRollbackEJB, Timestamp dataRiconsegna, String servizioApplicativo, EsitoLib esito){

  391.         this.setEJBSuffixFunctionName();
  392.         try{

  393.             // Imposto Motivo dell'errore
  394.             GestoreMessaggi msg = new GestoreMessaggi(this.openSPCoopState, true, this.idMessage,this.tipo,this.msgDiag,this.pddContext);
  395.             msg.setOneWayVersione11(this.oneWayVersione11);
  396.             msg.aggiornaErroreProcessamentoMessaggio(motivoRollbackEJB, servizioApplicativo);

  397.             esito.setErroreProcessamentoMessaggioAggiornato(true);
  398.            
  399.             if(dataRiconsegna!=null){
  400.                 msg.aggiornaDataRispedizione(dataRiconsegna,servizioApplicativo);
  401.                
  402.                 esito.setDataRispedizioneAggiornata(dataRiconsegna);
  403.             }

  404.         }catch(Exception e){

  405.             this.msgDiag.logErroreGenerico(e, "EJBUtils.rollbackMessage(motivoRollbackEJB,dataRiconsegna,servizioApplicativo)");

  406.         }finally{
  407.             this.unsetEJBSuffixFunctionName();
  408.         }
  409.     }


  410.     public void rollbackMessage(String motivoRollbackEJB, Timestamp dataRiconsegna, EsitoLib esito){

  411.         this.setEJBSuffixFunctionName();
  412.         try{

  413.             // Imposto Motivo dell'errore
  414.             GestoreMessaggi msg = new GestoreMessaggi(this.openSPCoopState, true, this.idMessage,this.tipo,this.msgDiag,this.pddContext);
  415.             msg.setOneWayVersione11(this.oneWayVersione11);
  416.             msg.aggiornaErroreProcessamentoMessaggio(motivoRollbackEJB, null);

  417.             esito.setErroreProcessamentoMessaggioAggiornato(true);
  418.            
  419.             if(dataRiconsegna!=null){
  420.                 msg.aggiornaDataRispedizione(dataRiconsegna,null);
  421.                
  422.                 esito.setDataRispedizioneAggiornata(dataRiconsegna);
  423.             }

  424.         }catch(Exception e){

  425.             this.msgDiag.logErroreGenerico(e, "EJBUtils.rollbackMessage(motivoRollbackEJB,dataRiconsegna)");

  426.         }finally{
  427.             this.unsetEJBSuffixFunctionName();
  428.         }
  429.     }

  430.     /**
  431.      * Rappresenta una situazione in cui un EJB deve mantenere in coda il messaggio che ha provato a gestire, a causa di errori
  432.      *
  433.      * @param motivoRollbackEJB Motivo dell'errore che ha causato il Rollback sull'EJB
  434.      *
  435.      */
  436.     public void updateErroreProcessamentoMessage(String motivoRollbackEJB, EsitoLib esito){
  437.         updateErroreProcessamentoMessage(motivoRollbackEJB,null,esito);
  438.     }
  439.     /**
  440.      * Rappresenta una situazione in cui un EJB deve mantenere in coda il messaggio che ha provato a gestire, a causa di errori
  441.      *
  442.      * @param motivoRollbackEJB Motivo dell'errore che ha causato il Rollback sull'EJB
  443.      * @param dataRispedizione Data per la rispedizione del msg
  444.      *
  445.      */
  446.     public void updateErroreProcessamentoMessage(String motivoRollbackEJB, java.sql.Timestamp dataRispedizione, EsitoLib esito){

  447.         this.setEJBSuffixFunctionName();
  448.         try{

  449.             // Imposto Motivo dell'errore
  450.             GestoreMessaggi msg = new GestoreMessaggi(this.openSPCoopState, true, this.idMessage,this.tipo,this.msgDiag,this.pddContext);
  451.             msg.setOneWayVersione11(this.oneWayVersione11);
  452.             msg.aggiornaErroreProcessamentoMessaggio(motivoRollbackEJB,null);
  453.            
  454.             esito.setErroreProcessamentoMessaggioAggiornato(true);
  455.            
  456.             if(dataRispedizione!=null){
  457.                 msg.aggiornaDataRispedizione(dataRispedizione,null);
  458.                
  459.                 esito.setDataRispedizioneAggiornata(dataRispedizione);  
  460.             }

  461.         }catch(Exception e){

  462.             this.msgDiag.logErroreGenerico(e, "EJBUtils.updateErroreProcessamentoMessage");

  463.         }finally{
  464.             this.unsetEJBSuffixFunctionName();
  465.         }
  466.     }









  467.     /** ------------------- Metodi utilizzati per rilasciare le risorse all'interno dell'EJB ---------------- */    



  468.     /**
  469.      * Rilascia un messaggio precedentemente salvato, e
  470.      * effettua anche un rollback di un OutBox Message utilizzando l'id del Messaggio
  471.      *
  472.      *
  473.      */
  474.     public void releaseOutboxMessage(boolean isMessaggioRichiesta) throws EJBUtilsException{
  475.         releaseMessage(true,false,null,null,true, isMessaggioRichiesta);
  476.     }

  477.     /**
  478.      * Rilascia un messaggio precedentemente salvato, e
  479.      * effettua anche un rollback di un OutBox Message utilizzando l'id del Messaggio
  480.      *
  481.      *
  482.      */
  483.     public void releaseOutboxMessage(boolean cleanHistory, boolean isMessaggioRichiesta) throws EJBUtilsException{
  484.         releaseMessage(true,false,null,null,cleanHistory, isMessaggioRichiesta);
  485.     }

  486.     /**
  487.      * Rilascia un messaggio precedentemente salvato,
  488.      * e effettua anche un rollback di un OutBox Message utilizzando l'id del Messaggio
  489.      * Inoltre effettua anche un rollback di un Outbox/Inbox Message (tipoRiferimentoMessaggio) utilizzando il riferimentoMessaggio
  490.      *
  491.      * @param tipo Tipo di Messaggio su cui effettuare il Rollback
  492.      * @param id Identificativo del Messaggio su cui effettuare il Rollback
  493.      *
  494.      */
  495.     public void releaseOutboxMessage(String tipo,String id, boolean isMessaggioRichiesta) throws EJBUtilsException{
  496.         if(Costanti.INBOX.equals(tipo)==false && Costanti.OUTBOX.equals(tipo)==false)
  497.             throw new EJBUtilsException("EJBUtils.releaseOutboxMessage error: Tipo di Messaggio non definito");
  498.         if(id ==null)
  499.             throw new EJBUtilsException("EJBUtils.releaseOutboxMessage error: ID Messaggio non definito");
  500.         releaseMessage(true,false,tipo,id,true, isMessaggioRichiesta);
  501.     }

  502.     /**
  503.      * Rilascia un messaggio precedentemente salvato, e
  504.      * effettua anche un rollback di un InBox Message utilizzando l'id del Messaggio
  505.      *
  506.      *
  507.      */
  508.     public void releaseInboxMessage(boolean isMessaggioRichiesta) throws EJBUtilsException{
  509.         releaseMessage(false,true,null,null,true, isMessaggioRichiesta);
  510.     }

  511.     /**
  512.      * Rilascia un messaggio precedentemente salvato, e
  513.      * effettua anche un rollback di un InBox Message utilizzando l'id del Messaggio
  514.      *
  515.      *
  516.      */
  517.     public void releaseInboxMessage(boolean cleanHistory, boolean isMessaggioRichiesta) throws EJBUtilsException{
  518.         releaseMessage(false,true,null,null,cleanHistory, isMessaggioRichiesta);
  519.     }

  520.     /**
  521.      * Rilascia un messaggio precedentemente salvato,
  522.      * e effettua anche un rollback di un OutBox Message utilizzando l'id del Messaggio
  523.      * Inoltre effettua anche un rollback di un Outbox/Inbox Message (tipoRiferimentoMessaggio) utilizzando il riferimentoMessaggio
  524.      *
  525.      * @param tipo Tipo di Messaggio su cui effettuare il Rollback
  526.      * @param id Identificativo del Messaggio su cui effettuare il Rollback
  527.      *
  528.      */
  529.     public void releaseInboxMessage(String tipo,String id, boolean isMessaggioRichiesta) throws EJBUtilsException{
  530.         if(Costanti.INBOX.equals(tipo)==false && Costanti.OUTBOX.equals(tipo)==false)
  531.             throw new EJBUtilsException("EJBUtils.releaseOutboxMessage error: Tipo di Messaggio non definito");
  532.         if(id ==null)
  533.             throw new EJBUtilsException("EJBUtils.releaseOutboxMessage error: ID Messaggio non definito");
  534.         releaseMessage(false,true,tipo,id,true, isMessaggioRichiesta);
  535.     }

  536.     /**
  537.      * Rilascia un messaggio precedentemente salvato, e se richiesto effettua anche un rollback
  538.      *
  539.      * @param rollbackOutbox indicazione se effettuare un Rollback di un OutBox Message
  540.      * @param rollbackInbox indicazione se effettuare un Rollback di un InBox Message
  541.      * @param tipo Tipo di Messaggio su cui effettuare il Rollback
  542.      * @param id Identificativo del Messaggio su cui effettuare il Rollback
  543.      *
  544.      */
  545.     private void releaseMessage(boolean rollbackOutbox,boolean rollbackInbox,String tipo,String id,boolean cleanHistory, boolean isMessaggioRichiesta) throws EJBUtilsException{

  546.         StateMessage stateMSG = (isMessaggioRichiesta) ? (StateMessage) this.openSPCoopState.getStatoRichiesta()
  547.                 : (StateMessage) this.openSPCoopState.getStatoRisposta();  

  548.         if (stateMSG instanceof StatelessMessage && !this.oneWayVersione11){
  549.             return;
  550.         }
  551.        
  552.         RollbackRepositoryBuste rollbackBuste = null;
  553.         RollbackRepositoryBuste rollbackBusteRifMessaggio = null;
  554.         GestoreMessaggi msg = null;
  555.         try{

  556.             /* ------- Gestione Msg --------------- */

  557.             // Rollback del messaggio
  558.             if(rollbackOutbox){
  559.                 rollbackBuste = new RollbackRepositoryBuste(this.idMessage, stateMSG, this.oneWayVersione11);
  560.                 rollbackBuste.rollbackBustaIntoOutBox(cleanHistory);
  561.             }else if(rollbackInbox){
  562.                 rollbackBuste = new RollbackRepositoryBuste(this.idMessage, stateMSG, this.oneWayVersione11);
  563.                 rollbackBuste.rollbackBustaIntoInBox(cleanHistory);
  564.             }

  565.             // Rollback sul RiferimentoMessaggio
  566.             if(tipo!=null && id!=null){
  567.                 rollbackBusteRifMessaggio = new RollbackRepositoryBuste(id, stateMSG, this.oneWayVersione11);
  568.                 if(Costanti.OUTBOX.equals(tipo))
  569.                     rollbackBusteRifMessaggio.rollbackBustaIntoOutBox();
  570.                 else
  571.                     rollbackBusteRifMessaggio.rollbackBustaIntoInBox();    
  572.             }

  573.             // Imposto ProprietarioMessaggioRichiesta per eliminazione
  574.             msg = new GestoreMessaggi(this.openSPCoopState, true, this.idMessage,this.tipo,this.msgDiag,this.pddContext);
  575.             msg.setOneWayVersione11(this.oneWayVersione11);
  576.             msg.aggiornaProprietarioMessaggio(TimerGestoreMessaggi.ID_MODULO);

  577.             /* ------ Commit delle modifiche ------ */
  578.             this.openSPCoopState.commit();

  579.             // Aggiornamento cache proprietario messaggio
  580.             String idBustaRichiestaCorrelata = null;
  581.             if(this.idMessage.equals(this.idSessione)==false)
  582.                 idBustaRichiestaCorrelata = this.idSessione;
  583.             msg.addProprietariIntoCache_readFromTable("EJBUtils."+this.idModulo, "releaseMessage",idBustaRichiestaCorrelata,this.functionAsRouter);

  584.         }catch (Exception e) {  
  585.             stateMSG.closePreparedStatement();
  586.             // Rilancio l'eccezione
  587.             throw new EJBUtilsException("EJBUtils.releaseMessage error: "+e.getMessage(),e);
  588.         }  
  589.     }





  590.     /** ------------------- Metodi per la spedizione di risposte Applicative Errore---------------- */

  591.     /**
  592.      * Spedisce un Messaggio di risposta Applicativo  al modulo di openspcoop che gli compete.
  593.      * La spedizione viene naturalmente effettuata solo se l'idModuloInAttesa nella richiesta delegata e' diverso da null
  594.      * o se e' stata definita una ricezione di contenuti asincroni.
  595.      *
  596.      * @param responseMessageError Message di errore applicativo
  597.      * @param richiestaDelegata Dati che caratterizzano la richiesta.
  598.      *
  599.      */
  600.     public void sendRispostaApplicativaErrore(OpenSPCoop2Message responseMessageError,
  601.             RichiestaDelegata richiestaDelegata,
  602.             PortaDelegata pd,ServizioApplicativo sa)throws EJBUtilsException{
  603.         sendRispostaApplicativaErrore(responseMessageError,richiestaDelegata,true,pd,sa);
  604.     }

  605.     /**
  606.      * Spedisce un Messaggio di risposta Applicativo  al modulo di openspcoop che gli compete.
  607.      * La spedizione viene naturalmente effettuata solo se l'idModuloInAttesa nella richiesta delegata e' diverso da null
  608.      * o se e' stata definita una ricezione di contenuti asincroni.
  609.      *
  610.      * @param responseMessageError Message di errore applicativo
  611.      * @param richiestaDelegata Dati che caratterizzano la richiesta.
  612.      * @param rollbackRichiesta Indicazione se effettuare il rollback della richiesta
  613.      *
  614.      */
  615.     public void sendRispostaApplicativaErrore(OpenSPCoop2Message responseMessageError,
  616.             RichiestaDelegata richiestaDelegata,boolean rollbackRichiesta,
  617.             PortaDelegata pd,ServizioApplicativo sa) throws EJBUtilsException{

  618.         String idTransazione = (String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  619.        
  620.         if (this.openSPCoopState instanceof OpenSPCoopStateless)
  621.             ((OpenSPCoopStateless)this.openSPCoopState).setRispostaMsg(responseMessageError);

  622.         StateMessage statoRichiesta = (StateMessage) this.openSPCoopState.getStatoRichiesta();
  623.         StateMessage statoRisposta = (StateMessage) this.openSPCoopState.getStatoRisposta();

  624.         String correlazioneApplicativa = null;
  625.         if(richiestaDelegata!=null)
  626.             correlazioneApplicativa = richiestaDelegata.getIdCorrelazioneApplicativa();
  627.        
  628.         String correlazioneApplicativaRisposta = null;
  629.         if(richiestaDelegata!=null)
  630.             correlazioneApplicativaRisposta = richiestaDelegata.getIdCorrelazioneApplicativaRisposta();
  631.        
  632.         String nomePorta = null;
  633.         if(richiestaDelegata!=null && richiestaDelegata.getIdPortaDelegata()!=null)
  634.             nomePorta = richiestaDelegata.getIdPortaDelegata().getNome();
  635.        
  636.         RollbackRepositoryBuste rollbackBuste = null;
  637.         RollbackRepositoryBuste rollbackBusteRifMessaggio = null;
  638.         GestoreMessaggi msgRequest = null;
  639.         GestoreMessaggi msgResponse = null;
  640.         GestoreMessaggi msgSbloccoRicezioneContenutiApplicativi = null; // Evenutuale sblocco se presente ricezioneContenutiApplicativi per profili oneway/sincroni

  641.         if(richiestaDelegata==null) {
  642.             throw new EJBUtilsException("Param richiestaDelegata is null");
  643.         }
  644.        
  645.         // Aggiungo costante servizio applicativo
  646.         this.msgDiag.addKeyword(CostantiPdD.KEY_SA_EROGATORE, richiestaDelegata.getServizioApplicativo());
  647.        
  648.         this.setEJBSuffixFunctionName();
  649.         try{


  650.             /* ------- Raccolta dati ------ */
  651.             String idModuloInAttesa = richiestaDelegata.getIdModuloInAttesa();


  652.             /* IMPOSTATA A FALSE IN AUTOMATICO PER FAR TORNARE GLI ERRORI SEMPRE SULLA SOLITA CONNESSIONE */
  653.             // Se riservira' basta scommentare la riga sottostante.
  654.             //boolean consegnaRispostaAsincrona = richiestaDelegata.getUtilizzoConsegnaAsincrona() &&  this.configurazionePdDReader.existsConsegnaRispostaAsincrona(richiestaDelegata);
  655.             boolean consegnaRispostaAsincrona = false;


  656.             /* ------- Gestione MsgRichiesta --------------- */


  657.             // RollbackApplicativo elimino tutti gli accessi.
  658.             // (uso l'ID della sessione, poiche' tutti i dati 'protocollo' sono salvati con l'ID della richiesta e non della risposta)
  659.             // Il rollback della richiesta serve in caso di errori.
  660.             if(rollbackRichiesta){
  661.                 rollbackBusteRifMessaggio = new RollbackRepositoryBuste(this.idSessione, statoRichiesta, this.oneWayVersione11);
  662.                 rollbackBusteRifMessaggio.rollbackBustaIntoOutBox(this.rollbackRichiestaInCasoErrore_rollbackHistory);
  663.             }else{
  664.                 // se sono in un flusso di richiesta (imbustamento/inoltroBuste devo cmq eliminare l'accesso da pdd)
  665.                 rollbackBusteRifMessaggio = new RollbackRepositoryBuste(this.idSessione, statoRichiesta, this.oneWayVersione11);
  666.                 rollbackBusteRifMessaggio.clearAccessiIntoOutBox(false,false,true);
  667.             }

  668.             if(this.idSessione.equals(this.idMessage)==false){
  669.                 // Siamo in SbustamentoRisposte...
  670.                 // Rollback del messaggio di risposta
  671.                 rollbackBuste = new RollbackRepositoryBuste(this.idMessage, statoRichiesta, this.oneWayVersione11);
  672.                 rollbackBuste.rollbackBustaIntoInBox();
  673.             }

  674.             // Imposto ProprietarioMessaggioRichiesta per eliminazione
  675.             msgRequest = new GestoreMessaggi(this.openSPCoopState, true , this.idMessage,this.tipo,this.msgDiag,this.pddContext);
  676.             msgRequest.setOneWayVersione11(this.oneWayVersione11);
  677.             msgRequest.aggiornaProprietarioMessaggio(TimerGestoreMessaggi.ID_MODULO);








  678.             /* ------- Gestione MsgRisposta --------------- */


  679.             // Creo stato di risposta
  680.             String idRisposta = null;
  681.             if( (consegnaRispostaAsincrona) || (idModuloInAttesa != null) ){

  682.                 // --- Creo lo stato del messaggio,visto che sto' spedendo una risposta generata da OpenSPCoop,
  683.                 // creando anche un IDResponse)
  684.                 Imbustamento imbustatore = new Imbustamento(this.log,this.protocolFactory, this.openSPCoopState.getStatoRichiesta());

  685.                 idRisposta =
  686.                     imbustatore.buildID(this.identitaPdD, idTransazione,
  687.                             this.propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  688.                             this.propertiesReader.getGestioneSerializableDBCheckInterval(),
  689.                             RuoloMessaggio.RISPOSTA);
  690.                 if(idRisposta == null){
  691.                     throw new Exception("Identificativo non costruito.");
  692.                 }  

  693.                 // oraRegistrazione
  694.                 Timestamp oraRegistrazioneMessaggio = DateManager.getTimestamp();

  695.                 msgResponse = new GestoreMessaggi(this.openSPCoopState, false, idRisposta,Costanti.INBOX,this.msgDiag,this.pddContext);
  696.                 msgResponse.registraMessaggio(responseMessageError,oraRegistrazioneMessaggio, saveMessageStateless(pd),
  697.                         correlazioneApplicativa,correlazioneApplicativaRisposta);
  698.                 msgResponse.aggiornaRiferimentoMessaggio(this.idSessione);
  699.                
  700.                 // --- Aggiorno Proprietario
  701.                 if( consegnaRispostaAsincrona ){
  702.                     // Aggiorno proprietario Messaggio, consegna asincrona: CONSEGNA_BUSTE_SOAP
  703.                     msgResponse.aggiornaProprietarioMessaggio(ConsegnaContenutiApplicativi.ID_MODULO);
  704.                 }else{
  705.                     if(idModuloInAttesa != null){
  706.                         // Aggiorno proprietario Messaggio, consegna sincrona: ACCETTAZIONEXXX
  707.                         msgResponse.aggiornaProprietarioMessaggio(idModuloInAttesa);
  708.                     }
  709.                 }

  710.                 // --- Lettura dati di configurazione
  711.                 boolean servizioApplicativoConConnettore = false;
  712.                 boolean getMessageAbilitato = false;
  713.                 boolean sbustamentoSoap = false;
  714.                 boolean sbustamentoInformazioniProtocollo = true;
  715.                 try{
  716.                     servizioApplicativoConConnettore = this.configurazionePdDReader.consegnaRispostaAsincronaConConnettore(sa);
  717.                     getMessageAbilitato = this.configurazionePdDReader.consegnaRispostaAsincronaConGetMessage(sa);
  718.                     sbustamentoSoap = this.configurazionePdDReader.consegnaRispostaAsincronaConSbustamento(sa);
  719.                     sbustamentoInformazioniProtocollo = this.configurazionePdDReader.consegnaRispostaAsincronaConSbustamentoInformazioniProtocollo(sa);
  720.                 }catch(DriverConfigurazioneNotFound de){}

  721.                 if( (getMessageAbilitato==false) && (servizioApplicativoConConnettore==false) && (idModuloInAttesa==null)){
  722.                     this.msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"consegnaNonDefinita");
  723.                     return;
  724.                 }

  725.                 String tipoConsegna = GestoreMessaggi.CONSEGNA_TRAMITE_INTEGRATION_MANAGER;

  726.                 // --- Spedizione al successivo modulo
  727.                 if( consegnaRispostaAsincrona ){
  728.                     if(servizioApplicativoConConnettore){
  729.                         // spedizione al modulo ConsegnaContenutiApplicativi
  730.                         richiestaDelegata.setScenario(Costanti.SCENARIO_CONSEGNA_CONTENUTI_APPLICATIVI);
  731.                         sendToConsegnaContenutiApplicativi_rispostaConsegnataModalitaAsincrona(richiestaDelegata,idRisposta, msgResponse);
  732.                         tipoConsegna = GestoreMessaggi.CONSEGNA_TRAMITE_CONNETTORE;
  733.                     }else{
  734.                         this.msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"integrationManager.messaggioDisponibile");
  735.                     }
  736.                 }else{
  737.                     if(idModuloInAttesa != null){
  738.                         // spedizione al modulo RicezioneContenutiApplicativiXXX
  739.                         sendToRicezioneContenutiApplicativi(idModuloInAttesa,idRisposta,
  740.                                 richiestaDelegata.getIdCollaborazione(),
  741.                                 richiestaDelegata.getProfiloCollaborazione(),richiestaDelegata.getProfiloCollaborazioneValue());
  742.                         tipoConsegna = GestoreMessaggi.CONSEGNA_TRAMITE_CONNECTION_REPLY;
  743.                     }
  744.                 }

  745.                 // ---- Registra SIL Destinatario del Messaggio
  746.                 msgResponse.registraDestinatarioMessaggio(richiestaDelegata.getServizioApplicativo(),
  747.                         sbustamentoSoap,sbustamentoInformazioniProtocollo,getMessageAbilitato,tipoConsegna,oraRegistrazioneMessaggio,
  748.                         nomePorta, false, false,
  749.                         null, null, false);

  750.             } // end Gestione Risposta

  751.             /* ------- Gestione msgSbloccoRicezioneContenutiApplicativi --------------- */
  752.             String idSbloccoRicezioneContenutiApplicativi = null;
  753.             if(consegnaRispostaAsincrona && idModuloInAttesa != null){
  754.                 //  Creo stato per msgSbloccoRicezioneContenutiApplicativi
  755.                 Imbustamento imbustatore = new Imbustamento(this.log,this.protocolFactory, this.openSPCoopState.getStatoRichiesta());
  756.                 idSbloccoRicezioneContenutiApplicativi=
  757.                     imbustatore.buildID(this.identitaPdD, idTransazione,
  758.                             this.propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  759.                             this.propertiesReader.getGestioneSerializableDBCheckInterval(),
  760.                             RuoloMessaggio.RISPOSTA);
  761.                 if(idSbloccoRicezioneContenutiApplicativi == null){
  762.                     throw new Exception("Identificativo non costruito.");
  763.                 }  
  764.                 msgSbloccoRicezioneContenutiApplicativi = new GestoreMessaggi( this.openSPCoopState, false, idSbloccoRicezioneContenutiApplicativi,Costanti.INBOX,this.msgDiag,this.pddContext);
  765.                 if(this.protocolManager.isHttpEmptyResponseOneWay())
  766.                     msgSbloccoRicezioneContenutiApplicativi.registraMessaggio(MessageUtilities.buildEmptyMessage(responseMessageError.getFactory(), responseMessageError.getMessageType(), MessageRole.RESPONSE),correlazioneApplicativa,correlazioneApplicativaRisposta);
  767.                 else
  768.                     msgSbloccoRicezioneContenutiApplicativi.registraMessaggio(this.buildOpenSPCoopOK(responseMessageError.getMessageType(),this.idSessione),correlazioneApplicativa,correlazioneApplicativaRisposta);
  769.                 msgSbloccoRicezioneContenutiApplicativi.aggiornaRiferimentoMessaggio(this.idSessione);
  770.                 //  --- Aggiorno Proprietario
  771.                 msgSbloccoRicezioneContenutiApplicativi.aggiornaProprietarioMessaggio(idModuloInAttesa);
  772.                 //  --- Spedizione al modulo RicezioneContenutiApplicativiXXX
  773.                 sendToRicezioneContenutiApplicativi(idModuloInAttesa,idSbloccoRicezioneContenutiApplicativi,
  774.                         richiestaDelegata.getIdCollaborazione(),
  775.                         richiestaDelegata.getProfiloCollaborazione(),richiestaDelegata.getProfiloCollaborazioneValue());
  776.             }


  777.             /* ------ Commit/Close connessione al DB ------ */
  778.             this.openSPCoopState.commit();

  779.             // Aggiornamento cache messaggio
  780.             if(msgSbloccoRicezioneContenutiApplicativi !=null)
  781.                 msgSbloccoRicezioneContenutiApplicativi.addMessaggiIntoCache_readFromTable(this.idModulo, "sendRispostaApplicativaErrore [sblocco]");
  782.             if(msgResponse !=null)
  783.                 msgResponse.addMessaggiIntoCache_readFromTable(this.idModulo, "sendRispostaApplicativaErrore [risposta]");

  784.             // Aggiornamento cache proprietario messaggio
  785.             if(msgRequest!=null){
  786.                 String idRichiestaCorrelata = null;
  787.                 if(this.idMessage.equals(this.idSessione)==false)
  788.                     idRichiestaCorrelata = this.idSessione;
  789.                 msgRequest.addProprietariIntoCache_readFromTable(this.idModulo, "sendRispostaApplicativaErrore [richiesta]",idRichiestaCorrelata,this.functionAsRouter);
  790.             }
  791.             if(msgSbloccoRicezioneContenutiApplicativi !=null)
  792.                 msgSbloccoRicezioneContenutiApplicativi.addProprietariIntoCache_readFromTable(this.idModulo, "sendRispostaApplicativaErrore [sblocco]",this.idSessione,this.functionAsRouter);
  793.             if(msgResponse !=null)
  794.                 msgResponse.addProprietariIntoCache_readFromTable(this.idModulo, "sendRispostaApplicativaErrore [risposta]",this.idSessione,this.functionAsRouter);

  795.         }catch (Exception e) {  
  796.             this.msgDiag.logErroreGenerico(e, "EJBUtils.sendRispostaApplicativaErrore");
  797.             statoRichiesta.closePreparedStatement();
  798.             statoRisposta.closePreparedStatement();
  799.             throw new EJBUtilsException("EJBUtils.sendRispostaApplicativaErrore error: "+e.getMessage(),e);
  800.         }
  801.         finally{
  802.             this.unsetEJBSuffixFunctionName();
  803.         }  
  804.     }
















  805.     /** ------------------- Metodi per la spedizione di risposte Applicative ---------------- */

  806.     /**
  807.      * Spedisce un Messaggio di risposta Applicativo  al modulo di openspcoop che gli compete.
  808.      * La spedizione viene naturalmente effettuata solo se l'idModuloInAttesa nella richiesta delegata e' diverso da null
  809.      * o se e' stata definita una ricezione di contenuti asincroni.
  810.      *
  811.      * @param richiestaDelegata Dati che caratterizzano la richiesta.
  812.      *
  813.      */
  814.     public GestoreMessaggi sendRispostaApplicativa(RichiestaDelegata richiestaDelegata,
  815.             PortaDelegata pd,ServizioApplicativo sa)throws EJBUtilsException{
  816.         return sendRispostaApplicativa(null,richiestaDelegata,this.idMessage,pd,sa);
  817.     }


  818.     /**
  819.      * Spedisce un Messaggio di risposta Applicativo  al modulo di openspcoop che gli compete.
  820.      * La spedizione viene naturalmente effettuata solo se l'idModuloInAttesa nella richiesta delegata  e' diverso da null
  821.      * o se e' stata definita una ricezione di contenuti asincroni.
  822.      *
  823.      * @param msg Messaggio SOAP che contiene un messaggio di ok applicativo
  824.      * @param richiestaDelegata Dati che caratterizzano la richiesta.
  825.      *
  826.      */
  827.     public GestoreMessaggi sendRispostaApplicativaOK(OpenSPCoop2Message msg, RichiestaDelegata richiestaDelegata,
  828.             PortaDelegata pd,ServizioApplicativo sa)throws EJBUtilsException {
  829.         return sendRispostaApplicativa(msg,richiestaDelegata,null,pd,sa);
  830.     }

  831.     /**
  832.      * Spedisce un Messaggio di risposta Applicativo  al modulo di openspcoop che gli compete.
  833.      * La spedizione viene naturalmente effettuata solo se l'idModuloInAttesa nella richiesta delegata  e' diverso da null
  834.      * o se e' stata definita una ricezione di contenuti asincroni.
  835.      *
  836.      * @param msg Messaggio SOAP che contiene un messaggio di ok applicativo
  837.      * @param richiestaDelegata Dati che caratterizzano la richiesta.
  838.      * @param idModuloInAttesa identificativo del modulo 'RicezioneContenutiApplicativiXXX'.
  839.      * @param idBustaRisposta Identificativo del messaggio di risposta
  840.      * @return Messaggio di risposta
  841.      *
  842.      */
  843.     private GestoreMessaggi sendRispostaApplicativa(OpenSPCoop2Message msg, RichiestaDelegata richiestaDelegata, String idBustaRisposta,
  844.             PortaDelegata pd,ServizioApplicativo sa) throws EJBUtilsException{

  845.         String idTransazione = (String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  846.        
  847.         StateMessage statoRisposta = (StateMessage) this.openSPCoopState.getStatoRisposta();
  848.        
  849.         GestoreMessaggi msgResponse = null;
  850.         GestoreMessaggi msgSbloccoRicezioneContenutiApplicativi = null; // Evenutuale sblocco se presente ricezioneContenutiApplicativi per profili oneway/sincroni

  851.         String correlazioneApplicativa = null;
  852.         if(richiestaDelegata!=null)
  853.             correlazioneApplicativa = richiestaDelegata.getIdCorrelazioneApplicativa();
  854.        
  855.         String correlazioneApplicativaRisposta = null;
  856.         if(richiestaDelegata!=null)
  857.             correlazioneApplicativaRisposta = richiestaDelegata.getIdCorrelazioneApplicativaRisposta();
  858.        
  859.         String nomePorta = null;
  860.         if(richiestaDelegata!=null && richiestaDelegata.getIdPortaDelegata()!=null)
  861.             nomePorta = richiestaDelegata.getIdPortaDelegata().getNome();
  862.        
  863.         if(richiestaDelegata==null) {
  864.             throw new EJBUtilsException("Param richiestaDelegata is null");
  865.         }
  866.        
  867.         // Aggiungo costante servizio applicativo
  868.         this.msgDiag.addKeyword(CostantiPdD.KEY_SA_EROGATORE, richiestaDelegata.getServizioApplicativo());
  869.        
  870.         this.setEJBSuffixFunctionName();
  871.         try{

  872.             /* ------- Raccolta dati ------ */
  873.             String idModuloInAttesa = richiestaDelegata.getIdModuloInAttesa();
  874.             boolean existsConsegnaRispostaAsincrona = false;
  875.             try{
  876.                 existsConsegnaRispostaAsincrona = this.configurazionePdDReader.existsConsegnaRispostaAsincrona(sa);
  877.             }catch(DriverConfigurazioneNotFound de){}
  878.             boolean consegnaRispostaAsincrona = richiestaDelegata.getUtilizzoConsegnaAsincrona() &&  existsConsegnaRispostaAsincrona;


  879.             /* ------- Gestione MsgRisposta --------------- */
  880.             String idRisposta = idBustaRisposta;
  881.             if( (consegnaRispostaAsincrona) || (idModuloInAttesa != null) ){

  882.                 // oraRegistrazione
  883.                 Timestamp oraRegistrazioneMessaggio = DateManager.getTimestamp();

  884.                 // --- Creo lo stato del messaggio,se sto' spedendo una risposta generata da OpenSPCoop, creando anche un IDResponse)
  885.                 if(idRisposta == null){
  886.                     // Creo ID Risposta
  887.                    
  888.                     Imbustamento imbustatore = new Imbustamento(this.log,this.protocolFactory, this.openSPCoopState.getStatoRichiesta());
  889.                     idRisposta =
  890.                         imbustatore.buildID(this.identitaPdD, idTransazione,
  891.                                 this.propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  892.                                 this.propertiesReader.getGestioneSerializableDBCheckInterval(),
  893.                                 RuoloMessaggio.RISPOSTA);
  894.                     if(idRisposta == null){
  895.                         throw new Exception("Identificativo non costruito.");
  896.                     }  
  897.                     msgResponse = new GestoreMessaggi(this.openSPCoopState, false , idRisposta,Costanti.INBOX,this.msgDiag,this.pddContext);
  898.                     msgResponse.registraMessaggio(msg,oraRegistrazioneMessaggio, saveMessageStateless(pd),correlazioneApplicativa,correlazioneApplicativaRisposta);
  899.                 }else{
  900.                     // Carico lo stato di un messaggio, esistente
  901.                     msgResponse = new GestoreMessaggi(this.openSPCoopState, false ,idRisposta,Costanti.INBOX,this.msgDiag,this.pddContext);
  902.                     oraRegistrazioneMessaggio = msgResponse.getOraRegistrazioneMessaggio();
  903.                 }

  904.                 // --- Aggiorno informazioni sul messaggio
  905.                 msgResponse.aggiornaRiferimentoMessaggio(this.idSessione);

  906.                 // --- Aggiorno Proprietario
  907.                 if( consegnaRispostaAsincrona ){
  908.                     // Aggiorno proprietario Messaggio, consegna asincrona: CONSEGNA_BUSTE_SOAP
  909.                     msgResponse.aggiornaProprietarioMessaggio(ConsegnaContenutiApplicativi.ID_MODULO);
  910.                 }else{
  911.                     if(idModuloInAttesa != null){
  912.                         // Aggiorno proprietario Messaggio, consegna sincrona: ACCETTAZIONEXXX
  913.                         msgResponse.aggiornaProprietarioMessaggio(idModuloInAttesa);
  914.                     }
  915.                 }

  916.                 //  --- Lettura dati di configurazione
  917.                 boolean servizioApplicativoConConnettore = false;
  918.                 boolean getMessageAbilitato = false;
  919.                 boolean sbustamentoSoap = false;
  920.                 boolean sbustamentoInformazioniProtocollo = true;
  921.                 try{
  922.                     servizioApplicativoConConnettore = this.configurazionePdDReader.consegnaRispostaAsincronaConConnettore(sa);
  923.                     getMessageAbilitato = this.configurazionePdDReader.consegnaRispostaAsincronaConGetMessage(sa);
  924.                     sbustamentoSoap = this.configurazionePdDReader.consegnaRispostaAsincronaConSbustamento(sa);
  925.                     sbustamentoInformazioniProtocollo = this.configurazionePdDReader.consegnaRispostaAsincronaConSbustamentoInformazioniProtocollo(sa);
  926.                 }catch(DriverConfigurazioneNotFound de){}

  927.                 if( (getMessageAbilitato==false) && (servizioApplicativoConConnettore==false) && (idModuloInAttesa==null)){
  928.                     this.msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"consegnaNonDefinita");
  929.                     return msgResponse;
  930.                 }else if( (servizioApplicativoConConnettore==false) && (idModuloInAttesa==null)){
  931.                     this.msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"integrationManager.messaggioDisponibile");
  932.                 }

  933.                 String tipoConsegna = GestoreMessaggi.CONSEGNA_TRAMITE_INTEGRATION_MANAGER;


  934.                 // --- Spedizione al successivo modulo
  935.                 try{
  936.                     if( consegnaRispostaAsincrona ){
  937.                         if(servizioApplicativoConConnettore){
  938.                             // spedizione al modulo ConsegnaContenutiApplicativi
  939.                             richiestaDelegata.setScenario(Costanti.SCENARIO_CONSEGNA_CONTENUTI_APPLICATIVI);
  940.                             sendToConsegnaContenutiApplicativi_rispostaConsegnataModalitaAsincrona(richiestaDelegata,idRisposta, msgResponse);
  941.                             tipoConsegna=GestoreMessaggi.CONSEGNA_TRAMITE_CONNETTORE;
  942.                         }else{
  943.                             this.msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"integrationManager.messaggioDisponibile");
  944.                         }
  945.                     }else{
  946.                         if(idModuloInAttesa != null){
  947.                             // spedizione al modulo RicezioneContenutiApplicativiXXX
  948.                             sendToRicezioneContenutiApplicativi(idModuloInAttesa,idRisposta,
  949.                                     richiestaDelegata.getIdCollaborazione(),
  950.                                     richiestaDelegata.getProfiloCollaborazione(),richiestaDelegata.getProfiloCollaborazioneValue());
  951.                             tipoConsegna=GestoreMessaggi.CONSEGNA_TRAMITE_CONNECTION_REPLY;
  952.                         }
  953.                     }
  954.                 }catch(Exception e){
  955.                     throw e; // rilancio eccezione;
  956.                 }

  957.                 // --- Registra SIL Destinatario del Messaggio
  958.                 msgResponse.registraDestinatarioMessaggio(richiestaDelegata.getServizioApplicativo(),
  959.                         sbustamentoSoap,sbustamentoInformazioniProtocollo,getMessageAbilitato,tipoConsegna,oraRegistrazioneMessaggio,
  960.                         nomePorta, false, false,
  961.                         null, null, false);
  962.             } // end Gestione Risposta






  963.             /* ------- Gestione msgSbloccoRicezioneContenutiApplicativi --------------- */
  964.             if(consegnaRispostaAsincrona && idModuloInAttesa != null){
  965.                 //  Creo stato per msgSbloccoRicezioneContenutiApplicativi
  966.                 Imbustamento imbustatore = new Imbustamento(this.log,this.protocolFactory,this.openSPCoopState.getStatoRichiesta());
  967.                 String idSbloccoRicezioneContenutiApplicativi=
  968.                     imbustatore.buildID(this.identitaPdD, idTransazione,
  969.                             this.propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  970.                             this.propertiesReader.getGestioneSerializableDBCheckInterval(),
  971.                             RuoloMessaggio.RISPOSTA);
  972.                 if(idSbloccoRicezioneContenutiApplicativi == null){
  973.                     throw new Exception("Identificativo non costruito.");
  974.                 }  
  975.                 msgSbloccoRicezioneContenutiApplicativi = new GestoreMessaggi(this.openSPCoopState, false, idSbloccoRicezioneContenutiApplicativi,Costanti.INBOX,this.msgDiag,this.pddContext);
  976.                 RequestInfo requestInfo = (RequestInfo) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  977.                 MessageType msgTypeSblocco = requestInfo.getIntegrationRequestMessageType();
  978.                 if(msgTypeSblocco==null){
  979.                     throw new Exception("Versione messaggio non definita");
  980.                 }
  981.                 if(this.protocolManager.isHttpEmptyResponseOneWay())
  982.                     msgSbloccoRicezioneContenutiApplicativi.registraMessaggio(MessageUtilities.buildEmptyMessage(OpenSPCoop2MessageFactory.getDefaultMessageFactory(), msgTypeSblocco, MessageRole.RESPONSE),correlazioneApplicativa,correlazioneApplicativaRisposta);
  983.                 else
  984.                     msgSbloccoRicezioneContenutiApplicativi.registraMessaggio(this.buildOpenSPCoopOK(msgTypeSblocco,this.idSessione),correlazioneApplicativa,correlazioneApplicativaRisposta);
  985.                 msgSbloccoRicezioneContenutiApplicativi.aggiornaRiferimentoMessaggio(this.idSessione);
  986.                 //  --- Aggiorno Proprietario
  987.                 msgSbloccoRicezioneContenutiApplicativi.aggiornaProprietarioMessaggio(idModuloInAttesa);
  988.                 //  --- Spedizione al modulo RicezioneContenutiApplicativiXXX
  989.                 sendToRicezioneContenutiApplicativi(idModuloInAttesa,idSbloccoRicezioneContenutiApplicativi,
  990.                         richiestaDelegata.getIdCollaborazione(),
  991.                         richiestaDelegata.getProfiloCollaborazione(),richiestaDelegata.getProfiloCollaborazioneValue());
  992.             }

  993.             // Ritorno gestore della risposta
  994.             return msgResponse;

  995.         }catch (Exception e) {  
  996.             this.msgDiag.logErroreGenerico(e, "EJBUtils.sendRispostaApplicativa");
  997.            
  998.             if(msgResponse!=null)
  999.                 statoRisposta.closePreparedStatement();
  1000.             //  msgResponse.closePreparedStatement();

  1001.             // Rilancio l'eccezione
  1002.             throw new EJBUtilsException("EJBUtils.sendRispostaApplicativa error: "+e.getMessage(),e);
  1003.         } finally{
  1004.             this.unsetEJBSuffixFunctionName();
  1005.         }

  1006.     }













  1007.     /** ------------------- Metodo per la spedizione al nodo 'RicezioneContenutiApplicativi' ---------------- */

  1008.     /**
  1009.      * Spedisce una risposta applicativa  
  1010.      * al modulo di openspcoop RicezioneContenutiApplicativiXXX,
  1011.      * inserendolo all'interno di  un messaggio di tipo {@link org.openspcoop2.pdd.services.core.RicezioneContenutiApplicativiMessage} e
  1012.      * spedendolo nella coda 'toRicezioneContenutiApplicativiXXX'.
  1013.      *
  1014.      * @param idModuloInAttesa identificativo del modulo 'RicezioneContenutiApplicativiXXX'.
  1015.      * @param idRisposta Identificativo del messaggio di risposta
  1016.      *
  1017.      */
  1018.     public void sendToRicezioneContenutiApplicativi(String idModuloInAttesa,String idRisposta, String idCollaborazione,
  1019.             ProfiloDiCollaborazione profiloCollaborazione, String profiloCollaborazioneValue) throws EJBUtilsException{

  1020.         if (this.openSPCoopState instanceof OpenSPCoopStateless) {
  1021.             RicezioneContenutiApplicativiMessage accettazioneMSG = new RicezioneContenutiApplicativiMessage();
  1022.             accettazioneMSG.setIdBustaRisposta(idRisposta);
  1023.             accettazioneMSG.setIdCollaborazione(idCollaborazione);
  1024.             accettazioneMSG.setProfiloCollaborazione(profiloCollaborazione,profiloCollaborazioneValue);
  1025.             accettazioneMSG.setPddContext(this.pddContext);
  1026.             ((OpenSPCoopStateless)this.openSPCoopState).setMessageLib(accettazioneMSG);
  1027.             return;
  1028.         }
  1029.        
  1030.         if( CostantiConfigurazione.COMUNICAZIONE_INFRASTRUTTURALE_JMS.equals(this.propertiesReader.getNodeReceiver())){
  1031.             try{
  1032.                 // Creazione RicezioneContenutiApplicativiMessage
  1033.                 this.msgDiag.highDebug("[EJBUtils] Creazione ObjectMessage for send via JMS.");
  1034.                 RicezioneContenutiApplicativiMessage accettazioneMSG = new RicezioneContenutiApplicativiMessage();
  1035.                 accettazioneMSG.setIdBustaRisposta(idRisposta);
  1036.                 accettazioneMSG.setIdCollaborazione(idCollaborazione);
  1037.                 accettazioneMSG.setProfiloCollaborazione(profiloCollaborazione, profiloCollaborazioneValue);
  1038.                 accettazioneMSG.setPddContext(this.pddContext);

  1039.                 if (this.openSPCoopState instanceof OpenSPCoopStateless)
  1040.                     ((OpenSPCoopStateless)this.openSPCoopState).setMessageLib(accettazioneMSG);

  1041.                 else { //send modalita Stateful
  1042.                     // NOTA: usare realmente JMSSender e non l'interfaccia INodeSender, perche' questo punto riguarda INodeReceiver!!
  1043.                     String idT = PdDContext.getValue(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE, this.pddContext);
  1044.                     JMSSender senderJMS = new JMSSender(this.identitaPdD,this.idModulo,this.log,idT);
  1045.                     if(senderJMS.send(idModuloInAttesa,
  1046.                             accettazioneMSG,this.idSessione) == false){
  1047.                         this.msgDiag.logErroreGenerico(senderJMS.getErrore(), "EJBUtils.sendToRicezioneContenutiApplicativi.senderJMS");
  1048.                         throw new Exception("[EJBUtils]  SendJMSError: "+senderJMS.getErrore());
  1049.                     }
  1050.                     this.msgDiag.highDebug("[EJBUtils]  ObjectMessage send via JMS.");
  1051.                 }
  1052.             } catch (Exception e) {
  1053.                 this.msgDiag.logErroreGenerico(e, "EJBUtils.sendToRicezioneContenutiApplicativi");
  1054.                 throw new EJBUtilsException("EJBUtils.sendToRicezioneContenutiApplicativi error: "+e.getMessage(),e);
  1055.             }
  1056.         }
  1057.     }













  1058.     /** ------------------- Metodo per la spedizione al nodo 'ConsegnaContenutiApplicativi' ---------------- */

  1059.     /**
  1060.      * Spedisce una risposta applicativa  
  1061.      * al modulo di openspcoop ConsegnaContenutiApplicativi,
  1062.      * inserendolo all'interno di  un messaggio di tipo {@link org.openspcoop2.pdd.mdb.ConsegnaContenutiApplicativiMessage} e
  1063.      * spedendolo nella coda 'toConsegnaContenutiApplicativi'.
  1064.      *
  1065.      * @param richiestaDelegata RichiestaDelegata
  1066.      * @param idBustaConsegna Identificatore del messaggio da consegnare
  1067.      *
  1068.      */
  1069.     public void sendToConsegnaContenutiApplicativi_rispostaConsegnataModalitaAsincrona(RichiestaDelegata richiestaDelegata, String idBustaConsegna, GestoreMessaggi gm) throws EJBUtilsException{

  1070.         // La richiesta delegata avra' sempre e soltanto un servizio applicativo, quello che ha invocato la porta delegata
  1071.         try{

  1072.             // Creazione RicezioneContenutiApplicativiMessage
  1073.             this.msgDiag.highDebug("[EJBUtils]  Creazione ObjectMessage for send nell'infrastruttura.");
  1074.             ConsegnaContenutiApplicativiMessage consegnaMSG = new ConsegnaContenutiApplicativiMessage();
  1075.             consegnaMSG.setRichiestaDelegata(richiestaDelegata);
  1076.             consegnaMSG.setOneWayVersione11(this.oneWayVersione11);
  1077.             consegnaMSG.setStateless(this.portaDiTipoStateless_esclusoOneWay11);
  1078.             consegnaMSG.setImplementazionePdDSoggettoMittente(this.implementazionePdDSoggettoMittente);
  1079.             consegnaMSG.setImplementazionePdDSoggettoDestinatario(this.implementazionePdDSoggettoDestinatario);
  1080.             consegnaMSG.setPddContext(this.pddContext);

  1081.             // Costrusce una busta opportuna per la gestione asincrona
  1082.             Busta busta = new Busta(this.protocolFactory.getProtocol());
  1083.             busta.setTipoMittente(richiestaDelegata.getIdSoggettoFruitore().getTipo());
  1084.             busta.setMittente(richiestaDelegata.getIdSoggettoFruitore().getNome());
  1085.             busta.setIdentificativoPortaMittente(richiestaDelegata.getIdSoggettoFruitore().getCodicePorta());
  1086.             busta.setTipoDestinatario(richiestaDelegata.getIdServizio().getSoggettoErogatore().getTipo());
  1087.             busta.setDestinatario(richiestaDelegata.getIdServizio().getSoggettoErogatore().getNome());
  1088.             busta.setIdentificativoPortaDestinatario(richiestaDelegata.getIdServizio().getSoggettoErogatore().getCodicePorta());
  1089.             busta.setTipoServizio(richiestaDelegata.getIdServizio().getTipo());
  1090.             busta.setServizio(richiestaDelegata.getIdServizio().getNome());
  1091.             busta.setVersioneServizio(richiestaDelegata.getIdServizio().getVersione());
  1092.             busta.setAzione(richiestaDelegata.getIdServizio().getAzione());
  1093.             busta.setID(idBustaConsegna);
  1094.             busta.setRiferimentoMessaggio(this.idSessione);
  1095.            
  1096.             busta.setProfiloDiCollaborazione(richiestaDelegata.getProfiloCollaborazione());
  1097.            
  1098.             boolean idCollaborazione = false;
  1099.             switch (this.protocolFactory.createProtocolVersionManager(richiestaDelegata.getProfiloGestione()).getCollaborazione(busta)) {
  1100.             case ABILITATA:
  1101.                 idCollaborazione = true;
  1102.                 break;
  1103.             case DISABILITATA:
  1104.                 idCollaborazione = false;
  1105.                 break;
  1106.             default:
  1107.                 idCollaborazione = this.propertiesReader.isGestioneElementoCollaborazione(this.implementazionePdDSoggettoDestinatario);
  1108.                 break;
  1109.             }
  1110.            
  1111.             if( idCollaborazione ){
  1112.                 busta.setCollaborazione(richiestaDelegata.getIdCollaborazione());
  1113.             }
  1114.             consegnaMSG.setBusta(busta);

  1115.             this.nodeSender.send(consegnaMSG, org.openspcoop2.pdd.mdb.ConsegnaContenutiApplicativi.ID_MODULO, this.msgDiag,
  1116.                     this.identitaPdD,this.idModulo, idBustaConsegna, gm);

  1117.         } catch (Exception e) {
  1118.             this.log.error("Spedizione->ConsegnaContenutiApplicativi(RichiestaDelegata) non riuscita",e);  
  1119.             this.msgDiag.logErroreGenerico(e, "EJBUtils.sendToConsegnaContenutiApplicativi(RichiestaDelegata)");
  1120.             throw new EJBUtilsException("EJBUtils.sendToConsegnaContenutiApplicativi error: "+e.getMessage(),e);
  1121.         }
  1122.     }

  1123.     /**
  1124.      * Spedisce una risposta applicativa  
  1125.      * al modulo di openspcoop ConsegnaContenutiApplicativi,
  1126.      * inserendolo all'interno di  un messaggio di tipo {@link org.openspcoop2.pdd.mdb.ConsegnaContenutiApplicativiMessage} e
  1127.      * spedendolo nella coda 'toConsegnaContenutiApplicativi'.
  1128.      *
  1129.      * @param richiestaDelegata RichiestaDelegata
  1130.      * @param busta Busta che raccoglie i dati dell'invocazione di servizio
  1131.      * @param gestoreMessaggi il Gestore Messaggi utilizzato per la registrazione dei destinatari del messaggio
  1132.      *
  1133.      */
  1134.     public void sendToConsegnaContenutiApplicativi_gestioneMessaggio(RichiestaDelegata richiestaDelegata,Busta busta,
  1135.             GestoreMessaggi gestoreMessaggi,
  1136.             ServizioApplicativo sa) throws EJBUtilsException{

  1137.         try{

  1138.             if(richiestaDelegata!=null) {
  1139.                 this.msgDiag.addKeyword(CostantiPdD.KEY_SA_EROGATORE, richiestaDelegata.getServizioApplicativo());
  1140.             }
  1141.            
  1142.             if(richiestaDelegata==null) {
  1143.                 throw new EJBUtilsException("Param richiestaDelegata is null");
  1144.             }
  1145.            
  1146.             String nomePorta = null;
  1147.             if(richiestaDelegata.getIdPortaDelegata()!=null)
  1148.                 nomePorta = richiestaDelegata.getIdPortaDelegata().getNome();
  1149.            
  1150.             //  Aggiorno dati di consegna
  1151.             this.msgDiag.setServizioApplicativo(richiestaDelegata.getServizioApplicativo());

  1152.             gestoreMessaggi.aggiornaRiferimentoMessaggio(busta.getRiferimentoMessaggio());
  1153.             boolean servizioApplicativoRicezioneAsincronaConConnettore = this.configurazionePdDReader.consegnaRispostaAsincronaConConnettore(sa);
  1154.             boolean getMessageAbilitato = this.configurazionePdDReader.consegnaRispostaAsincronaConGetMessage(sa);
  1155.             if( getMessageAbilitato==false && servizioApplicativoRicezioneAsincronaConConnettore==false ){
  1156.                 throw new EJBUtilsConsegnaException(this.msgDiag,MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"consegnaNonDefinita");
  1157.             }
  1158.             boolean sbustamentoSoap= this.configurazionePdDReader.consegnaRispostaAsincronaConSbustamento(sa);
  1159.             boolean sbustamentoInformazioniProtocollo = this.configurazionePdDReader.consegnaRispostaAsincronaConSbustamentoInformazioniProtocollo(sa);
  1160.             String tipoConsegna = GestoreMessaggi.CONSEGNA_TRAMITE_INTEGRATION_MANAGER;
  1161.             if(servizioApplicativoRicezioneAsincronaConConnettore)
  1162.                 tipoConsegna = GestoreMessaggi.CONSEGNA_TRAMITE_CONNETTORE;

  1163.             // oraRegistrazione
  1164.             Timestamp oraRegistrazioneMessaggio = gestoreMessaggi.getOraRegistrazioneMessaggio();

  1165.             gestoreMessaggi.registraDestinatarioMessaggio(richiestaDelegata.getServizioApplicativo(),
  1166.                     sbustamentoSoap,sbustamentoInformazioniProtocollo,getMessageAbilitato,tipoConsegna,oraRegistrazioneMessaggio,
  1167.                     nomePorta, false, false,
  1168.                     null, null, false);

  1169.             // Aggiungo costante servizio applicativo
  1170.             this.msgDiag.addKeyword(CostantiPdD.KEY_SA_EROGATORE, richiestaDelegata.getServizioApplicativo());
  1171.            
  1172.             if(servizioApplicativoRicezioneAsincronaConConnettore){

  1173.                 // La richiesta delegata avra' sempre e soltanto un servizio applicativo, quello che ha invocato la porta delegata
  1174.                 try{

  1175.                     // Creazione RicezioneContenutiApplicativiMessage
  1176.                     this.msgDiag.highDebug("[EJBUtils] Creazione ObjectMessage for send nell'infrastruttura.");
  1177.                     ConsegnaContenutiApplicativiMessage consegnaMSG = new ConsegnaContenutiApplicativiMessage();
  1178.                     consegnaMSG.setRichiestaDelegata(richiestaDelegata);
  1179.                     consegnaMSG.setBusta(busta);
  1180.                     consegnaMSG.setOneWayVersione11(this.oneWayVersione11);
  1181.                     consegnaMSG.setStateless(this.portaDiTipoStateless_esclusoOneWay11);
  1182.                     consegnaMSG.setImplementazionePdDSoggettoMittente(this.implementazionePdDSoggettoMittente);
  1183.                     consegnaMSG.setImplementazionePdDSoggettoDestinatario(this.implementazionePdDSoggettoDestinatario);
  1184.                     consegnaMSG.setPddContext(this.pddContext);

  1185.                     if (this.openSPCoopState instanceof OpenSPCoopStateless)
  1186.                         ((OpenSPCoopStateless)this.openSPCoopState).setMessageLib(consegnaMSG);

  1187.                     else { //send modalita Stateful
  1188.                         this.nodeSender.send(consegnaMSG, org.openspcoop2.pdd.mdb.ConsegnaContenutiApplicativi.ID_MODULO, this.msgDiag,
  1189.                                 this.identitaPdD,this.idModulo, busta.getID(), gestoreMessaggi);
  1190.                     }
  1191.                 } catch (Exception e) {
  1192.                     throw e;
  1193.                 }
  1194.             }
  1195.             else{

  1196.                 // CONNETTORE non presente
  1197.                 // un connettore deve per forza essere presente se:
  1198.                 // - profilo asincrono e ricevuta applicativa abilitata
  1199.                 if(richiestaDelegata.isRicevutaAsincrona() &&
  1200.                         (ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(busta.getProfiloDiCollaborazione()) ||
  1201.                                 ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(busta.getProfiloDiCollaborazione()) ) ){      
  1202.                     throw new EJBUtilsConsegnaException(this.msgDiag,MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"gestioneProfiloAsincrono.servizioNonUtilizzabile");
  1203.                 }else{
  1204.                     this.msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"integrationManager.messaggioDisponibile");
  1205.                 }
  1206.             }

  1207.         } catch (EJBUtilsConsegnaException e) {
  1208.             throw e;
  1209.         } catch (Exception e) {
  1210.             this.log.error("Spedizione->ConsegnaContenutiApplicativi_gestoreMessaggi(RichiestaDelegata) non riuscita",e);  
  1211.             this.msgDiag.logErroreGenerico(e, "EJBUtils.sendToConsegnaContenutiApplicativi_gestoreMessaggi(RichiestaDelegata)");
  1212.             throw new EJBUtilsException("EJBUtils.sendToConsegnaContenutiApplicativi error: "+e.getMessage(),e);
  1213.         }
  1214.     }


  1215.     /**
  1216.      * Spedisce una risposta applicativa  
  1217.      * al modulo di openspcoop ConsegnaContenutiApplicativi,
  1218.      * inserendolo all'interno di  un messaggio di tipo {@link org.openspcoop2.pdd.mdb.ConsegnaContenutiApplicativiMessage} e
  1219.      * spedendolo nella coda 'toConsegnaContenutiApplicativi'.
  1220.      * Utilizza la definizione dell'invocazione servizio se il tipo di consegna e':
  1221.      * <ul>
  1222.      *  <li>OneWay_InvocazioneServizio
  1223.      *  <li>Sincrono_InvocazioneServizio
  1224.      *  <li>AsincronoSimmetrico_InvocazioneServizio
  1225.      *  <li>AsincronoAsimmetrico_InvocazioneServizio
  1226.      * </ul>
  1227.      * Utilizza invece la definizione della consegna contenuti asincroni, se il tipo e': AsincronoAsimmetrico_Polling
  1228.      * Se il tipo e' diverso da quelli elencati, viene sollevata una eccezione.
  1229.      *
  1230.      * @param richiestaApplicativa RichiestaApplicativa
  1231.      * @param busta Busta che raccoglie i dati dell'invocazione di servizio
  1232.      * @param gestoreMessaggi il Gestore Messaggi utilizzato per la registrazione dei destinatari del messaggio
  1233.      *
  1234.      */
  1235.     private boolean gestioneStatelessConIntegrationManager = false;
  1236.     public boolean isGestioneStatelessConIntegrationManager() {
  1237.         return this.gestioneStatelessConIntegrationManager;
  1238.     }
  1239.     private boolean gestioneSolamenteConIntegrationManager = false;
  1240.     public boolean isGestioneSolamenteConIntegrationManager() {
  1241.         return this.gestioneSolamenteConIntegrationManager;
  1242.     }
  1243.     public Behaviour sendToConsegnaContenutiApplicativi(RequestInfo requestInfo,
  1244.             RichiestaApplicativa richiestaApplicativa,Busta busta,
  1245.             GestoreMessaggi gestoreMessaggi,PortaApplicativa pa,RepositoryBuste repositoryBuste) throws EJBUtilsException{
  1246.         return sendToConsegnaContenutiApplicativi(requestInfo,richiestaApplicativa, busta, gestoreMessaggi, pa, repositoryBuste, null);
  1247.     }
  1248.     public Behaviour sendToConsegnaContenutiApplicativi(RequestInfo requestInfo,
  1249.             RichiestaApplicativa richiestaApplicativa,Busta busta,
  1250.             GestoreMessaggi gestoreMessaggi,PortaApplicativa pa,RepositoryBuste repositoryBuste,
  1251.             RichiestaDelegata localForwardRichiestaDelegata) throws EJBUtilsException{

  1252.         try{
  1253.        
  1254.             Behaviour behaviour = null;
  1255.            
  1256.            
  1257.             boolean soggettoVirtuale = false;
  1258.             if(richiestaApplicativa!=null &&
  1259.                     richiestaApplicativa.getIDServizio()!=null &&
  1260.                             richiestaApplicativa.getIDServizio().getSoggettoErogatore()!=null){    
  1261.                 soggettoVirtuale = this.configurazionePdDReader.isSoggettoVirtuale( richiestaApplicativa.getIDServizio().getSoggettoErogatore(), requestInfo );
  1262.             }
  1263.            
  1264.            
  1265.             /* ----- Indicazione Stateless ----- */
  1266.             boolean stateless = false;
  1267.             if(!soggettoVirtuale) {
  1268.                 if(localForwardRichiestaDelegata!=null){
  1269.                     stateless = this.portaDiTipoStateless_esclusoOneWay11;
  1270.                 }else{
  1271.                     stateless = this.configurazionePdDReader.isModalitaStateless(pa, busta.getProfiloDiCollaborazione());
  1272.                 }
  1273.             }
  1274.            
  1275.             if(pa!=null){
  1276.                 this.msgDiag.addKeyword(CostantiPdD.KEY_PORTA_APPLICATIVA, pa.getNome());
  1277.             }
  1278.            
  1279.            
  1280.             /* ----- Recupero eventuale processo di behaviour ----- */
  1281.             boolean registraNuoviMessaggiViaBehaviour = false;
  1282.             @SuppressWarnings("unused")
  1283.             int sizeNuoviMessaggiViaBehaviour = -1;
  1284.             BehaviourForwardToFilter singleFilterBehaviour = null;
  1285.             boolean behaviourResponseTo = false;
  1286.             IDServizioApplicativo behaviour_idSA_SyncResponder = null;
  1287.             MessaggioDaNotificare tipiMessaggiNotificabili = null;
  1288.             IBehaviour behaviourImpl = null;
  1289.             // pa is null nel caso di soggetto virtuale
  1290.             if(pa!=null && pa.getBehaviour()!=null && pa.getBehaviour().getNome()!=null && !"".equals(pa.getBehaviour().getNome())){
  1291.                
  1292.                 behaviourImpl = BehaviourLoader.newInstance(pa.getBehaviour(), this.msgDiag,
  1293.                         this.pddContext, this.protocolFactory,
  1294.                         this.openSPCoopState!=null ? this.openSPCoopState.getStatoRichiesta() : null);
  1295.                
  1296.                 gestoreMessaggi.setPortaDiTipoStateless(stateless);
  1297.                 behaviour = behaviourImpl.behaviour(gestoreMessaggi, busta, pa, requestInfo);
  1298.                                
  1299.                 behaviourResponseTo = behaviour!=null && behaviour.isResponseTo();
  1300.                
  1301.                 if(behaviour!=null) {
  1302.                     behaviour_idSA_SyncResponder = behaviour.getApplicativeSyncResponder();
  1303.                 }
  1304.                
  1305.                 if(behaviour!=null && behaviour.getForwardTo()!=null){
  1306.                     if(behaviour.getForwardTo().size()>1){
  1307.                         registraNuoviMessaggiViaBehaviour = true;
  1308.                         if(behaviourResponseTo==false){
  1309.                             throw new Exception("La consegna di messaggi multipli via custom behaviour (tipo:"+pa.getBehaviour().getNome()+
  1310.                                     ") e' permessa solo se viene abilita anche la funzione 'responseTo'");
  1311.                         }
  1312.                         for (int i=0; i<behaviour.getForwardTo().size(); i++) {
  1313.                             BehaviourForwardTo forwardTo = behaviour.getForwardTo().get(i);
  1314.                             if(forwardTo.getDescription()==null){
  1315.                                 forwardTo.setDescription("ForwardTo["+i+"]");
  1316.                             }
  1317.                             if(forwardTo.getMessage()==null){
  1318.                                 throw new Exception("La consegna di messaggi multipli via custom behaviour (tipo:"+pa.getBehaviour().getNome()+
  1319.                                         ") richiede che vengano definiti tutti i messaggi da inoltrare. Trovato un elemento ForwardTo ("+
  1320.                                         forwardTo.getDescription()+") che non contiene alcun messaggio");
  1321.                             }
  1322.                         }
  1323.                     }
  1324.                     else if(behaviour.getForwardTo().size()==1){
  1325.                        
  1326.                         BehaviourForwardTo forwardTo = behaviour.getForwardTo().get(0);
  1327.                         if(forwardTo.getDescription()==null){
  1328.                             forwardTo.setDescription("ForwardTo");
  1329.                         }
  1330.                        
  1331.                         if(forwardTo.getMessage()!=null){
  1332.                             if(behaviourResponseTo){
  1333.                                 registraNuoviMessaggiViaBehaviour = true;
  1334.                             }
  1335.                             else{
  1336.                                 // e' stata effettuata solamente una trasformazione del messaggio
  1337.                                 // Se siamo stateless non devo fare niente, l'oggetto in memoria contiene gia' la modifica.
  1338.                                 // Altrimenti se stiamo stateful viene comunque applicata l'eliminazione del vecchio messaggio
  1339.                                 // ed il salvataggio del nuovo modificato.
  1340.                                 if(!stateless){
  1341.                                     registraNuoviMessaggiViaBehaviour = true;
  1342.                                 }
  1343.                             }
  1344.                         }
  1345.                         else{                          
  1346.                             singleFilterBehaviour = behaviour.getForwardTo().get(0).getFilter();
  1347.                         }
  1348.                     }
  1349.                 }
  1350.                
  1351.                 if(registraNuoviMessaggiViaBehaviour){

  1352.                     String idTransazione = (String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  1353.                     IOpenSPCoopState stateGestoreMessaggiBehaviour_newConnection_old = null;
  1354.                     OpenSPCoopStateless stateGestoreMessaggiBehaviour_newConnection = null;
  1355.                     OpenSPCoopStateless stateGestoreMessaggiBehaviour_onlyUseConnectionFalse = null;
  1356.                     boolean oldUseConnection = false;
  1357.                     try{
  1358.                         if (stateless && !this.propertiesReader.isServerJ2EE() ) {
  1359.                             boolean createNew = true;
  1360.                             if( (gestoreMessaggi.getOpenspcoopstate() instanceof OpenSPCoopStateless)) {
  1361.                                 OpenSPCoopStateless check = (OpenSPCoopStateless) gestoreMessaggi.getOpenspcoopstate();
  1362.                                 if(check.getConnectionDB()!=null && check.getConnectionDB().isClosed()==false) {
  1363.                                     createNew = false;
  1364.                                     stateGestoreMessaggiBehaviour_onlyUseConnectionFalse = (OpenSPCoopStateless) gestoreMessaggi.getOpenspcoopstate();
  1365.                                     oldUseConnection = check.isUseConnection();
  1366.                                     stateGestoreMessaggiBehaviour_onlyUseConnectionFalse.setUseConnection(true);
  1367.                                 }
  1368.                             }
  1369.                            
  1370.                             if(createNew) {
  1371.                                
  1372.                                 stateGestoreMessaggiBehaviour_newConnection_old = gestoreMessaggi.getOpenspcoopstate();
  1373.                                
  1374.                                 stateGestoreMessaggiBehaviour_newConnection = new OpenSPCoopStateless();
  1375.                                 stateGestoreMessaggiBehaviour_newConnection.setUseConnection(true);
  1376.                                 stateGestoreMessaggiBehaviour_newConnection.setTempiAttraversamentoPDD(((OpenSPCoopStateless)this.openSPCoopState).getTempiAttraversamentoPDD());
  1377.                                 stateGestoreMessaggiBehaviour_newConnection.setDimensioneMessaggiAttraversamentoPDD(((OpenSPCoopStateless)this.openSPCoopState).getDimensioneMessaggiAttraversamentoPDD());
  1378.                                 stateGestoreMessaggiBehaviour_newConnection.setIDCorrelazioneApplicativa(((OpenSPCoopStateless)this.openSPCoopState).getIDCorrelazioneApplicativa());
  1379.                                 stateGestoreMessaggiBehaviour_newConnection.setIDCorrelazioneApplicativaRisposta(((OpenSPCoopStateless)this.openSPCoopState).getIDCorrelazioneApplicativaRisposta());
  1380.                                 stateGestoreMessaggiBehaviour_newConnection.setPddContext(((OpenSPCoopStateless)this.openSPCoopState).getPddContext());
  1381.                                 stateGestoreMessaggiBehaviour_newConnection.initResource(this.identitaPdD, "EJBUtils.behaviour_"+pa.getBehaviour().getNome(), idTransazione);
  1382.                                 gestoreMessaggi.updateOpenSPCoopState(stateGestoreMessaggiBehaviour_newConnection);
  1383.                                
  1384.                             }
  1385.                         }
  1386.                    
  1387.                         sizeNuoviMessaggiViaBehaviour = behaviour.getForwardTo().size();
  1388.                            
  1389.                         // elimino l'attuale messaggio
  1390.                         if(localForwardRichiestaDelegata!=null){
  1391.                            
  1392.                             if(stateless){
  1393.                                 repositoryBuste.eliminaUtilizzoPdDFromInBox(busta.getID(),false);
  1394.                             }
  1395.                             else{
  1396.                                 repositoryBuste.eliminaUtilizzoPdDFromInBox(busta.getID(),true);
  1397.                             }
  1398.                            
  1399.                             gestoreMessaggi.aggiornaProprietarioMessaggio(TimerGestoreMessaggi.ID_MODULO);
  1400.                            
  1401.                         }
  1402.                         else{
  1403.                            
  1404.                             if(stateless){
  1405.                                 repositoryBuste.eliminaUtilizzoPdDFromInBox(busta.getID(),repositoryBuste.isRegistrazioneInCorso());
  1406.                             }
  1407.                             else{
  1408.                                 repositoryBuste.eliminaUtilizzoPdDFromInBox(busta.getID(),true);
  1409.                             }
  1410.                        
  1411.                             // Forzo oneway1.1 per farlo registrare anche se siamo in stateless puro
  1412.                             boolean originalValue = gestoreMessaggi.isOneWayVersione11();
  1413.                             gestoreMessaggi.setOneWayVersione11(true);
  1414.                             gestoreMessaggi.logicDeleteMessage();
  1415.                             gestoreMessaggi.setOneWayVersione11(originalValue);
  1416.                            
  1417.                         }
  1418.                        
  1419.                         // Applico modifiche effettuate dal modulo Consegna
  1420.                         if (stateless && !this.propertiesReader.isServerJ2EE() ) {
  1421.                             if(stateGestoreMessaggiBehaviour_newConnection!=null) {
  1422.                                 if(stateGestoreMessaggiBehaviour_newConnection.resourceReleased()){
  1423.                                     // il modulo di consegna rilascia la risorsa
  1424.                                     stateGestoreMessaggiBehaviour_newConnection.updateResource(idTransazione);
  1425.                                 }
  1426.                                 stateGestoreMessaggiBehaviour_newConnection.commit();
  1427.                             }
  1428.                             else if(stateGestoreMessaggiBehaviour_onlyUseConnectionFalse!=null) {
  1429.                                 stateGestoreMessaggiBehaviour_onlyUseConnectionFalse.commit();
  1430.                             }
  1431.                         }
  1432.                        
  1433.                     }finally{
  1434.                         if (stateless && !this.propertiesReader.isServerJ2EE() ) {
  1435.                             if(stateGestoreMessaggiBehaviour_newConnection!=null){
  1436.                                 stateGestoreMessaggiBehaviour_newConnection.releaseResource();
  1437.                                 gestoreMessaggi.updateOpenSPCoopState(stateGestoreMessaggiBehaviour_newConnection_old);
  1438.                             }
  1439.                             else if(stateGestoreMessaggiBehaviour_onlyUseConnectionFalse!=null) {
  1440.                                 stateGestoreMessaggiBehaviour_onlyUseConnectionFalse.setUseConnection(oldUseConnection);
  1441.                             }
  1442.                         }
  1443.                     }
  1444.                 }
  1445.                 else{
  1446.                     // se non devo registrare alcun messaggio, e sono in stateless, ma e' stata configurata una replyTo
  1447.                     // ritorno errore, poiche' deve essere configurato un messaggio da inoltrare.
  1448.                     if(stateless && behaviourResponseTo){
  1449.                         throw new Exception("La definizione dell'elemento 'responseTo', via custom behaviour (tipo:"+pa.getBehaviour().getNome()+
  1450.                                 "), in una porta applicativa stateless richiede la definizione almeno di un elemento forwardTo contenente un messaggio da inoltrare.");
  1451.                     }
  1452.                 }
  1453.                
  1454.             }
  1455.            
  1456.            
  1457.             /* ----- Check Tipo ----- */
  1458.             if(richiestaApplicativa==null) {
  1459.                 throw new Exception("Tipo di consegna sconosciuta (RichiestaApplicativa non definita)");
  1460.             }
  1461.             if( (Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(richiestaApplicativa.getScenario()) == false) &&
  1462.                     (Costanti.SCENARIO_SINCRONO_INVOCAZIONE_SERVIZIO.equals(richiestaApplicativa.getScenario()) == false) &&
  1463.                     (Costanti.SCENARIO_ASINCRONO_SIMMETRICO_INVOCAZIONE_SERVIZIO.equals(richiestaApplicativa.getScenario()) == false) &&
  1464.                     (Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_INVOCAZIONE_SERVIZIO.equals(richiestaApplicativa.getScenario()) == false) &&
  1465.                     (Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_POLLING.equals(richiestaApplicativa.getScenario()) == false)   ){
  1466.                 throw new Exception("Tipo di consegna sconosciuta");
  1467.             }
  1468.            

  1469.             /* ----- Raccolta servizi applicativi collegati alla porta applicativa ----- */
  1470.             String [] serviziApplicativiConfigurazione = null;
  1471.             SoggettoVirtuale soggettiRealiMappatiInUnSoggettoVirtuale = null;
  1472.             IDSoggetto soggettoDestinatario = richiestaApplicativa.getIDServizio().getSoggettoErogatore();
  1473.             if( Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_POLLING.equals(richiestaApplicativa.getScenario())  ){
  1474.                 // Lettura da ricezione contenuti asincroni
  1475.                 serviziApplicativiConfigurazione  = this.configurazionePdDReader.getServiziApplicativi(pa);
  1476.                 if(serviziApplicativiConfigurazione == null){
  1477.                     throw new EJBUtilsConsegnaException(this.msgDiag,MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"servizioApplicativoNonDefinito");
  1478.                 }
  1479.             }else{
  1480.                 // lettura da invocazione servizio
  1481.                 if(soggettoVirtuale){      
  1482.                     SoggettoVirtuale soggettiVirtuali = this.configurazionePdDReader.getServiziApplicativiSoggettiVirtuali(richiestaApplicativa);
  1483.                     if(soggettiVirtuali == null){
  1484.                         throw new EJBUtilsConsegnaException("(SoggettoVirtuale) "+this.msgDiag.getMessaggio_replaceKeywords(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"servizioApplicativoNonDefinito"),
  1485.                                 this.msgDiag.getLivello(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"servizioApplicativoNonDefinito"),
  1486.                                 this.msgDiag.getCodice(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"servizioApplicativoNonDefinito"));
  1487.                     }
  1488.                     boolean GESTISCI_BEHAVIOUR = true;
  1489.                     List<String> idServiziApplicativiVirtuali = soggettiVirtuali.getIdServiziApplicativi(GESTISCI_BEHAVIOUR,gestoreMessaggi,busta, requestInfo,
  1490.                             this.pddContext, this.protocolFactory,
  1491.                             this.openSPCoopState!=null ? this.openSPCoopState.getStatoRichiesta() : null);
  1492.                     if(idServiziApplicativiVirtuali.size()>0){
  1493.                         serviziApplicativiConfigurazione = idServiziApplicativiVirtuali.toArray(new String[1]);
  1494.                     }
  1495.                     soggettiRealiMappatiInUnSoggettoVirtuale = soggettiVirtuali;
  1496.                 }else{
  1497.                     serviziApplicativiConfigurazione  = this.configurazionePdDReader.getServiziApplicativi(pa);
  1498.                     if(serviziApplicativiConfigurazione == null){
  1499.                         throw new EJBUtilsConsegnaException(this.msgDiag,MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"servizioApplicativoNonDefinito");
  1500.                     }
  1501.                 }
  1502.             }


  1503.             /* ----- Controllo esistenza di almeno un servizio applicativo ----- */
  1504.             if( serviziApplicativiConfigurazione==null || serviziApplicativiConfigurazione.length < 1){
  1505.                 throw new EJBUtilsConsegnaException(this.msgDiag,MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"servizioApplicativoNonDefinito");
  1506.             }
  1507.             List<String> serviziApplicativiAbilitati = new ArrayList<>();
  1508.             List<IDServizioApplicativo> idServiziApplicativiAbilitati = new ArrayList<IDServizioApplicativo>();
  1509.             for (int i = 0; i < serviziApplicativiConfigurazione.length; i++) {
  1510.                 IDServizioApplicativo idSA = new IDServizioApplicativo();
  1511.                 idSA.setIdSoggettoProprietario(soggettoDestinatario);
  1512.                 idSA.setNome(serviziApplicativiConfigurazione[i]);
  1513.                 serviziApplicativiAbilitati.add(serviziApplicativiConfigurazione[i]);
  1514.                 idServiziApplicativiAbilitati.add(idSA);
  1515.             }
  1516.             if(singleFilterBehaviour!=null){
  1517.                 // Dentro qua non si passa se siamo in modalità soggetto virtuale
  1518.                 // Il behaviuor sul filtro è gestito direttamente dentro il metodo soggettiVirtuali.getIdServiziApplicativi() sopra
  1519.                 idServiziApplicativiAbilitati = singleFilterBehaviour.aggiornaDestinatariAbilitati(idServiziApplicativiAbilitati);
  1520.                 serviziApplicativiAbilitati = new ArrayList<>();
  1521.                 for (IDServizioApplicativo idServizioApplicativo : idServiziApplicativiAbilitati) {
  1522.                     serviziApplicativiAbilitati.add(idServizioApplicativo.getNome());
  1523.                 }
  1524.             }
  1525.             if( serviziApplicativiAbilitati.size() < 1 && (behaviour_idSA_SyncResponder==null) ){
  1526.                 throw new EJBUtilsConsegnaException(this.msgDiag,MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"behaviour.servizioApplicativoNonDefinito");
  1527.             }

  1528.            

  1529.             /* ----- Controllo che servizi applicativi multipli siano collegati solo a profilo OneWay (a meno di abilitare il behaviour personalizzato) ----- */
  1530.             // Questo per poter ritornare una risposta
  1531.             if(registraNuoviMessaggiViaBehaviour==false || behaviourResponseTo==false){
  1532.                 if(behaviour_idSA_SyncResponder==null) {
  1533.                     if( (Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(richiestaApplicativa.getScenario()) == false) &&
  1534.                             (serviziApplicativiAbilitati.size() > 1)){
  1535.                         throw new EJBUtilsConsegnaException(this.msgDiag,MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"gestioneProfiloNonOneway.consegnaVersoNServiziApplicativi");
  1536.                     }else if( (Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(richiestaApplicativa.getScenario())) && (this.oneWayVersione11==false) &&
  1537.                             (this.openSPCoopState instanceof OpenSPCoopStateless) &&
  1538.                             (serviziApplicativiAbilitati.size() > 1) )  {
  1539.                         for (String nomeServizioApplicativo : serviziApplicativiAbilitati) {
  1540.                             IDServizioApplicativo idSA = new IDServizioApplicativo();
  1541.                             idSA.setNome(nomeServizioApplicativo);
  1542.                             idSA.setIdSoggettoProprietario(richiestaApplicativa.getIDServizio().getSoggettoErogatore());
  1543.                             ServizioApplicativo sappl = this.configurazionePdDReader.getServizioApplicativo(idSA,requestInfo);
  1544.                             boolean servizioApplicativoConConnettore = this.configurazionePdDReader.invocazioneServizioConConnettore(sappl);
  1545.                             boolean getMessageAbilitato = this.configurazionePdDReader.invocazioneServizioConGetMessage(sappl);
  1546.                             if(servizioApplicativoConConnettore || (getMessageAbilitato==false)){
  1547.                                 throw new EJBUtilsConsegnaException(this.msgDiag,MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"gestioneStateless.consegnaVersoNServiziApplicativi");
  1548.                             }
  1549.                         }
  1550.                     }
  1551.                 }
  1552.             }
  1553.            
  1554.             boolean EFFETTUA_SPEDIZIONE_CONSEGNA_CONTENUTI = true;
  1555.             boolean ATTENDI_ESITO_TRANSAZIONE_SINCRONA_PRIMA_DI_SPEDIRE = true;

  1556.             /* ----- Registro destinatari messaggi e spedizione messaggi ----- */
  1557.             if(behaviour_idSA_SyncResponder==null && (behaviour==null || !registraNuoviMessaggiViaBehaviour)){
  1558.                
  1559.                 List<String> serviziApplicativiAbilitatiById = DriverConfigurazioneDB.normalizeConnettoriMultpliById(serviziApplicativiAbilitati, pa);
  1560.                 if(serviziApplicativiAbilitatiById!=null && !serviziApplicativiAbilitatiById.isEmpty()) {
  1561.                     this.pddContext.addObject(org.openspcoop2.core.constants.Costanti.CONSEGNA_MULTIPLA_CONNETTORI_BY_ID, serviziApplicativiAbilitatiById);
  1562.                 }
  1563.                
  1564.                 _sendMessageToServiziApplicativi(serviziApplicativiAbilitati, soggettiRealiMappatiInUnSoggettoVirtuale,
  1565.                         richiestaApplicativa, localForwardRichiestaDelegata, gestoreMessaggi, busta, pa, repositoryBuste,
  1566.                         null,null,stateless,this.openSPCoopState,false,
  1567.                         null,
  1568.                         EFFETTUA_SPEDIZIONE_CONSEGNA_CONTENUTI,!ATTENDI_ESITO_TRANSAZIONE_SINCRONA_PRIMA_DI_SPEDIRE,
  1569.                         behaviour!=null ? behaviour.getLoadBalancer() : null, false,
  1570.                         null,
  1571.                         requestInfo);
  1572.             }
  1573.             else{
  1574.                
  1575.                 boolean attendiEsitoTransazioneSincronaPrimaDiSpedire = false;
  1576.                
  1577.                 if(behaviour_idSA_SyncResponder!=null) {
  1578.                    
  1579.                     this.pddContext.addObject(org.openspcoop2.core.constants.Costanti.CONSEGNA_MULTIPLA_SINCRONA, "true");
  1580.                    
  1581.                     attendiEsitoTransazioneSincronaPrimaDiSpedire = true;
  1582.                    
  1583.                     // TODO CHECK QUA O SOPRA RIGUARDANTE IL CASO INTEGRATINO MANAGER ???? NON PERMESSO ESSENDO SINCRONO???
  1584.                    
  1585.                     List<String> sa_list = new ArrayList<>();
  1586.                     sa_list.add(behaviour_idSA_SyncResponder.getNome());
  1587.                     _sendMessageToServiziApplicativi(sa_list, soggettiRealiMappatiInUnSoggettoVirtuale,
  1588.                             richiestaApplicativa, localForwardRichiestaDelegata, gestoreMessaggi, busta, pa, repositoryBuste,
  1589.                             null,null,stateless,this.openSPCoopState,false,
  1590.                             null,
  1591.                             EFFETTUA_SPEDIZIONE_CONSEGNA_CONTENUTI,!ATTENDI_ESITO_TRANSAZIONE_SINCRONA_PRIMA_DI_SPEDIRE,
  1592.                             null, false,
  1593.                             null,
  1594.                             requestInfo);
  1595.                 }
  1596.                
  1597.                 List<BehaviourForwardTo> forwardTo = behaviour.getForwardTo();
  1598.                 for (int i=0; i<forwardTo.size(); i++) {
  1599.                    
  1600.                     BehaviourForwardTo behaviourForwardTo = forwardTo.get(i);
  1601.                    
  1602.                     // check servizi applicativi
  1603.                     List<String> serviziApplicativiAbilitatiForwardTo = new ArrayList<>();
  1604.                     List<IDServizioApplicativo> idServiziApplicativiAbilitatiForwardTo = new ArrayList<IDServizioApplicativo>();
  1605.                     serviziApplicativiAbilitatiForwardTo.addAll(serviziApplicativiAbilitati);
  1606.                     idServiziApplicativiAbilitatiForwardTo.addAll(idServiziApplicativiAbilitati);
  1607.                     if(behaviourForwardTo.getFilter()!=null){
  1608.                         idServiziApplicativiAbilitatiForwardTo = behaviourForwardTo.getFilter().aggiornaDestinatariAbilitati(idServiziApplicativiAbilitati);
  1609.                         serviziApplicativiAbilitatiForwardTo = new ArrayList<>();
  1610.                         for (IDServizioApplicativo idServizioApplicativo : idServiziApplicativiAbilitatiForwardTo) {
  1611.                             serviziApplicativiAbilitatiForwardTo.add(idServizioApplicativo.getNome());
  1612.                         }
  1613.                     }  
  1614.                     if( serviziApplicativiAbilitatiForwardTo.size() < 1 && (behaviour_idSA_SyncResponder==null) ){
  1615.                         throw new EJBUtilsConsegnaException(this.msgDiag,MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"behaviour.servizioApplicativoNonDefinito");
  1616.                     }
  1617.                    
  1618.                     List<String> serviziApplicativiAbilitatiForwardToNormalizedById = DriverConfigurazioneDB.normalizeConnettoriMultpliById(serviziApplicativiAbilitatiForwardTo, pa);
  1619.                     if(serviziApplicativiAbilitatiForwardToNormalizedById!=null && !serviziApplicativiAbilitatiForwardToNormalizedById.isEmpty()) {
  1620.                         this.pddContext.addObject(org.openspcoop2.core.constants.Costanti.CONSEGNA_MULTIPLA_CONNETTORI_BY_ID, serviziApplicativiAbilitatiForwardToNormalizedById);
  1621.                     }
  1622.                     this.pddContext.addObject(org.openspcoop2.core.constants.Costanti.CONSEGNA_MULTIPLA_CONNETTORI, serviziApplicativiAbilitatiForwardTo.size());
  1623.                     if(serviziApplicativiAbilitatiForwardTo!=null && !serviziApplicativiAbilitatiForwardTo.isEmpty()) {
  1624.                         this.pddContext.addObject(org.openspcoop2.core.constants.Costanti.CONSEGNA_MULTIPLA_CONNETTORI_BY_SA, serviziApplicativiAbilitatiForwardTo);
  1625.                     }
  1626.                                        
  1627.                     if(behaviourImpl instanceof MultiDeliverBehaviour) {
  1628.                         MultiDeliverBehaviour multi = (MultiDeliverBehaviour) behaviourImpl;
  1629.                         if(TipoBehaviour.CONSEGNA_CON_NOTIFICHE.equals(multi.getBt())) {
  1630.                             tipiMessaggiNotificabili = org.openspcoop2.pdd.core.behaviour.built_in.multi_deliver.MultiDeliverUtils.readMessaggiNotificabili(pa, serviziApplicativiAbilitatiForwardTo);
  1631.                         }
  1632.                     }
  1633.                    
  1634.                     String idTransazione = (String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  1635.                     OpenSPCoopStateless stateBehaviour_newConnection = null;
  1636.                     OpenSPCoopStateless stateBehaviour_onlyUseConnectionFalse = null;
  1637.                     boolean oldUseConnection = false;
  1638.                     try{
  1639.                         if (stateless && !this.propertiesReader.isServerJ2EE() ) {
  1640.                             boolean createNew = true;
  1641.                             if( (this.openSPCoopState instanceof OpenSPCoopStateless)) {
  1642.                                 OpenSPCoopStateless check = (OpenSPCoopStateless) this.openSPCoopState;
  1643.                                 if(check.getConnectionDB()!=null && check.getConnectionDB().isClosed()==false) {
  1644.                                     createNew = false;
  1645.                                     stateBehaviour_onlyUseConnectionFalse = (OpenSPCoopStateless) this.openSPCoopState;
  1646.                                     oldUseConnection = check.isUseConnection();
  1647.                                     stateBehaviour_onlyUseConnectionFalse.setUseConnection(true);
  1648.                                 }
  1649.                             }
  1650.                            
  1651.                             if(createNew) {
  1652.                                 stateBehaviour_newConnection = new OpenSPCoopStateless();
  1653.                                 stateBehaviour_newConnection.setUseConnection(true);
  1654.                                 stateBehaviour_newConnection.setTempiAttraversamentoPDD(((OpenSPCoopStateless)this.openSPCoopState).getTempiAttraversamentoPDD());
  1655.                                 stateBehaviour_newConnection.setDimensioneMessaggiAttraversamentoPDD(((OpenSPCoopStateless)this.openSPCoopState).getDimensioneMessaggiAttraversamentoPDD());
  1656.                                 stateBehaviour_newConnection.setIDCorrelazioneApplicativa(((OpenSPCoopStateless)this.openSPCoopState).getIDCorrelazioneApplicativa());
  1657.                                 stateBehaviour_newConnection.setIDCorrelazioneApplicativaRisposta(((OpenSPCoopStateless)this.openSPCoopState).getIDCorrelazioneApplicativaRisposta());
  1658.                                 stateBehaviour_newConnection.setPddContext(((OpenSPCoopStateless)this.openSPCoopState).getPddContext());
  1659.                                 stateBehaviour_newConnection.initResource(this.identitaPdD, "EJBUtils.behaviour_"+pa.getBehaviour().getNome(), idTransazione);
  1660.                             }
  1661.                         }
  1662.                    
  1663.                         // registrazione messaggio
  1664.                         //  Utilizzo le utility di Memorizzazione Stateless
  1665.                         Busta bustaNewMessaggio = behaviourForwardTo.getBusta();
  1666.                         if(bustaNewMessaggio==null){
  1667.                             bustaNewMessaggio = busta.newInstance();
  1668.                             bustaNewMessaggio.setID(CostantiPdD.PREFIX_MESSAGGIO_CONNETTORE_MULTIPLO+i+CostantiPdD.SEPARATOR_MESSAGGIO_CONNETTORE_MULTIPLO+busta.getID());
  1669.                         }
  1670.                         bustaNewMessaggio.setRiferimentoMessaggio(busta.getID()); // per il timer
  1671.                         bustaNewMessaggio.addProperty(CostantiPdD.KEY_DESCRIZIONE_BEHAVIOUR, behaviourForwardTo.getDescription());
  1672.                         IOpenSPCoopState stateNuoviMessaggi = this.openSPCoopState;
  1673.                         if(stateBehaviour_newConnection!=null){
  1674.                             stateNuoviMessaggi = stateBehaviour_newConnection;
  1675.                         }
  1676.                         else if(stateBehaviour_onlyUseConnectionFalse!=null) {
  1677.                             stateNuoviMessaggi = stateBehaviour_onlyUseConnectionFalse;
  1678.                         }
  1679.                         GestoreMessaggi gestoreNewMessaggio = new GestoreMessaggi(stateNuoviMessaggi,true, bustaNewMessaggio.getID(),
  1680.                                 Costanti.INBOX,this.msgDiag,this.pddContext);
  1681.                         RepositoryBuste repositoryBusteNewMessaggio = new RepositoryBuste(stateNuoviMessaggi.getStatoRichiesta(),true, this.protocolFactory);
  1682.                        
  1683.                         OpenSPCoop2Message messaggioDaNotificare = behaviourForwardTo.getMessage();
  1684.                         if(tipiMessaggiNotificabili!=null && MessaggioDaNotificare.RISPOSTA.equals(tipiMessaggiNotificabili)) {
  1685.                             // verrà salvata dopo, la richiesta salvata deve essere un messaggio trascurabile
  1686.                             messaggioDaNotificare = messaggioDaNotificare.getFactory().createEmptyMessage(MessageType.BINARY, MessageRole.NONE);
  1687.                         }
  1688.                        
  1689.                         Timestamp oraRegistrazione = _forceSaveMessage(this.propertiesReader, gestoreNewMessaggio, null, bustaNewMessaggio, richiestaApplicativa, repositoryBusteNewMessaggio,
  1690.                                 messaggioDaNotificare,stateNuoviMessaggi,
  1691.                                 this.pddContext, this.identitaPdD); // per eventuale thread riconsegna in caso di errore
  1692.     //                  if(stateless){
  1693.     //                      ((OpenSPCoopStateless)this.openSPCoopState).setRichiestaMsg(behaviourForwardTo.getMessage());
  1694.     //                  }
  1695.                                            
  1696.                         // Inoltro messaggio
  1697.                         _sendMessageToServiziApplicativi(serviziApplicativiAbilitatiForwardTo, soggettiRealiMappatiInUnSoggettoVirtuale,
  1698.                                 richiestaApplicativa, localForwardRichiestaDelegata, gestoreNewMessaggio, bustaNewMessaggio, pa, repositoryBusteNewMessaggio,
  1699.                                 busta.getID(),behaviourForwardTo.getConfig(), stateless, stateNuoviMessaggi, (stateBehaviour_newConnection!=null),
  1700.                                 behaviourForwardTo.getMessage(),
  1701.                                 !EFFETTUA_SPEDIZIONE_CONSEGNA_CONTENUTI, attendiEsitoTransazioneSincronaPrimaDiSpedire,
  1702.                                 null, true,
  1703.                                 oraRegistrazione,
  1704.                                 requestInfo);
  1705.                        
  1706.                         // Applico modifiche effettuate dal modulo Consegna
  1707.                         if (stateless && !this.propertiesReader.isServerJ2EE() ) {
  1708.                             if(stateBehaviour_newConnection!=null) {
  1709.                                 if(stateBehaviour_newConnection.resourceReleased()){
  1710.                                     // il modulo di consegna rilascia la risorsa
  1711.                                     stateBehaviour_newConnection.updateResource(idTransazione);
  1712.                                 }
  1713.                                 stateBehaviour_newConnection.commit();
  1714.                             }
  1715.                             else if(stateBehaviour_onlyUseConnectionFalse!=null) {
  1716.                                 stateBehaviour_onlyUseConnectionFalse.commit();
  1717.                             }
  1718.                         }
  1719.                        
  1720.                     }finally{
  1721.                         if (stateless && !this.propertiesReader.isServerJ2EE() ) {
  1722.                             if(stateBehaviour_newConnection!=null){
  1723.                                 stateBehaviour_newConnection.releaseResource();
  1724.                             }
  1725.                             else if(stateBehaviour_onlyUseConnectionFalse!=null) {
  1726.                                 stateBehaviour_onlyUseConnectionFalse.setUseConnection(oldUseConnection);
  1727.                             }
  1728.                         }
  1729.                     }
  1730.                 }
  1731.                    
  1732.             }

  1733.            
  1734.             return behaviour;
  1735.            
  1736.         } catch (EJBUtilsConsegnaException e) {
  1737.             throw e;
  1738.         } catch (Exception e) {
  1739.             this.log.error("Spedizione->ConsegnaContenutiApplicativi(RichiestaApplicativa) non riuscita",e);
  1740.             this.log.error("EJBUtils.sendToConsegnaContenutiApplicativi(RichiestaApplicativa)",e);
  1741.             this.msgDiag.logErroreGenerico(e, "EJBUtils.sendToConsegnaContenutiApplicativi(RichiestaApplicativa)");
  1742.             throw new EJBUtilsException("EJBUtils.sendToConsegnaContenutiApplicativi error: "+e.getMessage(),e);
  1743.         }
  1744.     }


  1745.     @SuppressWarnings("deprecation")
  1746.     private static void overwriteIdSoggetto(IDServizio idServizio, IDSoggetto idSoggetto){
  1747.         idServizio.setSoggettoErogatore(idSoggetto);
  1748.     }

  1749.     private void _sendMessageToServiziApplicativi(List<String> serviziApplicativi, SoggettoVirtuale soggettiRealiMappatiInUnSoggettoVirtuale,
  1750.             RichiestaApplicativa richiestaApplicativaParam, RichiestaDelegata localForwardRichiestaDelegata,
  1751.             GestoreMessaggi gestoreMessaggi, Busta busta, PortaApplicativa pa, RepositoryBuste repositoryBuste,
  1752.             String idBustaPreBehaviourNewMessage,BehaviourForwardToConfiguration behaviourForwardToConfiguration,
  1753.             boolean stateless,IOpenSPCoopState state,boolean releseaResource,
  1754.             OpenSPCoop2Message requestMessageNullable,
  1755.             boolean spedizioneConsegnaContenuti, boolean attendiEsitoTransazioneSincronaPrimaDiSpedire,
  1756.             BehaviourLoadBalancer loadBalancer, boolean presaInCarico,
  1757.             Timestamp dataRegistrazioneMessaggio,
  1758.             RequestInfo requestInfo) throws Exception{
  1759.        
  1760.         // Eventuale indicazione per la registrazione via stateless
  1761.         boolean registrazioneMessaggioPerStatelessEffettuata = false;
  1762.        
  1763.         boolean gestioneSolamenteConIntegrationManager = true;
  1764.        
  1765.         Map<String, Boolean> mapServizioApplicativoConConnettore = new HashMap<String, Boolean>();
  1766.         Map<String, Boolean> mapSbustamentoSoap = new HashMap<String, Boolean>();
  1767.         Map<String, Boolean> mapSbustamentoInformazioniProtocollo = new HashMap<String, Boolean>();
  1768.         Map<String, Boolean> mapGetMessage = new HashMap<String, Boolean>();
  1769.         Map<String, String> mapTipoConsegna = new HashMap<>();
  1770.         Map<String, Timestamp> mapOraRegistrazione = new HashMap<String, Timestamp>();
  1771.         Map<String, ConsegnaContenutiApplicativiMessage> mapConsegnaContenutiApplicativiMessage = new HashMap<String, ConsegnaContenutiApplicativiMessage>();
  1772.        
  1773.         RichiestaApplicativa richiestaApplicativa = null;
  1774.         if(richiestaApplicativaParam!=null) {
  1775.             richiestaApplicativa = (RichiestaApplicativa) richiestaApplicativaParam.clone();
  1776.         }
  1777.        
  1778.         String nomePorta = null;
  1779.         if(richiestaApplicativa!=null && richiestaApplicativa.getIdPortaApplicativa()!=null){
  1780.             nomePorta = richiestaApplicativa.getIdPortaApplicativa().getNome();
  1781.         }
  1782.        
  1783.         // Fase di Registrazione
  1784.         for (String servizioApplicativo : serviziApplicativi) {

  1785.             // effettuo correzioni dovute al Soggetto Virtuale
  1786.             if(soggettiRealiMappatiInUnSoggettoVirtuale!=null){
  1787.                
  1788.                 String oldDominio = richiestaApplicativa.getIDServizio().getSoggettoErogatore().getCodicePorta();
  1789.                 overwriteIdSoggetto(richiestaApplicativa.getIDServizio(), soggettiRealiMappatiInUnSoggettoVirtuale.getSoggettoReale(servizioApplicativo));
  1790.                 richiestaApplicativa.getIDServizio().getSoggettoErogatore().setCodicePorta(oldDominio);
  1791.                
  1792.                 richiestaApplicativa.setIdPortaApplicativa(soggettiRealiMappatiInUnSoggettoVirtuale.getIDPortaApplicativa(servizioApplicativo));
  1793.                
  1794.                 servizioApplicativo = soggettiRealiMappatiInUnSoggettoVirtuale.getNomeServizioApplicativo(servizioApplicativo);
  1795.             }
  1796.            
  1797.             this.msgDiag.highDebug("[EJBUtils] Creazione ObjectMessage for send nell'infrastruttura.");
  1798.             ConsegnaContenutiApplicativiMessage consegnaMSG = new ConsegnaContenutiApplicativiMessage();
  1799.             consegnaMSG.setBusta(busta);
  1800.             consegnaMSG.setOneWayVersione11(this.oneWayVersione11);
  1801.             consegnaMSG.setStateless(this.portaDiTipoStateless_esclusoOneWay11);
  1802.             consegnaMSG.setImplementazionePdDSoggettoMittente(this.implementazionePdDSoggettoMittente);
  1803.             consegnaMSG.setImplementazionePdDSoggettoDestinatario(this.implementazionePdDSoggettoDestinatario);
  1804.             consegnaMSG.setPddContext(this.pddContext);
  1805.             consegnaMSG.setRichiestaDelegata(localForwardRichiestaDelegata);
  1806.            
  1807.             String coda = null;
  1808.             String priorita = null;
  1809.             boolean schedulingNonAttivo = false;
  1810.             if(presaInCarico) {
  1811.                 coda = CostantiPdD.TIMER_RICONSEGNA_CONTENUTI_APPLICATIVI_CODA_DEFAULT;
  1812.                 priorita = CostantiPdD.TIMER_RICONSEGNA_CONTENUTI_APPLICATIVI_PRIORITA_DEFAULT;
  1813.             }
  1814.            
  1815.             boolean gestioneTramiteConnettoriMultipli = false;
  1816.             if(idBustaPreBehaviourNewMessage!=null || behaviourForwardToConfiguration!=null) {
  1817.                 gestioneTramiteConnettoriMultipli = true;
  1818.                 ConsegnaContenutiApplicativiBehaviourMessage behaviourMsg = new ConsegnaContenutiApplicativiBehaviourMessage();
  1819.                 behaviourMsg.setIdMessaggioPreBehaviour(idBustaPreBehaviourNewMessage);
  1820.                 behaviourMsg.setBehaviourForwardToConfiguration(behaviourForwardToConfiguration);
  1821.                 IdTransazioneApplicativoServer idTransazioneApplicativoServer = new IdTransazioneApplicativoServer();
  1822.                 idTransazioneApplicativoServer.setIdTransazione(PdDContext.getValue(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE, this.pddContext));
  1823.                 idTransazioneApplicativoServer.setServizioApplicativoErogatore(servizioApplicativo);
  1824.                 if(pa!=null && pa.getServizioApplicativoList()!=null) {
  1825.                     for (PortaApplicativaServizioApplicativo pasa : pa.getServizioApplicativoList()) {
  1826.                         if(pasa.getNome().equals(servizioApplicativo)) {
  1827.                             if(pasa.getDatiConnettore()!=null) {
  1828.                                 idTransazioneApplicativoServer.setConnettoreNome(pasa.getDatiConnettore().getNome());
  1829.                                 if(presaInCarico) {
  1830.                                     if(pasa.getDatiConnettore().getCoda()!=null) {
  1831.                                         coda = pasa.getDatiConnettore().getCoda();
  1832.                                     }
  1833.                                     if(pasa.getDatiConnettore().getPriorita()!=null) {
  1834.                                         priorita = pasa.getDatiConnettore().getPriorita();
  1835.                                     }
  1836.                                     if(org.openspcoop2.core.config.constants.StatoFunzionalita.DISABILITATO.equals(pasa.getDatiConnettore().getScheduling())) {
  1837.                                         schedulingNonAttivo = true;
  1838.                                     }
  1839.                                 }
  1840.                             }
  1841.                             ConfigurazioneGestioneConsegnaNotifiche configGestioneConsegna = MultiDeliverUtils.read(pasa);
  1842.                             GestioneErrore gestioneErroreBehaviour = GestioneConsegnaNotificheUtils.toGestioneErrore(configGestioneConsegna);      
  1843.                             behaviourMsg.setGestioneErrore(gestioneErroreBehaviour);
  1844.                             break;
  1845.                         }
  1846.                     }
  1847.                 }
  1848.                 behaviourMsg.setIdTransazioneApplicativoServer(idTransazioneApplicativoServer);
  1849.                 consegnaMSG.setBehaviour(behaviourMsg);
  1850.                
  1851.                 // aggiorno pddContext per evitare che eventuali salvataggi influenzino la transazione
  1852.                 consegnaMSG.setPddContext(this.pddContext!=null ? (PdDContext) this.pddContext.clone() : null);
  1853.             }
  1854.            
  1855.             if(loadBalancer!=null) {
  1856.                 consegnaMSG.setLoadBalancer(loadBalancer);
  1857.             }
  1858.            
  1859.             // Aggiungo costante servizio applicativo
  1860.             this.msgDiag.addKeyword(CostantiPdD.KEY_SA_EROGATORE, servizioApplicativo);
  1861.            
  1862.             // identificativo Porta Applicativa
  1863.             richiestaApplicativa.setServizioApplicativo(servizioApplicativo);
  1864.            
  1865.             IDServizioApplicativo idSA = new IDServizioApplicativo();
  1866.             idSA.setNome(servizioApplicativo);
  1867.             idSA.setIdSoggettoProprietario(richiestaApplicativa.getIDServizio().getSoggettoErogatore());
  1868.             ServizioApplicativo sappl = this.configurazionePdDReader.getServizioApplicativo(idSA, requestInfo);

  1869.             if(!presaInCarico) {
  1870.                 // altrimenti il diagnostico deve finire nella parte "presa in carico"
  1871.                 this.msgDiag.setServizioApplicativo(servizioApplicativo);
  1872.             }

  1873.             // Raccolgo dati per la registrazione
  1874.             boolean servizioApplicativoConConnettore = true; // la ricezione contenuti asincroni lo deve obbligatoriamente contenere
  1875.             boolean getMessageAbilitato = false; // servizio getMessage non utilizzabile per ricezione contenuti asincroni
  1876.             boolean sbustamento_soap = false;
  1877.             boolean sbustamento_informazioni_protocollo = true;
  1878.             if( Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_POLLING.equals(richiestaApplicativa.getScenario())  ){
  1879.                 // RICEZIONE CONTENUTI ASINCRONI: lettura parametri
  1880.                 sbustamento_soap = this.configurazionePdDReader.consegnaRispostaAsincronaConSbustamento(sappl);
  1881.                 sbustamento_informazioni_protocollo =
  1882.                     this.configurazionePdDReader.consegnaRispostaAsincronaConSbustamentoInformazioniProtocollo(sappl);
  1883.                 servizioApplicativoConConnettore = this.configurazionePdDReader.consegnaRispostaAsincronaConConnettore(sappl);
  1884.             }else{
  1885.                 // INVOCAZIONE SERVIZIO: lettura parametri
  1886.                 servizioApplicativoConConnettore = this.configurazionePdDReader.invocazioneServizioConConnettore(sappl);
  1887.                 sbustamento_soap = this.configurazionePdDReader.invocazioneServizioConSbustamento(sappl);
  1888.                 sbustamento_informazioni_protocollo =
  1889.                     this.configurazionePdDReader.invocazioneServizioConSbustamentoInformazioniProtocollo(sappl);
  1890.                 getMessageAbilitato = this.configurazionePdDReader.invocazioneServizioConGetMessage(sappl);
  1891.             }
  1892.             // refresh info di sbustamento in base alla configurazione del behaviour
  1893.             if(behaviourForwardToConfiguration!=null){
  1894.                 if(behaviourForwardToConfiguration.getSbustamentoInformazioniProtocollo()!=null){
  1895.                     if(StatoFunzionalita.ABILITATA.equals(behaviourForwardToConfiguration.getSbustamentoInformazioniProtocollo())){
  1896.                         sbustamento_informazioni_protocollo = true;
  1897.                     }
  1898.                     else if(StatoFunzionalita.DISABILITATA.equals(behaviourForwardToConfiguration.getSbustamentoInformazioniProtocollo())){
  1899.                         sbustamento_informazioni_protocollo = false;
  1900.                     }
  1901.                 }
  1902.                 if(behaviourForwardToConfiguration.getSbustamentoSoap()!=null){
  1903.                     if(StatoFunzionalita.ABILITATA.equals(behaviourForwardToConfiguration.getSbustamentoSoap())){
  1904.                         sbustamento_soap = true;
  1905.                     }
  1906.                     else if(StatoFunzionalita.DISABILITATA.equals(behaviourForwardToConfiguration.getSbustamentoSoap())){
  1907.                         sbustamento_soap = false;
  1908.                     }
  1909.                 }
  1910.             }
  1911.             if(localForwardRichiestaDelegata!=null){
  1912.                 // Se vi e' stato un local forward, il protocollo non sussiste.
  1913.                 sbustamento_informazioni_protocollo = false;
  1914.             }
  1915.             // check di incoerenza
  1916.             if( getMessageAbilitato==false && servizioApplicativoConConnettore==false ){
  1917.                 throw new EJBUtilsConsegnaException(this.msgDiag,MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"consegnaNonDefinita");
  1918.             }
  1919.             if((state instanceof OpenSPCoopStateless) && (this.oneWayVersione11==false) && getMessageAbilitato && servizioApplicativoConConnettore
  1920.                     && (idBustaPreBehaviourNewMessage==null)){
  1921.                 throw new EJBUtilsConsegnaException(this.msgDiag,MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"gestioneStateless.integrationManager");
  1922.             }
  1923.             if(!servizioApplicativoConConnettore){
  1924.                 // CONNETTORE non presente
  1925.                 // un connettore deve per forza essere presente se:
  1926.                 // - profilo sincrono
  1927.                 // - profilo asincrono e ricevuta applicativa abilitata
  1928.                 // - profilo asincrono asimmetrico richiesta e ricevuta applicativa abilitata
  1929.                 // - polling asincrono asimmetrico (richiesta-stato)
  1930.                 if(idBustaPreBehaviourNewMessage==null){
  1931.                     if(ProfiloDiCollaborazione.SINCRONO.equals(busta.getProfiloDiCollaborazione())){
  1932.                         throw new EJBUtilsConsegnaException(this.msgDiag,MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"trasmissioneSincrona.servizioNonUtilizzabile");
  1933.                     }
  1934.                     else if(richiestaApplicativa.isRicevutaAsincrona() &&
  1935.                             (ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(busta.getProfiloDiCollaborazione()) ||
  1936.                                     ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(busta.getProfiloDiCollaborazione()) ) ){      
  1937.                         throw new EJBUtilsConsegnaException(this.msgDiag,MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"gestioneProfiloAsincrono.servizioNonUtilizzabile");
  1938.                     }else if( Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_POLLING.equals(richiestaApplicativa.getScenario())  ){
  1939.                         throw new EJBUtilsConsegnaException("(Polling AsincronoAsimmetrico) "+this.msgDiag.getMessaggio_replaceKeywords(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"trasmissioneSincrona.servizioNonUtilizzabile"),
  1940.                                 this.msgDiag.getLivello(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"trasmissioneSincrona.servizioNonUtilizzabile"),
  1941.                                 this.msgDiag.getCodice(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"trasmissioneSincrona.servizioNonUtilizzabile"));
  1942.                     }
  1943.                 }
  1944.             }
  1945.            
  1946.             // Registrazione dati per la gestione del Messaggio
  1947.             String tipoConsegna = GestoreMessaggi.CONSEGNA_TRAMITE_INTEGRATION_MANAGER;
  1948.             if(servizioApplicativoConConnettore)
  1949.                 tipoConsegna = GestoreMessaggi.CONSEGNA_TRAMITE_CONNETTORE;

  1950.            
  1951.             // oraRegistrazione
  1952.                        
  1953.             Timestamp oraRegistrazioneMessaggio = null;
  1954.             if(dataRegistrazioneMessaggio!=null) {
  1955.                 oraRegistrazioneMessaggio = dataRegistrazioneMessaggio;
  1956.             }
  1957.             else {
  1958.                 oraRegistrazioneMessaggio = gestoreMessaggi.getOraRegistrazioneMessaggio();
  1959.             }

  1960.            
  1961.             // Registro Destinatario
  1962.             if(idBustaPreBehaviourNewMessage!=null){
  1963.                 // Forzo oneway1.1 per farlo registrare anche se siamo in stateless puro
  1964.                 gestoreMessaggi.setOneWayVersione11(true);
  1965.             }
  1966.             gestoreMessaggi.registraDestinatarioMessaggio(servizioApplicativo,
  1967.                     sbustamento_soap,sbustamento_informazioni_protocollo,
  1968.                     getMessageAbilitato,tipoConsegna,oraRegistrazioneMessaggio, nomePorta,
  1969.                     attendiEsitoTransazioneSincronaPrimaDiSpedire, (servizioApplicativoConConnettore && !spedizioneConsegnaContenuti),
  1970.                     coda, priorita, schedulingNonAttivo);
  1971.            
  1972.             mapServizioApplicativoConConnettore.put(servizioApplicativo, servizioApplicativoConConnettore);
  1973.             mapSbustamentoSoap.put(servizioApplicativo, sbustamento_soap);
  1974.             mapSbustamentoInformazioniProtocollo.put(servizioApplicativo, sbustamento_informazioni_protocollo);
  1975.             mapGetMessage.put(servizioApplicativo, getMessageAbilitato);
  1976.             mapTipoConsegna.put(servizioApplicativo, tipoConsegna);
  1977.             mapOraRegistrazione.put(servizioApplicativo, oraRegistrazioneMessaggio);
  1978.             mapConsegnaContenutiApplicativiMessage.put(servizioApplicativo, consegnaMSG);
  1979.            
  1980.             if(getMessageAbilitato && !servizioApplicativoConConnettore && !gestioneTramiteConnettoriMultipli) {
  1981.                 ConsegnaContenutiApplicativiBehaviourMessage behaviourMsg = new ConsegnaContenutiApplicativiBehaviourMessage();
  1982.                 //behaviourMsg.setIdMessaggioPreBehaviour(idBustaPreBehaviourNewMessage);
  1983.                 //behaviourMsg.setBehaviourForwardToConfiguration(behaviourForwardToConfiguration);
  1984.                 IdTransazioneApplicativoServer idTransazioneApplicativoServer = new IdTransazioneApplicativoServer();
  1985.                 idTransazioneApplicativoServer.setIdTransazione(PdDContext.getValue(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE, this.pddContext));
  1986.                 idTransazioneApplicativoServer.setServizioApplicativoErogatore(servizioApplicativo);
  1987.                 idTransazioneApplicativoServer.setConnettoreNome(CostantiConfigurazione.NOME_CONNETTORE_DEFAULT);
  1988.                 behaviourMsg.setIdTransazioneApplicativoServer(idTransazioneApplicativoServer);
  1989.                 consegnaMSG.setBehaviour(behaviourMsg);    
  1990.                 // aggiorno pddContext per evitare che eventuali salvataggi influenzino la transazione
  1991.                 consegnaMSG.setPddContext(this.pddContext!=null ? (PdDContext) this.pddContext.clone() : null);
  1992.                 if(this.pddContext!=null) {
  1993.                     this.pddContext.addObject(org.openspcoop2.core.constants.Costanti.MESSAGE_BOX, "true");
  1994.                 }
  1995.             }
  1996.         }
  1997.        
  1998.        
  1999.         // Applico modifiche della registrazione
  2000.         boolean registrazioneDestinatarioEffettuataPerViaBehaviour = false;
  2001.         if(idBustaPreBehaviourNewMessage!=null){
  2002.             if (stateless && !this.propertiesReader.isServerJ2EE() ) {
  2003.                 state.commit();
  2004.                 if(releseaResource) {
  2005.                     state.releaseResource();
  2006.                 }
  2007.                 registrazioneDestinatarioEffettuataPerViaBehaviour = true;
  2008.             }
  2009.         }
  2010.        
  2011.        
  2012.         // Effettuo spedizione
  2013.        
  2014.         EJBUtilsMessaggioInConsegna messaggiInConsegna = new EJBUtilsMessaggioInConsegna();
  2015.            
  2016.         messaggiInConsegna.setServiziApplicativi(serviziApplicativi);
  2017.         messaggiInConsegna.setSoggettiRealiMappatiInUnSoggettoVirtuale(soggettiRealiMappatiInUnSoggettoVirtuale);
  2018.         messaggiInConsegna.setRichiestaApplicativa(richiestaApplicativa);
  2019.        
  2020.         messaggiInConsegna.setMapServizioApplicativoConConnettore(mapServizioApplicativoConConnettore);
  2021.         messaggiInConsegna.setMapSbustamentoSoap(mapSbustamentoSoap);
  2022.         messaggiInConsegna.setMapSbustamentoInformazioniProtocollo(mapSbustamentoInformazioniProtocollo);
  2023.         messaggiInConsegna.setMapGetMessage(mapGetMessage);
  2024.         messaggiInConsegna.setMapTipoConsegna(mapTipoConsegna);
  2025.         messaggiInConsegna.setMapOraRegistrazione(mapOraRegistrazione);
  2026.         messaggiInConsegna.setMapConsegnaContenutiApplicativiMessage(mapConsegnaContenutiApplicativiMessage);
  2027.        
  2028.         messaggiInConsegna.setRegistrazioneMessaggioPerStatelessEffettuata(registrazioneMessaggioPerStatelessEffettuata);
  2029.         messaggiInConsegna.setGestioneSolamenteConIntegrationManager(gestioneSolamenteConIntegrationManager);
  2030.         messaggiInConsegna.setRegistrazioneDestinatarioEffettuataPerViaBehaviour(registrazioneDestinatarioEffettuataPerViaBehaviour);
  2031.         messaggiInConsegna.setStateless(stateless);
  2032.         messaggiInConsegna.setOneWayVersione11(this.oneWayVersione11);
  2033.        
  2034.         messaggiInConsegna.setIdBustaPreBehaviourNewMessage(idBustaPreBehaviourNewMessage);
  2035.         messaggiInConsegna.setBusta(busta);
  2036.         messaggiInConsegna.setNomePorta(nomePorta);
  2037.        
  2038.         messaggiInConsegna.setRequestMessageNullable(requestMessageNullable);
  2039.        
  2040.         messaggiInConsegna.setOraRegistrazioneMessaggio(dataRegistrazioneMessaggio);
  2041.        
  2042.         if(attendiEsitoTransazioneSincronaPrimaDiSpedire) {
  2043.             this.pddContext.addObject(CostantiPdD.TIMER_RICONSEGNA_CONTENUTI_APPLICATIVI_MESSAGGI_SPEDIRE, messaggiInConsegna);
  2044.         }
  2045.         else {
  2046.             EJBUtilsMessaggioInConsegnaEsito esito = sendMessages(this.log, this.msgDiag, state, this.idSessione,
  2047.                     repositoryBuste, gestoreMessaggi, this.nodeSender,
  2048.                     this.protocolFactory, this.identitaPdD, nomePorta, messaggiInConsegna,
  2049.                     spedizioneConsegnaContenuti,
  2050.                     this.pddContext,
  2051.                     this.configurazionePdDReader);
  2052.        
  2053.             this.gestioneSolamenteConIntegrationManager = esito.isGestioneSolamenteConIntegrationManager();
  2054.             this.gestioneStatelessConIntegrationManager = esito.isGestioneStatelessConIntegrationManager();
  2055.         }
  2056.        
  2057.     }
  2058.    
  2059.     public static EJBUtilsMessaggioInConsegnaEsito sendMessages(Logger log, MsgDiagnostico msgDiag, IOpenSPCoopState state, String idSessioneParam,
  2060.             RepositoryBuste repositoryBuste, GestoreMessaggi gestoreMessaggi, INodeSender nodeSender,
  2061.             IProtocolFactory<?> protocolFactory,IDSoggetto identitaPdD, String idModulo,
  2062.             EJBUtilsMessaggioInConsegna message,
  2063.             boolean spedizioneConsegnaContenuti,
  2064.             PdDContext pddContext,
  2065.             ConfigurazionePdDManager configurazionePdDManager) throws Exception {
  2066.        
  2067.         RequestInfo requestInfo = null;
  2068.         if(pddContext!=null && pddContext.containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
  2069.             requestInfo = (RequestInfo) pddContext.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  2070.         }
  2071.        
  2072.         EJBUtilsMessaggioInConsegnaEsito esito = new EJBUtilsMessaggioInConsegnaEsito();
  2073.        
  2074.         OpenSPCoop2Properties propertiesReader = OpenSPCoop2Properties.getInstance();
  2075.        
  2076.         List<String> serviziApplicativi = message.getServiziApplicativi();
  2077.         SoggettoVirtuale soggettiRealiMappatiInUnSoggettoVirtuale = message.getSoggettiRealiMappatiInUnSoggettoVirtuale();
  2078.         RichiestaApplicativa richiestaApplicativa = message.getRichiestaApplicativa();
  2079.        
  2080.         Map<String, Boolean> mapServizioApplicativoConConnettore = message.getMapServizioApplicativoConConnettore();
  2081.         Map<String, Boolean> mapSbustamentoSoap = message.getMapSbustamentoSoap();
  2082.         Map<String, Boolean> mapSbustamentoInformazioniProtocollo = message.getMapSbustamentoInformazioniProtocollo();
  2083.         Map<String, Boolean> mapGetMessage = message.getMapGetMessage();
  2084.         Map<String, String> mapTipoConsegna = message.getMapTipoConsegna();
  2085.         Map<String, Timestamp> mapOraRegistrazione = message.getMapOraRegistrazione();
  2086.         Map<String, ConsegnaContenutiApplicativiMessage> mapConsegnaContenutiApplicativiMessage = message.getMapConsegnaContenutiApplicativiMessage();
  2087.        
  2088.         boolean registrazioneMessaggioPerStatelessEffettuata = message.isRegistrazioneMessaggioPerStatelessEffettuata();
  2089.         boolean gestioneSolamenteConIntegrationManager = message.isGestioneSolamenteConIntegrationManager();
  2090.         boolean registrazioneDestinatarioEffettuataPerViaBehaviour = message.isRegistrazioneDestinatarioEffettuataPerViaBehaviour();
  2091.         boolean stateless = message.isStateless();
  2092.         boolean oneWayVersione11 = message.isOneWayVersione11();
  2093.        
  2094.         String idBustaPreBehaviourNewMessage = message.getIdBustaPreBehaviourNewMessage();
  2095.         Busta busta = message.getBusta();
  2096.         String nomePorta = message.getNomePorta();
  2097.        
  2098.         OpenSPCoop2Message requestMessageNullable = message.getRequestMessageNullable();
  2099.        
  2100.         Date dataRegistrazioneMessaggio = message.getOraRegistrazioneMessaggio();
  2101.        
  2102.         // Fase di Consegna
  2103.         for (String servizioApplicativo : serviziApplicativi) {
  2104.            
  2105.             // effettuo correzioni dovute al Soggetto Virtuale
  2106.             if(soggettiRealiMappatiInUnSoggettoVirtuale!=null){
  2107.                
  2108.                 String oldDominio = richiestaApplicativa.getIDServizio().getSoggettoErogatore().getCodicePorta();
  2109.                 overwriteIdSoggetto(richiestaApplicativa.getIDServizio(), soggettiRealiMappatiInUnSoggettoVirtuale.getSoggettoReale(servizioApplicativo));
  2110.                 richiestaApplicativa.getIDServizio().getSoggettoErogatore().setCodicePorta(oldDominio);
  2111.                
  2112.                 richiestaApplicativa.setIdPortaApplicativa(soggettiRealiMappatiInUnSoggettoVirtuale.getIDPortaApplicativa(servizioApplicativo));
  2113.                
  2114.                 servizioApplicativo = soggettiRealiMappatiInUnSoggettoVirtuale.getNomeServizioApplicativo(servizioApplicativo);
  2115.             }
  2116.            
  2117.             boolean servizioApplicativoConConnettore = mapServizioApplicativoConConnettore.get(servizioApplicativo);
  2118.             boolean sbustamento_soap = mapSbustamentoSoap.get(servizioApplicativo);
  2119.             boolean sbustamento_informazioni_protocollo = mapSbustamentoInformazioniProtocollo.get(servizioApplicativo);
  2120.             boolean getMessageAbilitato = mapGetMessage.get(servizioApplicativo);
  2121.             String tipoConsegna = mapTipoConsegna.get(servizioApplicativo);
  2122.             Timestamp oraRegistrazioneMessaggio = mapOraRegistrazione.get(servizioApplicativo);
  2123.             ConsegnaContenutiApplicativiMessage consegnaMSG = mapConsegnaContenutiApplicativiMessage.get(servizioApplicativo);
  2124.                    
  2125.             // Aggiungo costante servizio applicativo
  2126.             msgDiag.addKeyword(CostantiPdD.KEY_SA_EROGATORE, servizioApplicativo);
  2127.            
  2128.             // identificativo Porta Applicativa
  2129.             richiestaApplicativa.setServizioApplicativo(servizioApplicativo);
  2130.                        
  2131.             // Preparo TransazioneApplicativoServer transazioneApplicativoServer
  2132.             TransazioneApplicativoServer transazioneApplicativoServer = null;
  2133.             if(consegnaMSG.getBehaviour()!=null && consegnaMSG.getBehaviour().getIdTransazioneApplicativoServer()!=null) {
  2134.                
  2135.                 transazioneApplicativoServer = new TransazioneApplicativoServer();
  2136.                 transazioneApplicativoServer.setIdTransazione(consegnaMSG.getBehaviour().getIdTransazioneApplicativoServer().getIdTransazione());
  2137.                 transazioneApplicativoServer.setServizioApplicativoErogatore(consegnaMSG.getBehaviour().getIdTransazioneApplicativoServer().getServizioApplicativoErogatore());
  2138.                 transazioneApplicativoServer.setConnettoreNome(consegnaMSG.getBehaviour().getIdTransazioneApplicativoServer().getConnettoreNome());
  2139.                 if(dataRegistrazioneMessaggio!=null) {
  2140.                     transazioneApplicativoServer.setDataRegistrazione(dataRegistrazioneMessaggio);
  2141.                 }
  2142.                 else {
  2143.                     transazioneApplicativoServer.setDataRegistrazione(DateManager.getDate());
  2144.                 }
  2145.                 transazioneApplicativoServer.setProtocollo(protocolFactory.getProtocol());
  2146.                 transazioneApplicativoServer.setDataAccettazioneRichiesta(DateManager.getDate());
  2147.                 if(requestMessageNullable!=null) {
  2148.                     transazioneApplicativoServer.setRichiestaUscitaBytes(requestMessageNullable.getOutgoingMessageContentLength());
  2149.                 }
  2150.                 transazioneApplicativoServer.setIdentificativoMessaggio(consegnaMSG.getBusta().getID());
  2151.                 transazioneApplicativoServer.setClusterIdPresaInCarico(propertiesReader.getClusterId(false));
  2152.                 transazioneApplicativoServer.setConsegnaTrasparente(servizioApplicativoConConnettore);
  2153.                 transazioneApplicativoServer.setConsegnaIntegrationManager(getMessageAbilitato);
  2154.            
  2155.                 if(transazioneApplicativoServer!=null) {
  2156.                    
  2157.                     try {
  2158.                         GestoreConsegnaMultipla.getInstance().safeCreate(transazioneApplicativoServer, richiestaApplicativa.getIdPortaApplicativa(), state, requestInfo, pddContext);
  2159.                     }catch(Throwable t) {
  2160.                         log.error("["+transazioneApplicativoServer.getIdTransazione()+"]["+transazioneApplicativoServer.getServizioApplicativoErogatore()+"] Errore durante il salvataggio delle informazioni relative al servizio applicativo: "+t.getMessage(),t);
  2161.                     }
  2162.                    
  2163.                 }
  2164.             }
  2165.            
  2166.             if(transazioneApplicativoServer==null) {
  2167.                 // altrimenti il diagnostico deve finire nella parte "presa in carico"
  2168.                 msgDiag.setServizioApplicativo(servizioApplicativo);
  2169.             }
  2170.            
  2171.             // Spedisco al modulo ConsegnaContenutiApplicativi, solo se e' presente una definizione di servizio-applicativo
  2172.             if(servizioApplicativoConConnettore){
  2173.                
  2174.                 gestioneSolamenteConIntegrationManager = false;
  2175.                
  2176.                 consegnaMSG.setRichiestaApplicativa(richiestaApplicativa);

  2177.                 if(spedizioneConsegnaContenuti) {
  2178.                     if (!stateless ||
  2179.                             (propertiesReader.isServerJ2EE() && idBustaPreBehaviourNewMessage!=null)
  2180.                         ) {
  2181.                         if ( oneWayVersione11 ) {
  2182.                             OpenSPCoopStateless statelessSerializzabile = ((OpenSPCoopStateless) state).rendiSerializzabile();
  2183.                             consegnaMSG.setOpenspcoopstate(statelessSerializzabile);
  2184.                         }
  2185.                
  2186.                         try{
  2187.                             String idSessione = idSessioneParam;
  2188.                             if(idBustaPreBehaviourNewMessage!=null){
  2189.                                 idSessione = busta.getID();
  2190.                             }
  2191.                             nodeSender.send(consegnaMSG, org.openspcoop2.pdd.mdb.ConsegnaContenutiApplicativi.ID_MODULO, msgDiag,
  2192.                                     identitaPdD, idModulo, idSessione, gestoreMessaggi);
  2193.                         } catch (Exception e) {
  2194.                             msgDiag.logErroreGenerico(e, "EJBUtils.sendToConsegnaContenutiApplicativi(RichiestaApplicativa).senderJMS");
  2195.                             throw e;
  2196.                         }
  2197.                     }
  2198.    
  2199.                     else {
  2200.                         ((OpenSPCoopStateless)state).setMessageLib(consegnaMSG);
  2201.                         ((OpenSPCoopStateless)state).setDestinatarioRequestMsgLib(ConsegnaContenutiApplicativi.ID_MODULO);
  2202.                                
  2203.                         if(idBustaPreBehaviourNewMessage!=null){                        
  2204.                             ConsegnaContenutiApplicativi lib = new ConsegnaContenutiApplicativi(log);
  2205.                             EsitoLib result = lib.onMessage(state, configurazionePdDManager);
  2206.                             log.debug("Invocato ConsegnaContenutiApplicativi per ["+busta.getID()+"] con esito: "+result.getStatoInvocazione(),result.getErroreNonGestito());
  2207.                         }
  2208.                     }
  2209.                 }
  2210.                 else {
  2211.                    
  2212.                     if(transazioneApplicativoServer!=null) {
  2213.                         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"queue.messaggioSchedulato");
  2214.                     }
  2215.                    
  2216.                 }
  2217.                
  2218.             }else{
  2219.                
  2220.                 if( !registrazioneDestinatarioEffettuataPerViaBehaviour && (state instanceof OpenSPCoopStateless) && (oneWayVersione11==false) ){
  2221.                     esito.setGestioneStatelessConIntegrationManager(true);
  2222.                     if(idBustaPreBehaviourNewMessage==null && registrazioneMessaggioPerStatelessEffettuata==false){
  2223.                         //  Memorizzazione Stateless
  2224.                         _forceSaveMessage(propertiesReader, gestoreMessaggi, gestoreMessaggi.getOraRegistrazioneMessaggio(), busta, richiestaApplicativa, repositoryBuste,
  2225.                                 ((OpenSPCoopStateless)state).getRichiestaMsg(),state,
  2226.                                 pddContext, identitaPdD);
  2227.                         registrazioneMessaggioPerStatelessEffettuata=true;
  2228.                     }
  2229.                     // Forzo oneway1.1 per farlo registrare anche se siamo in stateless puro
  2230.                     gestoreMessaggi.setOneWayVersione11(true);
  2231.                     gestoreMessaggi.registraDestinatarioMessaggio(servizioApplicativo,
  2232.                             sbustamento_soap,sbustamento_informazioni_protocollo,
  2233.                             getMessageAbilitato,tipoConsegna,oraRegistrazioneMessaggio,
  2234.                             nomePorta, false, false,
  2235.                             null, null, false);
  2236.                     gestoreMessaggi.setOneWayVersione11(false);
  2237.                 }

  2238.                 msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,"integrationManager.messaggioDisponibile");
  2239.                
  2240.             }
  2241.         }
  2242.        
  2243.         esito.setGestioneSolamenteConIntegrationManager(gestioneSolamenteConIntegrationManager);
  2244.        
  2245.         return esito;

  2246.     }


  2247.     private static java.sql.Timestamp _forceSaveMessage(OpenSPCoop2Properties propertiesReader, GestoreMessaggi gestoreMessaggi, Timestamp oraRegistrazione,
  2248.             Busta busta,RichiestaApplicativa richiestaApplicativa,RepositoryBuste repositoryBuste,
  2249.             OpenSPCoop2Message message,IOpenSPCoopState state,
  2250.             PdDContext pddContext, IDSoggetto identitaPdD) throws Exception{
  2251.        
  2252.         if( state.resourceReleased()) {
  2253.             ((OpenSPCoopState)state).setUseConnection(true);
  2254.             String idTransazione = (String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  2255.             ((OpenSPCoopState)state).initResource(identitaPdD, "EJBUtils.saveMessage", idTransazione);
  2256.             gestoreMessaggi.updateOpenSPCoopState(state);
  2257.             repositoryBuste.updateState(state.getStatoRichiesta());
  2258.         }
  2259.        
  2260.         java.sql.Timestamp oraRegistrazioneT = gestoreMessaggi.registraInformazioniMessaggio_statelessEngine(oraRegistrazione,
  2261.                 ConsegnaContenutiApplicativi.ID_MODULO,busta.getRiferimentoMessaggio(),
  2262.                 richiestaApplicativa.getIdCorrelazioneApplicativa(),null);
  2263.         boolean consumeMessage= true;
  2264.         gestoreMessaggi.registraMessaggio_statelessEngine(message, !consumeMessage, oraRegistrazioneT); // senno il dump poi successivo non funziona
  2265.         String key = "INSERT RegistrazioneBustaForHistory"+Costanti.INBOX+"_"+busta.getID();
  2266.         if(repositoryBuste.isRegistrataIntoInBox(busta.getID())){
  2267.             repositoryBuste.aggiornaBustaIntoInBox(busta,propertiesReader.getRepositoryIntervalloScadenzaMessaggi(),true);
  2268.             repositoryBuste.impostaUtilizzoPdD(busta.getID(), Costanti.INBOX);
  2269.         }
  2270.         else if(((StateMessage)state.getStatoRichiesta()).getPreparedStatement().containsKey(key)){
  2271.             repositoryBuste.aggiornaBustaIntoInBox(busta,propertiesReader.getRepositoryIntervalloScadenzaMessaggi(),true);
  2272.             repositoryBuste.impostaUtilizzoPdD(busta.getID(), Costanti.INBOX);
  2273.         }else{
  2274.             repositoryBuste.registraBustaIntoInBox(busta,propertiesReader.getRepositoryIntervalloScadenzaMessaggi(), true);
  2275.             if(!(state instanceof OpenSPCoopStateful)){
  2276.                 if(busta.sizeProperties()>0){
  2277.                     Map<String, String> bustaProperties = new HashMap<>();
  2278.                     String[]propertyNames = busta.getPropertiesNames();
  2279.                     if(propertyNames!=null){
  2280.                         for (int i = 0; i < propertyNames.length; i++) {
  2281.                             String keyP = propertyNames[i];
  2282.                             String valueP = busta.getProperty(key);
  2283.                             if(keyP!=null && valueP!=null){
  2284.                                 bustaProperties.put(keyP, valueP);
  2285.                             }
  2286.                         }
  2287.                     }
  2288.                     repositoryBuste.aggiornaProprietaBustaIntoInBox(bustaProperties, busta.getID());
  2289.                 }
  2290.             }
  2291.         }
  2292.         return oraRegistrazioneT;
  2293.     }














  2294.     /** ------------------- Metodi per la spedizione di risposte con errori ---------------- */

  2295.     /* ---- PROCESSAMENTO --- */
  2296.    
  2297.     public void sendAsRispostaBustaErroreProcessamento(String idModuloInAttesa,Busta busta,
  2298.             ErroreIntegrazione errore,String idCorrelazioneApplicativa,
  2299.             String servizioApplicativoFruitore,
  2300.             Throwable eProcessamento, ParseException parseException)throws EJBUtilsException,ProtocolException{
  2301.         Eccezione ecc = new Eccezione(ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreProcessamento(errore.getDescrizione(this.protocolFactory)),
  2302.                 false,this.idModulo,this.protocolFactory);
  2303.         List<Eccezione> errs = new ArrayList<>();
  2304.         errs.add(ecc);
  2305.         this._sendAsRispostaBustaErroreProcessamento(idModuloInAttesa,busta,errs,errore,idCorrelazioneApplicativa,null,servizioApplicativoFruitore,eProcessamento,parseException,null);
  2306.     }
  2307.     public void sendAsRispostaBustaErroreProcessamento(String idModuloInAttesa,Busta busta,
  2308.             ErroreIntegrazione errore,
  2309.             String idCorrelazioneApplicativa,String idCorrelazioneApplicativaRisposta,
  2310.             String servizioApplicativoFruitore,
  2311.             Throwable eProcessamento, ParseException parseException)throws EJBUtilsException,ProtocolException{
  2312.         Eccezione ecc = new Eccezione(ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreProcessamento(errore.getDescrizione(this.protocolFactory)),false,this.idModulo,this.protocolFactory);
  2313.         List<Eccezione> errs = new ArrayList<>();
  2314.         errs.add(ecc);
  2315.         this._sendAsRispostaBustaErroreProcessamento(idModuloInAttesa,busta,errs,errore,idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta,servizioApplicativoFruitore,eProcessamento,parseException,null);
  2316.     }
  2317.     public void sendAsRispostaBustaErroreProcessamento(String idModuloInAttesa,Busta busta,
  2318.             List<Eccezione> errs,String idCorrelazioneApplicativa,String idCorrelazioneApplicativaRisposta,
  2319.             String servizioApplicativoFruitore,
  2320.             Throwable eProcessamento, ParseException parseException)throws EJBUtilsException,ProtocolException{
  2321.         this._sendAsRispostaBustaErroreProcessamento(idModuloInAttesa, busta, errs, null,
  2322.                 idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, eProcessamento, parseException, null);
  2323.     }
  2324.    
  2325.     public void sendAsRispostaBustaErroreProcessamento(String idModuloInAttesa,Busta busta,
  2326.             String idCorrelazioneApplicativa,
  2327.             String servizioApplicativoFruitore,
  2328.             OpenSPCoop2Message errorMessageParam, String errorDetail)throws EJBUtilsException,ProtocolException{
  2329.         Eccezione ecc = new Eccezione(ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreProcessamento(errorDetail),
  2330.                 false,this.idModulo,this.protocolFactory);
  2331.         List<Eccezione> errs = new ArrayList<>();
  2332.         errs.add(ecc);
  2333.         this._sendAsRispostaBustaErroreProcessamento(idModuloInAttesa,busta,errs,null,idCorrelazioneApplicativa,null,servizioApplicativoFruitore,null,null,errorMessageParam);
  2334.     }
  2335.     public void sendAsRispostaBustaErroreProcessamento(String idModuloInAttesa,Busta busta,
  2336.             String idCorrelazioneApplicativa,String idCorrelazioneApplicativaRisposta,
  2337.             String servizioApplicativoFruitore,
  2338.             OpenSPCoop2Message errorMessageParam, String errorDetail)throws EJBUtilsException,ProtocolException{
  2339.         Eccezione ecc = new Eccezione(ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreProcessamento(errorDetail),false,this.idModulo,this.protocolFactory);
  2340.         List<Eccezione> errs = new ArrayList<>();
  2341.         errs.add(ecc);
  2342.         this._sendAsRispostaBustaErroreProcessamento(idModuloInAttesa,busta,errs,null,idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta,servizioApplicativoFruitore,null,null,errorMessageParam);
  2343.     }
  2344.     public void sendAsRispostaBustaErroreProcessamento(String idModuloInAttesa,Busta busta,
  2345.             List<Eccezione> errs,String idCorrelazioneApplicativa,String idCorrelazioneApplicativaRisposta,
  2346.             String servizioApplicativoFruitore,
  2347.             OpenSPCoop2Message errorMessageParam)throws EJBUtilsException,ProtocolException{
  2348.         this._sendAsRispostaBustaErroreProcessamento(idModuloInAttesa, busta, errs, null,
  2349.                 idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore, null,null,errorMessageParam);
  2350.     }
  2351.    
  2352.     private void _sendAsRispostaBustaErroreProcessamento(String idModuloInAttesa,Busta busta,
  2353.             List<Eccezione> errs, ErroreIntegrazione errore,
  2354.             String idCorrelazioneApplicativa,String idCorrelazioneApplicativaRisposta,
  2355.             String servizioApplicativoFruitore,
  2356.             Throwable eProcessamento, ParseException parseException,
  2357.             OpenSPCoop2Message errorMessageParam)throws EJBUtilsException,ProtocolException{

  2358.         if(this.pddContext==null) {
  2359.             throw new EJBUtilsException("PddContext undefined");
  2360.         }
  2361.        
  2362.         String idTransazione = (String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);

  2363.         //Costruisco busta Errore
  2364.         Imbustamento imbustatore = new Imbustamento(this.log,this.protocolFactory,this.openSPCoopState.getStatoRichiesta());

  2365.         String id_bustaErrore =
  2366.             imbustatore.buildID(this.identitaPdD, idTransazione,
  2367.                     this.propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  2368.                     this.propertiesReader.getGestioneSerializableDBCheckInterval(),
  2369.                     RuoloMessaggio.RISPOSTA);

  2370.         //ErroreProcessamentoProtocollo: Header
  2371.         busta = this.generatoreErrorePortaApplicativa.getImbustamentoErrore().buildMessaggioErroreProtocollo_Processamento(errs,busta,id_bustaErrore,this.propertiesReader.getTipoTempoBusta(this.implementazionePdDSoggettoMittente));

  2372.         // Fix Bug 131: eccezione di processamento
  2373.         this.generatoreErrorePortaApplicativa.getImbustamentoErrore().gestioneListaEccezioniMessaggioErroreProtocolloProcessamento(busta);
  2374.         // Fix Bug 131
  2375.        
  2376.         if( !( this.identitaPdD.getNome().equals(busta.getMittente()) &&
  2377.                 this.identitaPdD.getTipo().equals(busta.getTipoMittente()) ) ){
  2378.             // Il mittente della busta che sara' spedita e' il router
  2379.             busta.setMittente(this.identitaPdD.getNome());
  2380.             busta.setTipoMittente(this.identitaPdD.getTipo());
  2381.             busta.setIdentificativoPortaMittente(this.identitaPdD.getCodicePorta());
  2382.             busta.setIndirizzoMittente(null);
  2383.         }

  2384.         //ErroreProcessamentoProtocollo: error Msg
  2385.         OpenSPCoop2Message errorMsg = null;
  2386.         if(errorMessageParam!=null) {
  2387.             errorMsg = errorMessageParam;
  2388.         }
  2389.         else {
  2390.             if(errore==null) {
  2391.                 DettaglioEccezione dettaglioEccezione = this.dettaglioBuilder.buildDettaglioEccezioneFromBusta(this.identitaPdD,this.tipoPdD,this.idModulo,
  2392.                         this.servizioApplicativoErogatore, busta, eProcessamento);
  2393.                 errorMsg = this.generatoreErrorePortaApplicativa.buildErroreProcessamento(this.pddContext, this.getIntegrationFunctionErrorPortaApplicativa(false), dettaglioEccezione);
  2394.             }
  2395.             else {
  2396.                 errorMsg = this.generatoreErrorePortaApplicativa.buildErroreProcessamento(this.pddContext, this.getIntegrationFunctionErrorPortaApplicativa(false), errore, eProcessamento);
  2397.             }          
  2398.             if(errorMsg == null){
  2399.                 throw new EJBUtilsException("EJBUtils.sendRispostaErroreProcessamentoProtocollo error: Costruzione Msg Errore Protocollo fallita.");
  2400.             }
  2401.         }
  2402.         IntegrationFunctionError integrationFunctionErrorPortaApplicativa = getIntegrationFunctionErrorPortaApplicativa(false);
  2403.         if(integrationFunctionErrorPortaApplicativa!=null &&
  2404.                 (
  2405.                         IntegrationFunctionError.SERVICE_UNAVAILABLE.equals(integrationFunctionErrorPortaApplicativa)
  2406.                         ||
  2407.                         IntegrationFunctionError.ENDPOINT_REQUEST_TIMED_OUT.equals(integrationFunctionErrorPortaApplicativa)
  2408.                 )
  2409.             ) {
  2410.             // Retry-After
  2411.             boolean isEnabled = this.propertiesReader.isEnabledServiceUnavailableRetryAfterPAConnectionFailed();
  2412.             Integer retryAfterSeconds = this.propertiesReader.getServiceUnavailableRetryAfterSecondsPAConnectionFailed();
  2413.             Integer retryAfterBackOffSeconds = this.propertiesReader.getServiceUnavailableRetryAfterSecondsRandomBackoffPAConnectionFailed();
  2414.             if( isEnabled &&
  2415.                 retryAfterSeconds!=null && retryAfterSeconds>0) {
  2416.                 int seconds = retryAfterSeconds;
  2417.                 if(retryAfterBackOffSeconds!=null && retryAfterBackOffSeconds>0) {
  2418.                     seconds = seconds + ServicesUtils.getRandom().nextInt(retryAfterBackOffSeconds);
  2419.                 }
  2420.                 errorMsg.forceTransportHeader(HttpConstants.RETRY_AFTER, seconds+"");
  2421.             }
  2422.         }
  2423.         if(eProcessamento!=null && eProcessamento instanceof HandlerException){
  2424.             HandlerException he = (HandlerException) eProcessamento;
  2425.             he.customized(errorMsg);
  2426.         }
  2427.         if(parseException!=null){
  2428.             errorMsg.setParseException(parseException);
  2429.             if(this.pddContext!=null) {
  2430.                 if(MessageRole.REQUEST.equals(parseException.getMessageRole())){
  2431.                     this.pddContext.addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO, true);
  2432.                     this.pddContext.addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO_PARSE_EXCEPTION, parseException);
  2433.                     errorMsg.addContextProperty(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO, true);
  2434.                     errorMsg.addContextProperty(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO_PARSE_EXCEPTION, parseException);
  2435.                 }
  2436.                 else if(MessageRole.RESPONSE.equals(parseException.getMessageRole())){
  2437.                     this.pddContext.addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO, true);
  2438.                     this.pddContext.addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO_PARSE_EXCEPTION, parseException);
  2439.                     errorMsg.addContextProperty(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO, true);
  2440.                     errorMsg.addContextProperty(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO_PARSE_EXCEPTION, parseException);
  2441.                 }
  2442.             }
  2443.         }
  2444.         sendAsRispostaBustaErrore(idModuloInAttesa,busta,errorMsg,false,idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta,servizioApplicativoFruitore);
  2445.     }

  2446.    
  2447.     /* ---- VALIDAZIONE --- */

  2448.     public void sendAsRispostaBustaErroreValidazione(String idModuloInAttesa,Busta busta,Eccezione eccezione,
  2449.             String idCorrelazioneApplicativa,String servizioApplicativoFruitore)throws EJBUtilsException,ProtocolException{
  2450.         List<Eccezione> v = new ArrayList<>();
  2451.         v.add(eccezione);
  2452.         this._sendAsRispostaBustaErroreValidazione(idModuloInAttesa,busta,v,idCorrelazioneApplicativa,null,servizioApplicativoFruitore);
  2453.     }
  2454.     public void sendAsRispostaBustaErroreValidazione(String idModuloInAttesa,Busta busta,Eccezione eccezione,
  2455.             String idCorrelazioneApplicativa,String idCorrelazioneApplicativaRisposta,String servizioApplicativoFruitore)throws EJBUtilsException,ProtocolException{
  2456.         List<Eccezione> v = new ArrayList<>();
  2457.         v.add(eccezione);
  2458.         this._sendAsRispostaBustaErroreValidazione(idModuloInAttesa,busta,v,idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta,servizioApplicativoFruitore);
  2459.     }
  2460.     public void sendAsRispostaBustaErroreValidazione(String idModuloInAttesa,Busta busta,List<Eccezione> eccezioni,
  2461.             String idCorrelazioneApplicativa,String idCorrelazioneApplicativaRisposta,String servizioApplicativoFruitore)throws EJBUtilsException,ProtocolException{
  2462.         this._sendAsRispostaBustaErroreValidazione(idModuloInAttesa, busta, eccezioni,  
  2463.                 idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta, servizioApplicativoFruitore);
  2464.     }
  2465.     private void _sendAsRispostaBustaErroreValidazione(String idModuloInAttesa,Busta busta,
  2466.             List<Eccezione> eccezioni,
  2467.             String idCorrelazioneApplicativa,String idCorrelazioneApplicativaRisposta,String servizioApplicativoFruitore)throws EJBUtilsException,ProtocolException{

  2468.         //Costruisco busta Errore
  2469.         Imbustamento imbustatore = new Imbustamento(this.log,this.protocolFactory,this.openSPCoopState.getStatoRichiesta());
  2470.         String id_bustaErrore =
  2471.             imbustatore.buildID(this.identitaPdD,
  2472.                     (String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE),
  2473.                     this.propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  2474.                     this.propertiesReader.getGestioneSerializableDBCheckInterval(),
  2475.                     RuoloMessaggio.RISPOSTA);

  2476.         // CodiceErrore (da fare prima di imbustamentoErrore che svuola la lista eccezioni)
  2477.         CodiceErroreCooperazione codiceErroreCooperazione = null;
  2478.         String descrizioneErroreCooperazione = null;
  2479.         if(eccezioni!=null && eccezioni.size()>0) {
  2480.             Eccezione eccezioneDaInviare = Eccezione.getEccezioneValidazione(ErroriCooperazione.ERRORE_GENERICO_PROTOCOLLO_NON_CORRETTO.getErroreCooperazione(), this.protocolFactory);
  2481.             if(eccezioni.size()>1){
  2482.                 ITraduttore traduttore = this.protocolFactory.createTraduttore();
  2483.                 StringBuilder bfDescrizione = new StringBuilder();
  2484.                 for(int k=0; k<eccezioni.size();k++){
  2485.                     Eccezione error = eccezioni.get(k);
  2486.                     if(error.getDescrizione(this.protocolFactory)!=null) {
  2487.                         bfDescrizione.append("["+traduttore.toString(error.getCodiceEccezione(),error.getSubCodiceEccezione())+"] "+error.getDescrizione(this.protocolFactory)+"\n");
  2488.                     }
  2489.                 }
  2490.                 if(bfDescrizione.length()>0)
  2491.                     eccezioneDaInviare.setDescrizione(bfDescrizione.toString());
  2492.             }else{
  2493.                 eccezioneDaInviare = eccezioni.get(0);
  2494.             }
  2495.             codiceErroreCooperazione = eccezioneDaInviare.getCodiceEccezione();
  2496.             descrizioneErroreCooperazione = eccezioneDaInviare.getDescrizione(this.protocolFactory);
  2497.         }
  2498.        
  2499.         //ErroreValidazioneProtocollo: Header
  2500.         busta = this.generatoreErrorePortaApplicativa.getImbustamentoErrore().
  2501.                 buildMessaggioErroreProtocollo_Validazione(eccezioni,busta,id_bustaErrore,this.propertiesReader.getTipoTempoBusta(this.implementazionePdDSoggettoMittente));    
  2502.         if( !( this.identitaPdD.getNome().equals(busta.getMittente()) &&
  2503.                 this.identitaPdD.getTipo().equals(busta.getTipoMittente()) ) ){
  2504.             // Il mittente della busta che sara' spedita e' il router
  2505.             busta.setMittente(this.identitaPdD.getNome());
  2506.             busta.setTipoMittente(this.identitaPdD.getTipo());
  2507.             busta.setIdentificativoPortaMittente(this.identitaPdD.getCodicePorta());
  2508.             busta.setIndirizzoMittente(null);
  2509.         }

  2510.         //ErroreValidazioneProtocollo: Msg
  2511.         OpenSPCoop2Message msg = null;
  2512.         if(codiceErroreCooperazione!=null && descrizioneErroreCooperazione!=null) {
  2513.             msg = this.generatoreErrorePortaApplicativa.buildErroreIntestazione(this.pddContext, this.getIntegrationFunctionErrorPortaApplicativa(true), codiceErroreCooperazione, descrizioneErroreCooperazione);
  2514.         }
  2515.         else {
  2516.             msg = this.generatoreErrorePortaApplicativa.buildErroreIntestazione(this.pddContext, this.getIntegrationFunctionErrorPortaApplicativa(true));
  2517.         }
  2518.         if(msg == null){
  2519.             throw new EJBUtilsException("EJBUtils.sendRispostaErroreValidazioneProtocollo error: Costruzione messaggio Errore Protocollo fallita.");
  2520.         }

  2521.         sendAsRispostaBustaErrore(idModuloInAttesa,busta,msg,false,idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta,servizioApplicativoFruitore);
  2522.     }

  2523.     /**
  2524.      * Spedisce una busta che segnala la ricezione di una busta malformata al mittente della busta
  2525.      *
  2526.      * @param busta Busta
  2527.      * @param eccezioni Eccezioni di validazione
  2528.      *
  2529.      */
  2530.     public void sendAsRispostaBustaErrore_inoltroSegnalazioneErrore(Busta busta,List<Eccezione> eccezioni)throws EJBUtilsException,ProtocolException{
  2531.        
  2532.         //String idTransazione = (String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  2533.         // Fix devo utilizzare un id di transazione differente
  2534.         String idTransazione = null;
  2535.         try {
  2536.             idTransazione = UniqueIdentifierManager.newUniqueIdentifier().getAsString();
  2537.         }catch(Exception e) {
  2538.             throw new EJBUtilsException(e.getMessage(),e);
  2539.         }

  2540.         //Costruisco busta Errore
  2541.         Imbustamento imbustatore = new Imbustamento(this.log, this.protocolFactory,this.openSPCoopState.getStatoRichiesta());
  2542.         String id_bustaErrore =
  2543.             imbustatore.buildID(this.identitaPdD, idTransazione,
  2544.                     this.propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  2545.                     this.propertiesReader.getGestioneSerializableDBCheckInterval(),
  2546.                     RuoloMessaggio.RISPOSTA);

  2547.         // CodiceErrore (da fare prima di imbustamentoErrore che svuola la lista eccezioni)
  2548.         CodiceErroreCooperazione codiceErroreCooperazione = null;
  2549.         String descrizioneErroreCooperazione = null;
  2550.         if(eccezioni!=null && eccezioni.size()>0) {
  2551.             Eccezione eccezioneDaInviare = Eccezione.getEccezioneValidazione(ErroriCooperazione.ERRORE_GENERICO_PROTOCOLLO_NON_CORRETTO.getErroreCooperazione(), this.protocolFactory);
  2552.             if(eccezioni.size()>1){
  2553.                 ITraduttore traduttore = this.protocolFactory.createTraduttore();
  2554.                 StringBuilder bfDescrizione = new StringBuilder();
  2555.                 for(int k=0; k<eccezioni.size();k++){
  2556.                     Eccezione error = eccezioni.get(k);
  2557.                     if(error.getDescrizione(this.protocolFactory)!=null) {
  2558.                         bfDescrizione.append("["+traduttore.toString(error.getCodiceEccezione(),error.getSubCodiceEccezione())+"] "+error.getDescrizione(this.protocolFactory)+"\n");
  2559.                     }
  2560.                 }
  2561.                 if(bfDescrizione.length()>0)
  2562.                     eccezioneDaInviare.setDescrizione(bfDescrizione.toString());
  2563.             }else{
  2564.                 eccezioneDaInviare = eccezioni.get(0);
  2565.             }
  2566.             codiceErroreCooperazione = eccezioneDaInviare.getCodiceEccezione();
  2567.             descrizioneErroreCooperazione = eccezioneDaInviare.getDescrizione(this.protocolFactory);
  2568.         }
  2569.        
  2570.         //ErroreValidazioneProtocollo: Header
  2571.         // L'inoltro di segnalazione avviene in SbustamentoRisposte quindi devo riferire l'implemenazione della PdD del Soggetto Destinatario
  2572.         busta = this.generatoreErrorePortaApplicativa.getImbustamentoErrore().
  2573.                 buildMessaggioErroreProtocollo_Validazione(eccezioni,busta,id_bustaErrore,this.propertiesReader.getTipoTempoBusta(this.implementazionePdDSoggettoDestinatario));    

  2574.         //ErroreValidazioneProtocollo: Msg
  2575.         OpenSPCoop2Message msg = null;
  2576.         if(codiceErroreCooperazione!=null && descrizioneErroreCooperazione!=null) {
  2577.             msg = this.generatoreErrorePortaApplicativa.buildErroreIntestazione(this.pddContext, this.getIntegrationFunctionErrorPortaApplicativa(false), codiceErroreCooperazione, descrizioneErroreCooperazione);
  2578.         }
  2579.         else {
  2580.             msg = this.generatoreErrorePortaApplicativa.buildErroreIntestazione(this.pddContext, this.getIntegrationFunctionErrorPortaApplicativa(false));
  2581.         }
  2582.         if(msg == null){
  2583.             throw new EJBUtilsException("EJBUtils.sendRispostaErroreProtocollo_BustaRispostaMalformata error: Costruzione Msg Errore Protocollo fallita.");
  2584.         }

  2585.         sendAsRispostaBustaErrore(null,busta,msg,true,null,null,null);
  2586.     }

  2587.     /**
  2588.      * Spedisce una busta di Risposta al modulo di OpenSPCoop piu' indicato, a seconda che
  2589.      * la busta debba essere spedita sulla reply della connessione HTTP
  2590.      * (nodo RicezioneBuste, la spedizione viene naturalmente effettuata solo se <var>idModuloInAttesa</var> e' diverso da null)
  2591.      * o su di una nuova connessione (nodo InoltroRisposte)
  2592.      * La spedizione viene naturalmente effettuata solo se <var>idModuloInAttesa</var> e' diverso da null.
  2593.      *
  2594.      * @param idModuloInAttesa identificativo del modulo 'RicezioneBusteXXX'.
  2595.      * @param busta Busta
  2596.      * @param msg Msg Applicativo (SOAP) da inserire nella busta di risposta.
  2597.      * @param segnalazioneBustaRispostaMalformata Indicazione se la busta inviata segnala la precedente ricezione di una busta
  2598.      *        di risposta malformata (in tal caso la richiesta non viene eliminata, non esistentone una)
  2599.      *
  2600.      */
  2601.     private void sendAsRispostaBustaErrore(String idModuloInAttesa,Busta busta,OpenSPCoop2Message msg,
  2602.             boolean segnalazioneBustaRispostaMalformata,String idCorrelazioneApplicativa,String idCorrelazioneApplicativaRisposta,String servizioApplicativoFruitore)throws EJBUtilsException{

  2603.         StateMessage statoRichiesta = (StateMessage) this.openSPCoopState.getStatoRichiesta();
  2604.         StateMessage statoRisposta = (StateMessage) this.openSPCoopState.getStatoRisposta();        


  2605.         RollbackRepositoryBuste rollbackBuste = null;
  2606.         RepositoryBuste repositoryBuste = null;
  2607.         GestoreMessaggi msgRequest = null;
  2608.         GestoreMessaggi msgResponse = null;
  2609.         this.setEJBSuffixFunctionName();
  2610.         try{
  2611.            
  2612.                        
  2613.            
  2614.             /* ------- Gestione MsgRichiesta --------------- */
  2615.             boolean addIntoCache = false;
  2616.             if(this.rollbackRichiestaInCasoErrore){
  2617.                 // RollbackApplicativo
  2618.                 // (uso l'ID della sessione, poiche' tutti i dati 'protocollo' sono salvati con l'ID della richiesta e non della risposta)
  2619.                 rollbackBuste = new RollbackRepositoryBuste(this.idSessione, statoRichiesta, this.oneWayVersione11);
  2620.                 if(this.routing){
  2621.                     rollbackBuste.rollbackBustaIntoOutBox(this.rollbackRichiestaInCasoErrore_rollbackHistory);
  2622.                 }else{
  2623.                     rollbackBuste.rollbackBustaIntoInBox(this.rollbackRichiestaInCasoErrore_rollbackHistory);
  2624.                 }
  2625.        
  2626.                 // Imposto ProprietarioMessaggioRichiesta per eliminazione, se il messaggio da spedire esiste.
  2627.                 if( (segnalazioneBustaRispostaMalformata==false) && (this.idMessage!=null)){
  2628.                     msgRequest = new GestoreMessaggi(this.openSPCoopState, true, this.idMessage,this.tipo,this.msgDiag,this.pddContext);
  2629.                     msgRequest.setOneWayVersione11(this.oneWayVersione11);
  2630.                     if(msgRequest.existsMessage_noCache()){
  2631.                         msgRequest.aggiornaProprietarioMessaggio(TimerGestoreMessaggi.ID_MODULO);
  2632.                         addIntoCache = true;
  2633.                     }else{
  2634.                         addIntoCache = false;
  2635.                     }
  2636.                 }
  2637.             }else{
  2638.                 msgRequest = new GestoreMessaggi(this.openSPCoopState, true, this.idMessage,this.tipo,this.msgDiag,this.pddContext);
  2639.                 addIntoCache = false;
  2640.             }
  2641.            


  2642.             /* ------- Gestione MsgRisposta --------------- */

  2643.             // Esamina tipo di risposta (indirizzo di spedizione)
  2644.             boolean httpReply = true;
  2645.             if( this.replyOnNewConnection )
  2646.                 httpReply = false;
  2647.             if( busta.getIndirizzoDestinatario()!=null &&
  2648.                     this.utilizzoIndirizzoTelematico)
  2649.                 httpReply = false;
  2650.             if( segnalazioneBustaRispostaMalformata )
  2651.                 httpReply = false;

  2652.             // Devo generare una risposta solo se devo inviarla verso una nuova connessione,
  2653.             // o se esiste un nodo a cui inviare la risposta (idModuloInAttesa)
  2654.             if( (httpReply==false) || (idModuloInAttesa != null) ){

  2655.                 boolean salvaSuDatabasePerStateless = false;
  2656.                 if(httpReply==false){
  2657.                     salvaSuDatabasePerStateless = true; // Il messaggio inviato su una nuova connessione è come fosse una richiesta
  2658.                 }
  2659.                
  2660.                 // Salvataggio busta da inviare
  2661.                 repositoryBuste = new RepositoryBuste(statoRisposta, salvaSuDatabasePerStateless, this.protocolFactory);
  2662.                 repositoryBuste.registraBustaIntoOutBox(busta, this.propertiesReader.getRepositoryIntervalloScadenzaMessaggi());
  2663.                 Integrazione infoIntegrazione = new Integrazione();
  2664.                 infoIntegrazione.setIdModuloInAttesa(idModuloInAttesa);
  2665.                 infoIntegrazione.setScenario(this.scenarioCooperazione);
  2666.                 repositoryBuste.aggiornaInfoIntegrazioneIntoOutBox(busta.getID(),infoIntegrazione);


  2667.                 // --- Genero una risposta
  2668.                 msgResponse = new GestoreMessaggi(this.openSPCoopState, salvaSuDatabasePerStateless ,busta.getID(),Costanti.OUTBOX,this.msgDiag,this.pddContext);
  2669.                 if(httpReply==false){
  2670.                     msgResponse.setOneWayVersione11(this.oneWayVersione11);
  2671.                 }
  2672.                 // --- creazione nuovo stato
  2673.                 if(this.openSPCoopState instanceof OpenSPCoopStateless){
  2674.                     msgResponse.registraMessaggio(msg,((OpenSPCoopStateless)this.openSPCoopState).getTempiAttraversamentoPDD().getRicezioneMsgIngresso(),idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta);
  2675.                 }else{
  2676.                     msgResponse.registraMessaggio(msg,idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta);
  2677.                 }
  2678.                 // ---- aggiorno riferimentoMessaggio
  2679.                 msgResponse.aggiornaRiferimentoMessaggio(this.idSessione);
  2680.                
  2681.                 // --- Aggiornamento Proprietario messaggio: aggiorna il destinatario del messageLib se siamo in stateless mode
  2682.                 if(httpReply==false){
  2683.                     // Aggiorno proprietario Messaggio: INOLTRO RISPOSTE    
  2684.                     msgResponse.aggiornaProprietarioMessaggio(InoltroRisposte.ID_MODULO);  

  2685.                 }else{
  2686.                     if(idModuloInAttesa != null){          
  2687.                         // Aggiorno proprietario Messaggio: RICEZIONE BUSTE
  2688.                         msgResponse.aggiornaProprietarioMessaggio(idModuloInAttesa);
  2689.                     }
  2690.                 }

  2691.                 // --- Spedizione al successivo modulo
  2692.                 try{
  2693.                     if(httpReply==false){
  2694.                         // spedizione al modulo InoltroRisposte
  2695.                         sendToInoltroRisposte(busta,segnalazioneBustaRispostaMalformata,null, msgResponse,idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta,servizioApplicativoFruitore,true);        
  2696.                     }else{
  2697.                         if(idModuloInAttesa != null){
  2698.                             // spedizione al modulo RicezioneBusteXXX
  2699.                             sendBustaToRicezioneBuste(idModuloInAttesa,busta,null);
  2700.                         }
  2701.                     }
  2702.                 }catch(Exception e){
  2703.                     throw e; // rilancio eccezione;
  2704.                 }

  2705.             }// end Gestione Risposta


  2706.             /* ------- Commit/Close Connessione DB --------------- */
  2707.             this.openSPCoopState.commit();


  2708.             // Aggiornamento cache messaggio
  2709.             if(msgResponse !=null)
  2710.                 msgResponse.addMessaggiIntoCache_readFromTable(this.idModulo, "sendRispostaErroreProtocollo [risposta]");

  2711.             //  Aggiornamento cache proprietario messaggio
  2712.             if(addIntoCache){
  2713.                 String idRichiestaCorrelata = null;
  2714.                 if(this.idMessage.equals(this.idSessione)==false)
  2715.                     idRichiestaCorrelata = this.idSessione;
  2716.                 msgRequest.addProprietariIntoCache_readFromTable(this.idModulo, "sendRispostaErroreProtocollo [richiesta]",idRichiestaCorrelata,this.functionAsRouter);

  2717.             }
  2718.             if(msgResponse!=null)
  2719.                 msgResponse.addProprietariIntoCache_readFromTable(this.idModulo, "sendRispostaErroreProtocollo [risposta]",this.idSessione,this.functionAsRouter);

  2720.         }catch (Exception e) {  
  2721.             this.msgDiag.logErroreGenerico(e, "EJBUtils.sendRispostaErroreProtocollo");
  2722.             statoRichiesta.closePreparedStatement();
  2723.             statoRisposta.closePreparedStatement();
  2724.             // Rilancio l'eccezione
  2725.             throw new EJBUtilsException("EJBUtils.sendRispostaErroreProtocollo error: "+e.getMessage(),e);

  2726.         }   finally{
  2727.             this.unsetEJBSuffixFunctionName();
  2728.         }

  2729.     }

  2730.    
  2731.    
  2732.    
  2733.    
  2734.    
  2735.    
  2736.    
  2737.    
  2738.    
  2739.    
  2740.    
  2741.    

  2742.     /**
  2743.      * Spedisce un Messaggio di Sblocco 'Risposta'
  2744.      * al modulo di openspcoop 'RicezioneBusteXXX',
  2745.      * inserendolo all'interno di  un
  2746.      * messaggio di tipo {@link org.openspcoop2.pdd.services.core.RicezioneBusteMessage} e
  2747.      * spedendolo nella coda 'toRicezioneBusteXXX'.
  2748.      * La spedizione viene naturalmente effettuata solo se <var>idModuloInAttesa</var> e' diverso da null.
  2749.      *
  2750.      * @param idModuloInAttesa identificativo del modulo 'RicezioneBusteXXX'.
  2751.      *
  2752.      */
  2753.     public GestoreMessaggi sendSbloccoRicezioneBuste(String idModuloInAttesa)throws EJBUtilsException,ProtocolException{
  2754.        
  2755.         String idTransazione = (String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  2756.         RequestInfo requestInfo = (RequestInfo) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);

  2757.         // ID Busta Sblocco
  2758.         org.openspcoop2.protocol.engine.builder.Imbustamento imbustatore = new Imbustamento(this.log, this.protocolFactory, this.openSPCoopState.getStatoRichiesta());
  2759.         String idSblocco =  
  2760.             imbustatore.buildID(this.identitaPdD, idTransazione,
  2761.                     this.propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  2762.                     this.propertiesReader.getGestioneSerializableDBCheckInterval(),
  2763.                     RuoloMessaggio.RISPOSTA);
  2764.         return sendBustaRisposta(idModuloInAttesa,null,MessageUtilities.buildEmptyMessage(OpenSPCoop2MessageFactory.getDefaultMessageFactory(), requestInfo.getProtocolRequestMessageType(), MessageRole.RESPONSE)
  2765.                 ,idSblocco,null,null,null,null);
  2766.     }
  2767.    
  2768.     public GestoreMessaggi sendSOAPFault(String idModuloInAttesa,OpenSPCoop2Message msg)throws EJBUtilsException,ProtocolException{
  2769.        
  2770.         String idTransazione = (String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  2771.        
  2772.         // ID Busta Sblocco
  2773.         org.openspcoop2.protocol.engine.builder.Imbustamento imbustatore = new Imbustamento(this.log, this.protocolFactory, this.openSPCoopState.getStatoRichiesta());
  2774.         String idSblocco =
  2775.             imbustatore.buildID(this.identitaPdD, idTransazione,
  2776.                     this.propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  2777.                     this.propertiesReader.getGestioneSerializableDBCheckInterval(),
  2778.                     RuoloMessaggio.RISPOSTA);

  2779.         return sendBustaRisposta(idModuloInAttesa,null,msg,idSblocco,null,null,null,null);
  2780.     }

  2781.     /**
  2782.      * Spedisce una busta di Risposta al modulo di OpenSPCoop piu' indicato, a seconda che
  2783.      * la busta debba essere spedita sulla reply della connessione HTTP
  2784.      * (nodo RicezioneBuste, la spedizione viene naturalmente effettuata solo se <var>idModuloInAttesa</var> e' diverso da null)
  2785.      * o su di una nuova connessione (nodo InoltroRisposte), nel caso di indirizzo telematico o nuova risposta
  2786.      * La spedizione viene naturalmente effettuata solo se <var>idModuloInAttesa</var> e' diverso da null.
  2787.      *
  2788.      * @param idModuloInAttesa identificativo del modulo 'RicezioneBusteXXX'.
  2789.      * @param busta Busta he definisce la busta di risposta
  2790.      * @param msg Msg Applicativo (SOAP) da inserire nella busta di risposta.
  2791.      *
  2792.      */
  2793.     public GestoreMessaggi buildAndSendBustaRisposta(String idModuloInAttesa,Busta busta,
  2794.             OpenSPCoop2Message msg,String profiloGestione,
  2795.             String idCorrelazioneApplicativa,String servizioApplicativoFruitore)throws EJBUtilsException,ProtocolException{
  2796.         return buildAndSendBustaRisposta(idModuloInAttesa, busta, msg, profiloGestione, idCorrelazioneApplicativa, null, servizioApplicativoFruitore);
  2797.     }
  2798.     public GestoreMessaggi buildAndSendBustaRisposta(String idModuloInAttesa,Busta busta,
  2799.             OpenSPCoop2Message msg,String profiloGestione,
  2800.             String idCorrelazioneApplicativa,String idCorrelazioneApplicativaRisposta,String servizioApplicativoFruitore)throws EJBUtilsException,ProtocolException{

  2801.         String idTransazione = (String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  2802.        
  2803.         // ID Busta Costruita
  2804.         org.openspcoop2.protocol.engine.builder.Imbustamento imbustatore = new Imbustamento(this.log, this.protocolFactory, this.openSPCoopState.getStatoRichiesta());
  2805.         String id_busta =
  2806.             imbustatore.buildID(this.identitaPdD, idTransazione,
  2807.                     this.propertiesReader.getGestioneSerializableDBAttesaAttiva(),
  2808.                     this.propertiesReader.getGestioneSerializableDBCheckInterval(),
  2809.                     RuoloMessaggio.RISPOSTA);

  2810.         // Aggiungo ID
  2811.         if(busta!=null)
  2812.             busta.setID(id_busta);

  2813.         return sendBustaRisposta(idModuloInAttesa,busta,msg,null,profiloGestione,idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta,servizioApplicativoFruitore);

  2814.     }

  2815.     /**
  2816.      * Spedisce una busta di Risposta al modulo di OpenSPCoop piu'indicato, a seconda che
  2817.      * la busta debba essere spedita sulla reply della connessione HTTP
  2818.      * (nodo RicezioneBuste, la spedizione viene naturalmente effettuata solo se <var>idModuloInAttesa</var> e' diverso da null)
  2819.      * o su di una nuova connessione (nodo InoltroRisposte)
  2820.      * La spedizione viene naturalmente effettuata solo se <var>idModuloInAttesa</var> e' diverso da null.
  2821.      *
  2822.      * @param idModuloInAttesa identificativo del modulo 'RicezioneBusteXXX'.
  2823.      * @param busta Busta  
  2824.      * @return Pstmt da eseguire per la gestione della risposta
  2825.      *
  2826.      */
  2827.     public GestoreMessaggi sendBustaRisposta(String idModuloInAttesa,
  2828.             Busta busta,String profiloGestione,String idCorrelazioneApplicativa,String idCorrelazioneApplicativaRisposta,String servizioApplicativoFruitore)throws EJBUtilsException{
  2829.         return sendBustaRisposta(idModuloInAttesa,busta,null,null,profiloGestione,idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta,servizioApplicativoFruitore);
  2830.     }

  2831.     /**
  2832.      * Spedisce una busta di Risposta al modulo di OpenSPCoop piu' indicato, a seconda che
  2833.      * la busta debba essere spedita sulla reply della connessione HTTP
  2834.      * (nodo RicezioneBuste, la spedizione viene naturalmente effettuata solo se <var>idModuloInAttesa</var> e' diverso da null)
  2835.      * o su di una nuova connessione (nodo InoltroRisposte)
  2836.      * La spedizione viene naturalmente effettuata solo se <var>idModuloInAttesa</var> e' diverso da null.
  2837.      *
  2838.      * @param idModuloInAttesa identificativo del modulo 'RicezioneBusteXXX'.
  2839.      * @param busta Busta
  2840.      * @param msg Msg Applicativo (SOAP) da inserire nella busta di risposta.
  2841.      * @param repository Repository dove effettuare il salvataggio della busta  
  2842.      * @param idSbloccoModulo Identificativo di sblocco del modulo RicezioneBuste
  2843.      * @return Pstmt da eseguire per la gestione della risposta
  2844.      *
  2845.      */
  2846.     private GestoreMessaggi sendBustaRisposta(String idModuloInAttesa,
  2847.             Busta busta,OpenSPCoop2Message msg,String idSbloccoModulo,
  2848.             String profiloGestione,String idCorrelazioneApplicativa,String idCorrelazioneApplicativaRisposta,String servizioApplicativoFruitore)throws EJBUtilsException{

  2849.         IState statoRisposta = this.openSPCoopState.getStatoRisposta();

  2850.         GestoreMessaggi msgResponse = null;
  2851.         this.setEJBSuffixFunctionName();
  2852.         try{
  2853.            
  2854.             /* ------- Gestione MsgRisposta --------------- */

  2855.             boolean httpReply = true;
  2856.             // Esamina tipo di risposta (indirizzo di spedizione) a meno di messaggi
  2857.             // di sblocco modulo.
  2858.             if(idSbloccoModulo==null){
  2859.                 if( this.replyOnNewConnection )
  2860.                     httpReply = false;
  2861.                 if(busta!=null){
  2862.                     if( busta.getIndirizzoDestinatario()!=null &&
  2863.                             this.utilizzoIndirizzoTelematico){
  2864.                         httpReply = false;      
  2865.                     }
  2866.                 }
  2867.             }

  2868.             // Devo generare una risposta solo se devo inviarla verso una nuova connessione,
  2869.             // o se esiste un nodo a cui inviare la risposta (idModuloInAttesa)
  2870.             if( (httpReply==false) || (idModuloInAttesa != null) ){

  2871.                 boolean salvaSuDatabasePerStateless = false;
  2872.                 if(httpReply==false && (this.functionAsRouter==false) && (this.openSPCoopState instanceof OpenSPCoopStateless)){
  2873.                     salvaSuDatabasePerStateless = true; // Il messaggio inviato su una nuova connessione è come fosse una richiesta
  2874.                 }
  2875.                
  2876.                 // Salvataggio busta da inviare
  2877.                 if(busta!=null){
  2878.                     RepositoryBuste repositoryRisposta = new RepositoryBuste(statoRisposta, this.log, salvaSuDatabasePerStateless, this.protocolFactory);
  2879.                     repositoryRisposta.registraBustaIntoOutBox(busta, this.propertiesReader.getRepositoryIntervalloScadenzaMessaggi());
  2880.                     Integrazione infoIntegrazione = new Integrazione();
  2881.                     infoIntegrazione.setIdModuloInAttesa(idModuloInAttesa);
  2882.                     infoIntegrazione.setScenario(this.scenarioCooperazione);
  2883.                     repositoryRisposta.aggiornaInfoIntegrazioneIntoOutBox(busta.getID(),infoIntegrazione);
  2884.                 }

  2885.                 // --- Se devo generare una risposta
  2886.                 // e mi e' chiesto di gestire un messaggio di risposta con errore (msg!=null), lo effettuo.
  2887.                 String idRisposta = null;
  2888.                 if(busta!=null)
  2889.                     idRisposta = busta.getID();
  2890.                 else
  2891.                     idRisposta = idSbloccoModulo;
  2892.                 msgResponse = new GestoreMessaggi(this.openSPCoopState, salvaSuDatabasePerStateless, idRisposta,Costanti.OUTBOX,this.msgDiag, this.pddContext);
  2893.                 if(httpReply==false){
  2894.                     msgResponse.setOneWayVersione11(this.oneWayVersione11);
  2895.                 }
  2896.                 if( msg!=null ){    
  2897.                     // creazione nuovo stato
  2898.                     if(this.openSPCoopState instanceof OpenSPCoopStateless){
  2899.                         msgResponse.registraMessaggio(msg,((OpenSPCoopStateless)this.openSPCoopState).getTempiAttraversamentoPDD().getRicezioneMsgIngresso(),idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta);
  2900.                     }else{
  2901.                         msgResponse.registraMessaggio(msg,idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta);
  2902.                     }
  2903.                 }
  2904.                 // else{ Carico lo stato di un messaggio, esistente


  2905.                 //---   aggiorno riferimentoMsg
  2906.                 msgResponse.aggiornaRiferimentoMessaggio(this.idSessione);

  2907.                 // --- Aggiornamento Proprietario messaggio
  2908.                 if(httpReply==false){
  2909.                     // Aggiorno proprietario Messaggio: INOLTRO RISPOSTE    
  2910.                     msgResponse.aggiornaProprietarioMessaggio(InoltroRisposte.ID_MODULO);
  2911.                 }else{
  2912.                     if(idModuloInAttesa != null){          
  2913.                         // Aggiorno proprietario Messaggio: RICEZIONE BUSTE
  2914.                         msgResponse.aggiornaProprietarioMessaggio(idModuloInAttesa);
  2915.                     }
  2916.                 }

  2917.                 // --- Spedizione al successivo modulo
  2918.                 try{
  2919.                     if(httpReply==false){
  2920.                         // spedizione al modulo InoltroRisposte
  2921.                         sendToInoltroRisposte(busta,false,profiloGestione, msgResponse,idCorrelazioneApplicativa,idCorrelazioneApplicativaRisposta,servizioApplicativoFruitore,true);  
  2922.                     }else{
  2923.                         if(idModuloInAttesa != null){
  2924.                             // spedizione al modulo RicezioneBusteXXX
  2925.                             sendBustaToRicezioneBuste(idModuloInAttesa,busta,idSbloccoModulo);
  2926.                         }
  2927.                     }
  2928.                 }catch(Exception e){
  2929.                     throw e; // rilancio eccezione;
  2930.                 }

  2931.             }// end Gestione Risposta



  2932.             /* ------- Ritorna le pstmt da eseguire per la risposta --------------- */
  2933.             return msgResponse;

  2934.         }catch (Exception e) {  
  2935.             this.msgDiag.logErroreGenerico(e, "EJBUtils.sendRispostaProtocollo");
  2936.             if(msgResponse!=null )
  2937.                 ((StateMessage)statoRisposta).closePreparedStatement();
  2938.             //  Rilancio l'eccezione
  2939.             throw new EJBUtilsException("EJBUtils.sendRispostaProtocollo error: "+e.getMessage(),e);

  2940.         }   finally{
  2941.             this.unsetEJBSuffixFunctionName();
  2942.         }

  2943.     }




  2944.     /** ------------------- Metodi per la spedizione al nodo 'InoltroRisposte' ---------------- */

  2945.     /**
  2946.      * Spedisce una busta di risposta  
  2947.      * al modulo di openspcoop {@link org.openspcoop2.pdd.mdb.InoltroRisposteMDB},
  2948.      * inserendolo all'interno di  un messaggio di tipo {@link org.openspcoop2.pdd.mdb.InoltroRisposteMessage} e
  2949.      * spedendolo nella coda 'toInoltroRisposte'.
  2950.      *
  2951.      * @param busta Busta utilizzata per la costruzione della busta di risposta
  2952.      * @param inoltroSegnalazioneErrore Indicazione se la busta inviata segnala la precedente ricezione di una busta
  2953.      *        di risposta malformata
  2954.      *
  2955.      */
  2956.     public void sendToInoltroRisposte(Busta busta,
  2957.             boolean inoltroSegnalazioneErrore,String profiloGestione, GestoreMessaggi gm,
  2958.             String idCorrelazioneApplicativa,String idCorrelazioneApplicativaRisposta,String servizioApplicativoFruitore,boolean imbustamento)throws EJBUtilsException{

  2959.         if (   (this.openSPCoopState instanceof OpenSPCoopStateful)  ||
  2960.                 this.oneWayVersione11) {
  2961.            
  2962.             try{
  2963.                 this.msgDiag.highDebug("[EJBUtils] Creazione ObjectMessage for send nell'infrastruttura.");
  2964.                 // costruzione
  2965.                 InoltroRisposteMessage inoltroMSG = new InoltroRisposteMessage();
  2966.                 inoltroMSG.setDominio(this.identitaPdD);
  2967.                 inoltroMSG.setInoltroSegnalazioneErrore(inoltroSegnalazioneErrore);
  2968.                 inoltroMSG.setBustaRisposta(busta);
  2969.                 inoltroMSG.setProfiloGestione(profiloGestione);
  2970.                 inoltroMSG.setOneWayVersione11(this.oneWayVersione11);
  2971.                 inoltroMSG.setIdCorrelazioneApplicativa(idCorrelazioneApplicativa);
  2972.                 inoltroMSG.setIdCorrelazioneApplicativaRisposta(idCorrelazioneApplicativaRisposta);
  2973.                 inoltroMSG.setServizioApplicativoFruitore(servizioApplicativoFruitore);
  2974.                 inoltroMSG.setImbustamento(imbustamento);
  2975.                 inoltroMSG.setImplementazionePdDSoggettoMittente(this.implementazionePdDSoggettoMittente);
  2976.                 inoltroMSG.setImplementazionePdDSoggettoDestinatario(this.implementazionePdDSoggettoDestinatario);
  2977.                 inoltroMSG.setPddContext(this.pddContext);
  2978.    
  2979.                 if ( this.oneWayVersione11 ) {
  2980.                    
  2981.                     OpenSPCoopStateless statelessSerializzabile = ((OpenSPCoopStateless) this.openSPCoopState).rendiSerializzabile();
  2982.                     inoltroMSG.setOpenspcoopstate(statelessSerializzabile);
  2983.                 }

  2984.                 // send
  2985.                 this.nodeSender.send(inoltroMSG, org.openspcoop2.pdd.mdb.InoltroRisposte.ID_MODULO, this.msgDiag,
  2986.                         this.identitaPdD,this.idModulo, this.idSessione,gm);
  2987.    
  2988.             } catch (Exception e) {
  2989.                 this.log.error("Spedizione->InoltroRisposte non riuscita",e);  
  2990.                 this.msgDiag.logErroreGenerico(e, "EJBUtils.sendToInoltroRisposte");
  2991.                 throw new EJBUtilsException("EJBUtils.sendToInoltroRisposte error: "+e.getMessage(),e);
  2992.             }
  2993.            
  2994.         }
  2995.     }







  2996.    
  2997.    
  2998.     /** ------------------- Metodi per la generazione di messaggi  'OK' ---------------- */
  2999.    
  3000.     /**
  3001.      * Metodo che si occupa di costruire un messaggio SOAPElement 'openspcoop OK'.
  3002.      *
  3003.      * @return messaggio Soap 'OK' in caso di successo, null altrimenti.
  3004.      *
  3005.      */
  3006.     public OpenSPCoop2Message buildOpenSPCoopOK(MessageType messageType, String id) throws UtilsException{
  3007.         try{
  3008.             OpenSPCoop2MessageFactory mf = OpenSPCoop2MessageFactory.getDefaultMessageFactory();
  3009.                        
  3010.             EsitoRichiesta esito = new EsitoRichiesta();
  3011.             esito.setMessageId(id);
  3012.             esito.setState(org.openspcoop2.core.integrazione.constants.Costanti.PRESA_IN_CARICO);
  3013.            
  3014.             switch (messageType) {
  3015.             case SOAP_11:
  3016.             case SOAP_12:
  3017.            
  3018.                 OpenSPCoop2Message responseSOAPMessage = mf.createEmptyMessage(messageType,MessageRole.RESPONSE);
  3019.                 OpenSPCoop2SoapMessage soapMessage = responseSOAPMessage.castAsSoap();
  3020.                 SOAPBody soapBody = soapMessage.getSOAPBody();
  3021.                 byte[]xmlEsito = EsitoRichiestaXMLUtils.generateEsitoRichiesta(esito);
  3022.                 soapBody.addChildElement(soapMessage.createSOAPElement(xmlEsito));
  3023.                 return responseSOAPMessage;
  3024.                

  3025.             case JSON:
  3026.                
  3027.                 byte[] bytes = EsitoRichiestaXMLUtils.generateEsitoRichiestaAsJson(esito).getBytes();
  3028.                 OpenSPCoop2MessageParseResult pr = mf.createMessage(messageType, MessageRole.RESPONSE, HttpConstants.CONTENT_TYPE_JSON, bytes);
  3029.                 return pr.getMessage_throwParseException();
  3030.                
  3031.             default:
  3032.                
  3033.                 bytes = EsitoRichiestaXMLUtils.generateEsitoRichiesta(esito);
  3034.                 pr = mf.createMessage(MessageType.XML, MessageRole.RESPONSE, HttpConstants.CONTENT_TYPE_XML, bytes);
  3035.                 return pr.getMessage_throwParseException();
  3036.                
  3037.             }
  3038.            
  3039.            

  3040.         } catch(Exception e) {
  3041.             throw new UtilsException("Creazione MsgOpenSPCoopOK non riuscito: "+e.getMessage(),e);
  3042.         }
  3043.     }


  3044.    
  3045.    
  3046.    
  3047.    
  3048.    
  3049.    






  3050.     /** ------------------- Metodi per la spedizione al nodo 'RicezioneBuste' ---------------- */

  3051.     /**
  3052.      * Spedisce un header Protocollo <var>header</var>
  3053.      * al modulo di openspcoop 'RicezioneBusteXXX',
  3054.      * inserendolo all'interno di  un
  3055.      * messaggio di tipo {@link org.openspcoop2.pdd.services.core.RicezioneBusteMessage} e
  3056.      * spedendolo nella coda 'toRicezioneBusteXXX'.
  3057.      *
  3058.      * @param idModuloInAttesa identificativo del modulo 'RicezioneBusteXXX'.
  3059.      * @param busta Busta utilizzata per la costruzione della busta di risposta
  3060.      * @param idSbloccoModulo Identificativo del messaggio di sblocco se il messaggio non contiene una busta
  3061.      *
  3062.      */
  3063.     public void sendBustaToRicezioneBuste(String idModuloInAttesa,Busta busta, String idSbloccoModulo) throws EJBUtilsException{

  3064.         if (this.openSPCoopState instanceof OpenSPCoopStateless) {
  3065.             RicezioneBusteMessage ricezioneMSG = new RicezioneBusteMessage();
  3066.             ricezioneMSG.setBustaRisposta(busta);
  3067.             ricezioneMSG.setIdMessaggioSblocco(idSbloccoModulo);
  3068.             ricezioneMSG.setPddContext(this.pddContext);
  3069.             ((OpenSPCoopStateless)this.openSPCoopState).setMessageLib(ricezioneMSG);
  3070.         }
  3071.        
  3072.         if( CostantiConfigurazione.COMUNICAZIONE_INFRASTRUTTURALE_JMS.equals(this.propertiesReader.getNodeReceiver())){

  3073.             try{
  3074.                 this.msgDiag.highDebug("Creazione ObjectMessage for send via JMS.");
  3075.                 // costruzione
  3076.                 RicezioneBusteMessage ricezioneMSG = new RicezioneBusteMessage();
  3077.                 ricezioneMSG.setBustaRisposta(busta);
  3078.                 ricezioneMSG.setIdMessaggioSblocco(idSbloccoModulo);
  3079.                 ricezioneMSG.setPddContext(this.pddContext);

  3080.                 if (this.openSPCoopState instanceof OpenSPCoopStateless)
  3081.                     ((OpenSPCoopStateless)this.openSPCoopState).setMessageLib(ricezioneMSG);

  3082.                 else { //Stateful mode:
  3083.                     // NOTA: usare realmente JMSSender e non l'interfaccia INodeSender, perche' questo punto riguarda INodeReceiver!!
  3084.                     String idT = PdDContext.getValue(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE, this.pddContext);
  3085.                     JMSSender senderJMS = new JMSSender(this.identitaPdD,this.idModulo,this.log,idT);
  3086.                     java.util.Properties prop = new java.util.Properties();
  3087.                     prop.put("ID",this.idSessione);

  3088.                     if(senderJMS.send(idModuloInAttesa,
  3089.                             ricezioneMSG,prop) == false){
  3090.                         this.msgDiag.logErroreGenerico(senderJMS.getErrore(), "EJBUtils.sendBustaToRicezioneBuste.senderJMS");
  3091.                         throw new Exception("SendJMSError: "+senderJMS.getErrore());
  3092.                     }

  3093.                     this.msgDiag.highDebug("ObjectMessage send via JMS.");
  3094.                 }
  3095.             } catch (Exception e) {
  3096.                 this.msgDiag.logErroreGenerico(e, "EJBUtils.sendBustaToRicezioneBuste");
  3097.                 throw new EJBUtilsException("EJBUtils.sendToRicezioneBuste error: "+e.getMessage(),e);
  3098.             }
  3099.         }
  3100.     }

  3101.     public void setScenarioCooperazione(String scenarioCooperazione) {
  3102.         this.scenarioCooperazione = scenarioCooperazione;
  3103.     }

  3104.     public Timestamp getRicezioneMsgRisposta() {
  3105.         return this.ricezioneMsgRisposta;
  3106.     }

  3107.     public void setRicezioneMsgRisposta(Timestamp ricezioneMsgRisposta) {
  3108.         this.ricezioneMsgRisposta = ricezioneMsgRisposta;
  3109.     }

  3110.     public Timestamp getSpedizioneMsgIngresso() {
  3111.         return this.spedizioneMsgIngresso;
  3112.     }

  3113.     public void setSpedizioneMsgIngresso(Timestamp spedizioneMsgIngresso) {
  3114.         this.spedizioneMsgIngresso = spedizioneMsgIngresso;
  3115.     }

  3116.    
  3117.     /** restituisce true solo se i bytes del messaggio vanno salvati nel db */
  3118.     public boolean saveMessageStateless(PortaDelegata pd) throws Exception {
  3119.         ProfiloDiCollaborazione profiloCollaborazione = EJBUtils.calcolaProfiloCollaborazione(this.scenarioCooperazione);
  3120.         return this.configurazionePdDReader.isModalitaStateless(pd, profiloCollaborazione);
  3121.     }


  3122.     public void setOneWayVersione11(boolean oneWay11) {
  3123.         this.oneWayVersione11 = oneWay11;
  3124.     }

  3125.     public void setPortaDiTipoStateless_esclusoOneWay11(boolean stateless) {
  3126.         this.portaDiTipoStateless_esclusoOneWay11 = stateless;
  3127.     }

  3128.     public void setRouting(boolean routing) {
  3129.         this.routing = routing;
  3130.     }

  3131.     public void setRollbackRichiestaInCasoErrore(
  3132.             boolean rollbackRichiestaInCasoErrore) {
  3133.         this.rollbackRichiestaInCasoErrore = rollbackRichiestaInCasoErrore;
  3134.     }
  3135.    
  3136.     public void setRollbackRichiestaInCasoErrore_rollbackHistory(
  3137.             boolean rollbackRichiestaInCasoErrore_rollbackHistory) {
  3138.         this.rollbackRichiestaInCasoErrore_rollbackHistory = rollbackRichiestaInCasoErrore_rollbackHistory;
  3139.     }


  3140.     public static ProfiloDiCollaborazione calcolaProfiloCollaborazione(String scenarioCooperazione){
  3141.         // Calcolo Profilo di Collaborazione
  3142.         ProfiloDiCollaborazione profiloCollaborazione = null;
  3143.         if( Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(scenarioCooperazione) ){
  3144.             profiloCollaborazione = ProfiloDiCollaborazione.ONEWAY;
  3145.         }
  3146.         else if(Costanti.SCENARIO_SINCRONO_INVOCAZIONE_SERVIZIO.equals(scenarioCooperazione) ){
  3147.             profiloCollaborazione = ProfiloDiCollaborazione.SINCRONO;
  3148.         }
  3149.         else if(Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_POLLING.equals(scenarioCooperazione) || Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_INVOCAZIONE_SERVIZIO.equals(scenarioCooperazione)){
  3150.             profiloCollaborazione = ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO;
  3151.         }
  3152.         else if (Costanti.SCENARIO_ASINCRONO_SIMMETRICO_INVOCAZIONE_SERVIZIO.equals(scenarioCooperazione) ||
  3153.                 Costanti.SCENARIO_ASINCRONO_SIMMETRICO_CONSEGNA_RISPOSTA.equals(scenarioCooperazione)){
  3154.             profiloCollaborazione = ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO;
  3155.         }
  3156.         return profiloCollaborazione;
  3157.     }

  3158.     public String getServizioApplicativoErogatore() {
  3159.         return this.servizioApplicativoErogatore;
  3160.     }

  3161.     public void setServizioApplicativoErogatore(String servizioApplicativoErogatore) {
  3162.         this.servizioApplicativoErogatore = servizioApplicativoErogatore;
  3163.     }

  3164. }