InoltroBusteMDB.java

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



  20. package org.openspcoop2.pdd.mdb;

  21. import javax.ejb.EJBException;
  22. import javax.ejb.MessageDrivenBean;
  23. import javax.ejb.MessageDrivenContext;
  24. import javax.jms.Message;
  25. import javax.jms.MessageListener;
  26. import javax.jms.ObjectMessage;

  27. import org.slf4j.Logger;
  28. import org.openspcoop2.core.constants.TipoPdD;
  29. import org.openspcoop2.pdd.core.CostantiPdD;
  30. import org.openspcoop2.pdd.core.PdDContext;
  31. import org.openspcoop2.pdd.core.node.TransactionManager;
  32. import org.openspcoop2.pdd.core.state.IOpenSPCoopState;
  33. import org.openspcoop2.pdd.core.state.OpenSPCoopStateful;
  34. import org.openspcoop2.pdd.core.state.OpenSPCoopStateless;
  35. import org.openspcoop2.pdd.logger.Dump;
  36. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  37. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  38. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  39. import org.openspcoop2.pdd.logger.Tracciamento;
  40. import org.openspcoop2.pdd.services.OpenSPCoop2Startup;
  41. import org.openspcoop2.pdd.timers.TimerMonitoraggioRisorseThread;
  42. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  43. import org.openspcoop2.protocol.engine.constants.Costanti;
  44. import org.openspcoop2.protocol.sdk.ProtocolException;
  45. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  46. import org.openspcoop2.utils.LoggerWrapperFactory;





  47. /**
  48.  * Contiene la definizione di un Message Driven Bean 'InoltroBuste', il quale e' un
  49.  * modulo dell'infrastruttura OpenSPCoop.
  50.  * <p>
  51.  * Inoltre la classe contiene due MessageFactory per la costruzione di un oggetto {@link InoltroBusteMessage}
  52.  * utilizzato per la spedizione di messaggi JMS al mdb, tramita una coda JMS utilizzata in ricezione.
  53.  *
  54.  *
  55.  * @author Poli Andrea (apoli@link.it)
  56.  * @author Tronci Fabio (tronci@link.it)
  57.  * @author $Author$
  58.  * @version $Rev$, $Date$
  59.  */

  60. public class InoltroBusteMDB implements MessageDrivenBean, MessageListener {

  61.      /**
  62.      * serialVersionUID
  63.      */
  64.     private static final long serialVersionUID = 1L;


  65.     /* ********  F I E L D S  P R I V A T I   ******** */

  66.     /** Message Driven Context */
  67.     private transient MessageDrivenContext ctxMDB;

  68.    
  69.    
  70.    

  71.     /* ********  M E T O D I   ******** */
  72.    
  73.     /**
  74.      * Imposta il Contesto del Message Driven Bean.
  75.      * Metodo necessario per l'implementazione dell'interfaccia <code>MessageDrivenBean</code>.
  76.      *
  77.      * @param mdc Contesto del Message Driven Bean.
  78.      *
  79.      */
  80.     @Override
  81.     public void setMessageDrivenContext(MessageDrivenContext mdc) throws EJBException {
  82.         this.ctxMDB = mdc;
  83.     }



  84.     /**
  85.      * Metodo necessario per l'implementazione dell'interfaccia <code>MessageDrivenBean</code>.
  86.      *
  87.      *
  88.      */
  89.     public void ejbCreate() {
  90.         // nop
  91.     }



  92.     /**
  93.      * Metodo necessario per l'implementazione dell'interfaccia <code>MessageDrivenBean</code>.
  94.      *
  95.      */
  96.     @Override
  97.     public void ejbRemove() {
  98.         // nop
  99.     }



  100.     /**
  101.      * Attivato,  quando viene ricevuto sulla coda associata al mdb (coda InoltroBuste)
  102.      * un messaggio JMS. Questo metodo implementa la logica del modulo InoltroBuste
  103.      * dell'infrastruttura OpenSPCoop.
  104.      *
  105.      */
  106.     @Override
  107.     public void onMessage(Message message) {
  108.         if(message instanceof ObjectMessage) {


  109.             /* ------------ Controllo inizializzazione OpenSPCoop -------------------- */
  110.             if( !OpenSPCoop2Startup.initialize){
  111.                 this.ctxMDB.setRollbackOnly();
  112.                 return;
  113.             }

  114.             Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
  115.            
  116.             /* ----------- Controllo risorse disponibili --------------- */
  117.             if( !TimerMonitoraggioRisorseThread.isRisorseDisponibili()){
  118.                 if(log!=null) {
  119.                     log.error("["+InoltroBuste.ID_MODULO+"] Risorse di sistema non disponibili: "+TimerMonitoraggioRisorseThread.getRisorsaNonDisponibile().getMessage(),TimerMonitoraggioRisorseThread.getRisorsaNonDisponibile());
  120.                 }
  121.                 this.ctxMDB.setRollbackOnly();
  122.                 return;
  123.             }
  124.             if( !Tracciamento.tracciamentoDisponibile){
  125.                 if(log!=null) {
  126.                     log.error("["+InoltroBuste.ID_MODULO+"] Tracciatura non disponibile: "+Tracciamento.motivoMalfunzionamentoTracciamento.getMessage(),Tracciamento.motivoMalfunzionamentoTracciamento);
  127.                 }
  128.                 this.ctxMDB.setRollbackOnly();
  129.                 return;
  130.             }
  131.             if( !MsgDiagnostico.gestoreDiagnosticaDisponibile){
  132.                 if(log!=null) {
  133.                     log.error("["+InoltroBuste.ID_MODULO+"] Sistema di diagnostica non disponibile: "+MsgDiagnostico.motivoMalfunzionamentoDiagnostici.getMessage(),MsgDiagnostico.motivoMalfunzionamentoDiagnostici);
  134.                 }
  135.                 this.ctxMDB.setRollbackOnly();
  136.                 return;
  137.             }
  138.             if( !Dump.isSistemaDumpDisponibile()){
  139.                 log.error("["+InoltroBuste.ID_MODULO+"] Sistema di dump dei contenuti applicativi non disponibile: "+Dump.getMotivoMalfunzionamentoDump().getMessage(),Dump.getMotivoMalfunzionamentoDump());
  140.                 this.ctxMDB.setRollbackOnly();
  141.                 return;
  142.             }
  143.            
  144.            
  145.             /* Logger */
  146.             log = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
  147.             if (log == null) {
  148.                 LoggerWrapperFactory.getLogger(InoltroBusteMDB.class).error("["+ImbustamentoRisposte.ID_MODULO+"]"+" Logger nullo.");
  149.             }
  150.            

  151.            
  152.             /* Creazione oggetto libreria */
  153.            
  154.             InoltroBuste lib = null;
  155.             try{
  156.                 lib = new InoltroBuste(log);
  157.             }catch(Exception e){
  158.                 if(log!=null) {
  159.                     log.error("InoltroBuste.instanziazione: "+e.getMessage(),e);
  160.                 }
  161.                 this.ctxMDB.setRollbackOnly();
  162.                 return;
  163.             }
  164.            
  165.            
  166.            
  167.             /* ----------- Controllo inizializzazione libreria ----------- */
  168.             if( !lib.getInizializzazioneUltimata() ){
  169.                 log = LoggerWrapperFactory.getLogger(InoltroBusteMDB.class);
  170.                 log.error("["+InoltroBuste.ID_MODULO+"] Inizializzazione non riuscita");
  171.                 this.ctxMDB.setRollbackOnly();
  172.                 return;
  173.             }
  174.            





  175.             /* ------------  Lettura parametri della richiesta  ------------- */

  176.             // Logger dei messaggi diagnostici
  177.             MsgDiagnostico msgDiag = MsgDiagnostico.newInstance(TipoPdD.DELEGATA, InoltroBuste.ID_MODULO);

  178.             //  Ricezione Messaggio
  179.             msgDiag.mediumDebug("Ricezione richiesta (InoltroBusteMessage)...");
  180.             ObjectMessage received = (ObjectMessage)message;
  181.             InoltroBusteMessage inoltroBusteMsg = null;
  182.             try{
  183.                 inoltroBusteMsg = (InoltroBusteMessage) received.getObject();
  184.             }   catch(javax.jms.JMSException e){
  185.                 msgDiag.logErroreGenerico(e,"received.getObject(InoltroBusteMessage)");
  186.                 return;
  187.             }  
  188.             if(inoltroBusteMsg.getRichiestaDelegata()!=null && inoltroBusteMsg.getRichiestaDelegata().getIdPortaDelegata()!=null) {
  189.                
  190.                 RequestInfo requestInfo = null;
  191.                 if(inoltroBusteMsg.getPddContext()!=null && inoltroBusteMsg.getPddContext().containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
  192.                     requestInfo = (RequestInfo) inoltroBusteMsg.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  193.                 }
  194.                
  195.                 msgDiag.updatePorta(inoltroBusteMsg.getRichiestaDelegata().getIdPortaDelegata().getNome(), requestInfo);
  196.             }
  197.            
  198.             // ID associato alla richiesta
  199.             String idMessageRequest = null;
  200.             try{
  201.                 idMessageRequest = received.getStringProperty("ID");
  202.             }   catch(javax.jms.JMSException e){
  203.                 msgDiag.logErroreGenerico(e,"received.getStringProperty(ID)");
  204.                 return;
  205.             }
  206.                    
  207.             // Stato
  208.             IOpenSPCoopState stato = null;
  209.             try {
  210.                
  211.                 if ( inoltroBusteMsg.getOpenspcoopstate() != null ){
  212.                     stato = inoltroBusteMsg.getOpenspcoopstate();
  213.                     ((OpenSPCoopStateless)stato).setUseConnection(true);
  214.                     ((OpenSPCoopStateless)stato).setMessageLib(inoltroBusteMsg);
  215.                     ((OpenSPCoopStateless)stato).setIDMessaggioSessione(idMessageRequest);
  216.                 }
  217.                
  218.                 else {
  219.                     stato = new OpenSPCoopStateful();
  220.                     ((OpenSPCoopStateful)stato).setIDMessaggioSessione(idMessageRequest);
  221.                     ((OpenSPCoopStateful)stato).setMessageLib(inoltroBusteMsg);
  222.                 }
  223.                
  224.             }catch (Exception e) {
  225.                 if(log!=null) {
  226.                     log.error("["+InoltroBuste.ID_MODULO+"] Invocazione della libreria non riuscita (verrà effettuato un rollback sulla coda JMS)",e);
  227.                 }
  228.                 this.ctxMDB.setRollbackOnly();
  229.                 return;
  230.             }
  231.            
  232.             // update diagnostico
  233.             msgDiag.updateState(stato.getStatoRichiesta(),stato.getStatoRisposta());
  234.            
  235.            
  236.             /* PddContext */
  237.             PdDContext pddContext = inoltroBusteMsg.getPddContext();
  238.             try{
  239.                 msgDiag.setPddContext(pddContext, ProtocolFactoryManager.getInstance().getProtocolFactoryByName((String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME)));
  240.             }catch(ProtocolException e){
  241.                 msgDiag.logErroreGenerico(e,"ProtocolFactory.instanziazione");
  242.                 this.ctxMDB.setRollbackOnly();
  243.                 return;
  244.             }

  245.             /* ------------------ Validity Check  --------------- */
  246.             msgDiag.mediumDebug("Transaction Manager...");
  247.             try{
  248.                 if(!TransactionManager.validityCheck(msgDiag,InoltroBuste.ID_MODULO,idMessageRequest,
  249.                         Costanti.OUTBOX,received.getJMSMessageID(),pddContext)){
  250.                     msgDiag.addKeyword(CostantiPdD.KEY_ID_MESSAGGIO_TRANSACTION_MANAGER, idMessageRequest);
  251.                     msgDiag.addKeyword(CostantiPdD.KEY_PROPRIETARIO_MESSAGGIO, InoltroBuste.ID_MODULO);
  252.                     msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_ALL,"transactionManager.validityCheckError");
  253.                     return;
  254.                 }
  255.             }catch(Exception e){
  256.                 msgDiag.logErroreGenerico(e,"TransactionManager.validityCheck");
  257.                 this.ctxMDB.setRollbackOnly();
  258.                 return;
  259.             }
  260.            
  261.             EsitoLib esito = null;
  262.             try {
  263.                        
  264.                 esito = lib.onMessage(stato);
  265.                
  266.             }catch (Exception e) {
  267.                 if(log!=null) {
  268.                     log.error("["+InoltroBuste.ID_MODULO+"] Invocazione della libreria non riuscita (verrà effettuato un rollback sulla coda JMS)",e);
  269.                 }
  270.                 this.ctxMDB.setRollbackOnly();
  271.                 return;
  272.             }

  273.    
  274.             if (!esito.isEsitoInvocazione()){
  275.                 if(log!=null) {
  276.                     log.info("["+InoltroBuste.ID_MODULO+"] Invocazione della libreria terminata con esito negativo, verrà effettuato un rollback sulla coda JMS");
  277.                 }
  278.                 this.ctxMDB.setRollbackOnly();
  279.             }  
  280.            
  281.             else {
  282.                 if(log!=null) {
  283.                     log.debug("["+InoltroBuste.ID_MODULO+"] Invocazione della libreria terminata correttamente");
  284.                 }
  285.             }
  286.         }
  287.     }
  288. }