InoltroRisposteMDB.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.Busta;
  45. import org.openspcoop2.protocol.sdk.ProtocolException;
  46. import org.openspcoop2.utils.LoggerWrapperFactory;


  47. /**
  48.  * Contiene la definizione di un Message Driven Bean 'InoltroRisposte', 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 InoltroRisposteMessage}
  52.  * utilizzato per la spedizione di messaggi JMS al mdb, tramita una coda JMS utilizzata in ricezione.
  53.  *
  54.  * @author Poli Andrea (apoli@link.it)
  55.  * @author Tronci Fabio (tronci@link.it)
  56.  * @author $Author$
  57.  * @version $Rev$, $Date$
  58.  */

  59. public class InoltroRisposteMDB implements MessageDrivenBean, MessageListener {

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



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

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


  67.    
  68.     /* ********  M E T O D I   ******** */

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



  80.     /**
  81.      * Metodo necessario per l'implementazione dell'interfaccia <code>MessageDrivenBean</code>.
  82.      *
  83.      *
  84.      */
  85.     public void ejbCreate() {
  86.         // nop
  87.     }



  88.     /**
  89.      * Metodo necessario per l'implementazione dell'interfaccia <code>MessageDrivenBean</code>.
  90.      *
  91.      */
  92.     @Override
  93.     public void ejbRemove() {
  94.         // nop
  95.     }



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

  105.             /* ------------ Controllo inizializzazione OpenSPCoop -------------------- */
  106.             if( !OpenSPCoop2Startup.initialize){
  107.                 this.ctxMDB.setRollbackOnly();
  108.                 return;
  109.             }

  110.             /* logger */
  111.             Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
  112.             if (log == null) {
  113.                 LoggerWrapperFactory.getLogger(InoltroRisposteMDB.class).error("["+InoltroRisposte.ID_MODULO+"]"+" Logger nullo. MDB abortito");
  114.                 return;
  115.             }
  116.            
  117.             /* ----------- Controllo risorse disponibili --------------- */
  118.             if( !TimerMonitoraggioRisorseThread.isRisorseDisponibili()){
  119.                 log.error("["+InoltroRisposte.ID_MODULO+"] Risorse di sistema non disponibili: "+TimerMonitoraggioRisorseThread.getRisorsaNonDisponibile().getMessage(),TimerMonitoraggioRisorseThread.getRisorsaNonDisponibile());
  120.                 this.ctxMDB.setRollbackOnly();
  121.                 return;
  122.             }
  123.             if( !Tracciamento.tracciamentoDisponibile){
  124.                 log.error("["+InoltroRisposte.ID_MODULO+"] Tracciatura non disponibile: "+Tracciamento.motivoMalfunzionamentoTracciamento.getMessage(),Tracciamento.motivoMalfunzionamentoTracciamento);
  125.                 this.ctxMDB.setRollbackOnly();
  126.                 return;
  127.             }
  128.             if( !MsgDiagnostico.gestoreDiagnosticaDisponibile){
  129.                 log.error("["+InoltroRisposte.ID_MODULO+"] Sistema di diagnostica non disponibile: "+MsgDiagnostico.motivoMalfunzionamentoDiagnostici.getMessage(),MsgDiagnostico.motivoMalfunzionamentoDiagnostici);
  130.                 this.ctxMDB.setRollbackOnly();
  131.                 return;
  132.             }
  133.             if( !Dump.isSistemaDumpDisponibile()){
  134.                 log.error("["+InoltroRisposte.ID_MODULO+"] Sistema di dump dei contenuti applicativi non disponibile: "+Dump.getMotivoMalfunzionamentoDump().getMessage(),Dump.getMotivoMalfunzionamentoDump());
  135.                 this.ctxMDB.setRollbackOnly();
  136.                 return;
  137.             }


  138.             InoltroRisposte lib = null;
  139.             try{
  140.                 lib = new InoltroRisposte(log);
  141.             }catch(Exception e){
  142.                 log.error("InoltroRisposte.instanziazione: "+e.getMessage(),e);
  143.                 this.ctxMDB.setRollbackOnly();
  144.                 return;
  145.             }
  146.            
  147.            
  148.             /* ----------- Controllo inizializzazione lib ----------- */
  149.             if( !lib.inizializzazioneUltimata ){
  150.                 log = LoggerWrapperFactory.getLogger(InoltroRisposteMDB.class);
  151.                 log.error("["+InoltroRisposte.ID_MODULO+"] Inizializzazione MDB non riuscita");
  152.                 this.ctxMDB.setRollbackOnly();
  153.                 return;
  154.             }
  155.            
  156.             /* ------------  Lettura parametri della richiesta  ------------- */

  157.             // Logger dei messaggi diagnostici
  158.             MsgDiagnostico msgDiag = MsgDiagnostico.newInstance(TipoPdD.APPLICATIVA, InoltroRisposte.ID_MODULO);

  159.             //  Ricezione Messaggio
  160.             msgDiag.mediumDebug("Ricezione richiesta (InoltroRisposteMessage)...");
  161.             ObjectMessage received = (ObjectMessage)message;
  162.             InoltroRisposteMessage inoltroRisposteMsg = null;
  163.             try{
  164.                 inoltroRisposteMsg = (InoltroRisposteMessage)received.getObject();
  165.             }   catch(javax.jms.JMSException e){
  166.                 msgDiag.logErroreGenerico(e,"received.getObject(InoltroRisposteMessage)");
  167.                 return;
  168.             }
  169.            
  170.             // ID associato alla richiesta
  171.             String idMessageRequest = null; //(serve anche per una validazione sincrona)
  172.             try{
  173.                 idMessageRequest = received.getStringProperty("ID");
  174.             }   catch(javax.jms.JMSException e){
  175.                 msgDiag.logErroreGenerico(e,"received.getStringProperty(ID)");
  176.                 return;
  177.             }
  178.            
  179.             // Stato
  180.             IOpenSPCoopState stato = null;
  181.             try {
  182.                
  183.                 if ( inoltroRisposteMsg.getOpenspcoopstate() != null ){
  184.                     stato = inoltroRisposteMsg.getOpenspcoopstate();
  185.                     ((OpenSPCoopStateless)stato).setUseConnection(true);
  186.                     ((OpenSPCoopStateless)stato).setMessageLib(inoltroRisposteMsg);
  187.                     ((OpenSPCoopStateless)stato).setIDMessaggioSessione(idMessageRequest);
  188.                 }
  189.                
  190.                 else {
  191.                     stato = new OpenSPCoopStateful();
  192.                     ((OpenSPCoopStateful)stato).setIDMessaggioSessione(idMessageRequest);
  193.                     ((OpenSPCoopStateful)stato).setMessageLib(inoltroRisposteMsg);
  194.                 }
  195.                
  196.             }catch (Exception e) {
  197.                 log.error("["+InoltroRisposte.ID_MODULO+"] Invocazione della libreria non riuscita (verrà effettuato un rollback sulla coda JMS)",e);
  198.                 this.ctxMDB.setRollbackOnly();
  199.                 return;
  200.             }
  201.            
  202.             // update diagnostico
  203.             msgDiag.updateState(stato.getStatoRichiesta(),stato.getStatoRisposta());
  204.                        

  205.             /* PddContext */
  206.             PdDContext pddContext = inoltroRisposteMsg.getPddContext();
  207.             try{
  208.                 msgDiag.setPddContext(pddContext, ProtocolFactoryManager.getInstance().getProtocolFactoryByName((String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME)));
  209.             }catch(ProtocolException e){
  210.                 msgDiag.logErroreGenerico(e,"ProtocolFactory.instanziazione");
  211.                 this.ctxMDB.setRollbackOnly();
  212.                 return;
  213.             }
  214.            

  215.            
  216.             Busta busta = inoltroRisposteMsg.getBustaRisposta();
  217.            
  218.             /* ------------------ Validity Check  --------------- */
  219.             msgDiag.mediumDebug("Transaction Manager...");
  220.             try{
  221.                 if(!TransactionManager.validityCheck(msgDiag,InoltroRisposte.ID_MODULO,busta.getID(),
  222.                         Costanti.OUTBOX,received.getJMSMessageID(),pddContext)){
  223.                     msgDiag.addKeyword(CostantiPdD.KEY_ID_MESSAGGIO_TRANSACTION_MANAGER, idMessageRequest);
  224.                     msgDiag.addKeyword(CostantiPdD.KEY_PROPRIETARIO_MESSAGGIO, InoltroRisposte.ID_MODULO);
  225.                     msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_ALL,"transactionManager.validityCheckError");
  226.                     return;
  227.                 }
  228.             }catch(Exception e){
  229.                 msgDiag.logErroreGenerico(e,"TransactionManager.validityCheck");
  230.                 this.ctxMDB.setRollbackOnly();
  231.                 return;
  232.             }
  233.            
  234.            
  235.             EsitoLib esito = null;
  236.             try {
  237.                        
  238.                 esito = lib.onMessage(stato);
  239.                
  240.             }catch (Exception e) {
  241.                 log.error("["+InoltroRisposte.ID_MODULO+"] Invocazione della libreria non riuscita (verrà effettuato un rollback sulla coda JMS)",e);
  242.                 this.ctxMDB.setRollbackOnly();
  243.                 return;
  244.             }
  245.            
  246.             if (!esito.isEsitoInvocazione()){
  247.                 log.info("["+InoltroRisposte.ID_MODULO+"] Invocazione della libreria terminata con esito negativo, verrà effettuato un rollback sulla coda JMS");
  248.                 this.ctxMDB.setRollbackOnly();
  249.             }  
  250.            
  251.             else {
  252.                 log.debug("["+InoltroRisposte.ID_MODULO+"] Invocazione della libreria terminata correttamente");
  253.             }
  254.            
  255.         }
  256.     }
  257. }
  258.            
  259.