ConsegnaContenutiApplicativiMDB.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.config.RichiestaApplicativa;
  30. import org.openspcoop2.pdd.config.RichiestaDelegata;
  31. import org.openspcoop2.pdd.core.CostantiPdD;
  32. import org.openspcoop2.pdd.core.PdDContext;
  33. import org.openspcoop2.pdd.core.node.TransactionManager;
  34. import org.openspcoop2.pdd.core.state.IOpenSPCoopState;
  35. import org.openspcoop2.pdd.core.state.OpenSPCoopStateful;
  36. import org.openspcoop2.pdd.core.state.OpenSPCoopStateless;
  37. import org.openspcoop2.pdd.logger.Dump;
  38. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  39. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  40. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  41. import org.openspcoop2.pdd.logger.Tracciamento;
  42. import org.openspcoop2.pdd.services.OpenSPCoop2Startup;
  43. import org.openspcoop2.pdd.timers.TimerMonitoraggioRisorseThread;
  44. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  45. import org.openspcoop2.protocol.engine.constants.Costanti;
  46. import org.openspcoop2.protocol.sdk.ProtocolException;
  47. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  48. import org.openspcoop2.protocol.sdk.state.StatelessMessage;
  49. import org.openspcoop2.utils.LoggerWrapperFactory;


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


  64. public class ConsegnaContenutiApplicativiMDB implements MessageDrivenBean, MessageListener {

  65.     /**
  66.      * serialVersionUID
  67.      */
  68.     private static final long serialVersionUID = 1L;

  69.    
  70.    
  71.    
  72.     /* ********  F I E L D S  P R I V A T I   S T A T I C I  ******** */
  73.    
  74.     /** Message Driven Context */
  75.     private transient MessageDrivenContext ctxMDB;
  76.    
  77.     /* ********  M E T O D I  D I MDB  ******** */
  78.    
  79.     /**
  80.      * Imposta il Contesto del Message Driven Bean.
  81.      * Metodo necessario per l'implementazione dell'interfaccia <code>MessageDrivenBean</code>.
  82.      *
  83.      * @param mdc Contesto del Message Driven Bean.
  84.      *
  85.      */
  86.     @Override
  87.     public void setMessageDrivenContext(MessageDrivenContext mdc) throws EJBException {
  88.         this.ctxMDB = mdc;
  89.     }


  90.     /**
  91.      * Metodo necessario per l'implementazione dell'interfaccia <code>MessageDrivenBean</code>.
  92.      *
  93.      *
  94.      */
  95.     public void ejbCreate() {
  96.         // nop
  97.     }


  98.     /**
  99.      * Metodo necessario per l'implementazione dell'interfaccia <code>MessageDrivenBean</code>.
  100.      *
  101.      */
  102.     @Override
  103.     public void ejbRemove() {
  104.         // nop
  105.     }
  106.    

  107.     /**
  108.      * Attivato,  quando viene ricevuto sulla coda associata al mdb (coda RequestIN_Soap)
  109.      * un messaggio JMS. Questo metodo implementa la logica del modulo ConsegnaContenutiApplicativi
  110.      * dell'infrastruttura OpenSPCoop.
  111.      *
  112.      */
  113.     @Override
  114.     public void onMessage(Message message) {
  115.         if(message instanceof ObjectMessage) {
  116.            
  117.            

  118.             /* ------------ Controllo inizializzazione OpenSPCoop -------------------- */
  119.             if( !OpenSPCoop2Startup.initialize){
  120.                 this.ctxMDB.setRollbackOnly();
  121.                 return;
  122.             }
  123.            
  124.             /* logger */
  125.             Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
  126.             if (log == null) {
  127.                 LoggerWrapperFactory.getLogger(ConsegnaContenutiApplicativiMDB.class).error("["+ConsegnaContenutiApplicativi.ID_MODULO+"]"+" Logger nullo. MDB abortito");
  128.                 return;
  129.             }
  130.            
  131.             /* ----------- Controllo risorse disponibili --------------- */
  132.             if( !TimerMonitoraggioRisorseThread.isRisorseDisponibili()){
  133.                 log.error("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Risorse di sistema non disponibili: "+TimerMonitoraggioRisorseThread.getRisorsaNonDisponibile().getMessage(),TimerMonitoraggioRisorseThread.getRisorsaNonDisponibile());
  134.                 this.ctxMDB.setRollbackOnly();
  135.                 return;
  136.             }
  137.             if( !Tracciamento.tracciamentoDisponibile){
  138.                 log.error("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Tracciatura non disponibile: "+Tracciamento.motivoMalfunzionamentoTracciamento.getMessage(),Tracciamento.motivoMalfunzionamentoTracciamento);
  139.                 this.ctxMDB.setRollbackOnly();
  140.                 return;
  141.             }
  142.             if( !MsgDiagnostico.gestoreDiagnosticaDisponibile){
  143.                 log.error("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Sistema di diagnostica non disponibile: "+MsgDiagnostico.motivoMalfunzionamentoDiagnostici.getMessage(),MsgDiagnostico.motivoMalfunzionamentoDiagnostici);
  144.                 this.ctxMDB.setRollbackOnly();
  145.                 return;
  146.             }
  147.             if( !Dump.isSistemaDumpDisponibile()){
  148.                 log.error("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Sistema di dump dei contenuti applicativi non disponibile: "+Dump.getMotivoMalfunzionamentoDump().getMessage(),Dump.getMotivoMalfunzionamentoDump());
  149.                 this.ctxMDB.setRollbackOnly();
  150.                 return;
  151.             }
  152.            
  153.            
  154.             /* Creazione libreria e verifica che sia inizializzata */
  155.             ConsegnaContenutiApplicativi lib = null;
  156.             try{
  157.                 lib = new ConsegnaContenutiApplicativi(log);
  158.             }catch(Exception e){
  159.                 log.error("ConsegnaContenutiApplicativi.instanziazione: "+e.getMessage(),e);
  160.                 this.ctxMDB.setRollbackOnly();
  161.                 return;
  162.             }
  163.        
  164.             if (!lib.inizializzazioneUltimata){
  165.                 log = LoggerWrapperFactory.getLogger(ConsegnaContenutiApplicativiMDB.class);
  166.                 log.error("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Inizializzazione MDB non riuscita");
  167.                 this.ctxMDB.setRollbackOnly();
  168.                 return;
  169.             }
  170.            
  171.             /* ------------  Lettura parametri della richiesta  ------------- */

  172.             //Logger dei messaggi diagnostici
  173.             MsgDiagnostico msgDiag = MsgDiagnostico.newInstance(TipoPdD.APPLICATIVA,ConsegnaContenutiApplicativi.ID_MODULO);

  174.             //  Ricezione Messaggio
  175.             msgDiag.mediumDebug("Ricezione richiesta (ConsegnaContenutiApplicativiMessage)...");    
  176.             ObjectMessage received = (ObjectMessage)message;
  177.             ConsegnaContenutiApplicativiMessage consegnaContenutiApplicativiMsg = null;
  178.             try{
  179.                 consegnaContenutiApplicativiMsg = (ConsegnaContenutiApplicativiMessage)received.getObject();
  180.             }   catch(javax.jms.JMSException e){
  181.                 msgDiag.logErroreGenerico(e,"received.getObject(ConsegnaContenutiApplicativiMessage)");
  182.                 return;
  183.             }
  184.            
  185.             RequestInfo requestInfo = null;
  186.             if(consegnaContenutiApplicativiMsg.getPddContext()!=null && consegnaContenutiApplicativiMsg.getPddContext().containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
  187.                 requestInfo = (RequestInfo) consegnaContenutiApplicativiMsg.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  188.             }
  189.            
  190.             if(consegnaContenutiApplicativiMsg.getRichiestaApplicativa()!=null && consegnaContenutiApplicativiMsg.getRichiestaApplicativa().getIdPortaApplicativa()!=null) {
  191.                 msgDiag.updatePorta(consegnaContenutiApplicativiMsg.getRichiestaApplicativa().getIdPortaApplicativa().getNome(), requestInfo);
  192.             }
  193.             else if(consegnaContenutiApplicativiMsg.getRichiestaDelegata()!=null && consegnaContenutiApplicativiMsg.getRichiestaDelegata().getIdPortaDelegata()!=null) {
  194.                 msgDiag.updatePorta(TipoPdD.DELEGATA, consegnaContenutiApplicativiMsg.getRichiestaDelegata().getIdPortaDelegata().getNome(), requestInfo);
  195.             }
  196.            
  197.             // ID associato alla richiesta
  198.             String idMessaggioConsegna = null; //(serve anche per una validazione sincrona)
  199.             try{
  200.                 idMessaggioConsegna = received.getStringProperty("ID");
  201.             }   catch(javax.jms.JMSException e){
  202.                 msgDiag.logErroreGenerico(e,"received.getStringProperty(ID)");
  203.                 return;
  204.             }
  205.            
  206.             // Stato
  207.             IOpenSPCoopState stato = null;
  208.             try {
  209.                
  210.                 if ( consegnaContenutiApplicativiMsg.getOpenspcoopstate() != null ){
  211.                     stato = consegnaContenutiApplicativiMsg.getOpenspcoopstate();
  212.                    
  213.                     if(stato.getStatoRichiesta()==null &&
  214.                         consegnaContenutiApplicativiMsg.getBusta()!=null){
  215.                         // Imposto busta nello stato, poiche' lo stato non viene serializzato.
  216.                         StatelessMessage statoRichiesta = new StatelessMessage();
  217.                         statoRichiesta.setBusta(consegnaContenutiApplicativiMsg.getBusta());
  218.                         stato.setStatoRichiesta(statoRichiesta);
  219.                     }
  220.                                        
  221.                     ((OpenSPCoopStateless)stato).setUseConnection(true);
  222.                     ((OpenSPCoopStateless)stato).setMessageLib(consegnaContenutiApplicativiMsg);
  223.                     ((OpenSPCoopStateless)stato).setIDMessaggioSessione(idMessaggioConsegna);
  224.                 }
  225.                 else {
  226.                     stato = new OpenSPCoopStateful();
  227.                     ((OpenSPCoopStateful)stato).setIDMessaggioSessione(idMessaggioConsegna);
  228.                     ((OpenSPCoopStateful)stato).setMessageLib(consegnaContenutiApplicativiMsg);
  229.                 }
  230.                
  231.             }catch (Exception e) {
  232.                 log.error("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Invocazione della libreria non riuscita (verrà effettuato un rollback sulla coda JMS)",e);
  233.                 this.ctxMDB.setRollbackOnly();
  234.                 return;
  235.             }
  236.            
  237.             // update diagnostico
  238.             msgDiag.updateState(stato.getStatoRichiesta(),stato.getStatoRisposta());
  239.            
  240.            
  241.             /* PddContext */
  242.             PdDContext pddContext = consegnaContenutiApplicativiMsg.getPddContext();
  243.            
  244.             try{
  245.                 msgDiag.setPddContext(pddContext, ProtocolFactoryManager.getInstance().getProtocolFactoryByName((String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME)));
  246.             }catch(ProtocolException e){
  247.                 msgDiag.logErroreGenerico(e,"ProtocolFactory.instanziazione");
  248.                 this.ctxMDB.setRollbackOnly();
  249.                 return;
  250.             }
  251.            
  252.            
  253.             RichiestaApplicativa richiestaApplicativa = consegnaContenutiApplicativiMsg.getRichiestaApplicativa();
  254.             RichiestaDelegata richiestaDelegata = consegnaContenutiApplicativiMsg.getRichiestaDelegata();
  255.             String servizioApplicativo = null;
  256.             if (richiestaApplicativa != null)servizioApplicativo = richiestaApplicativa.getServizioApplicativo();
  257.             else servizioApplicativo = richiestaDelegata.getServizioApplicativo();
  258.            
  259.             /* ------------------ Validity Check  --------------- */
  260.             msgDiag.mediumDebug("Transaction Manager...");
  261.             try{
  262.                 if(!TransactionManager.validityCheck(msgDiag,ConsegnaContenutiApplicativi.ID_MODULO,idMessaggioConsegna,
  263.                         Costanti.INBOX,received.getJMSMessageID(),pddContext,
  264.                         servizioApplicativo)){
  265.                     msgDiag.addKeyword(CostantiPdD.KEY_ID_MESSAGGIO_TRANSACTION_MANAGER, idMessaggioConsegna);
  266.                     msgDiag.addKeyword(CostantiPdD.KEY_PROPRIETARIO_MESSAGGIO, ConsegnaContenutiApplicativi.ID_MODULO);
  267.                     msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_ALL,"transactionManager.validityCheckError");
  268.                     return;
  269.                 }
  270.             }catch(Exception e){
  271.                 msgDiag.logErroreGenerico(e,"TransactionManager.validityCheck");
  272.                 this.ctxMDB.setRollbackOnly();
  273.                 return;
  274.             }

  275.            
  276.             EsitoLib esito = null;
  277.             try {
  278.                
  279.                 esito = lib.onMessage(stato);
  280.                
  281.             }catch (Exception e) {
  282.                 log.error("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Invocazione della libreria non riuscita (verrà effettuato un rollback sulla coda JMS)",e);
  283.                 this.ctxMDB.setRollbackOnly();
  284.                 return;
  285.             }
  286.        
  287.             if (!esito.isEsitoInvocazione()){
  288.                 log.info("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Invocazione della libreria terminata con esito negativo, verrà effettuato un rollback sulla coda JMS");
  289.                 this.ctxMDB.setRollbackOnly();
  290.             }  
  291.            
  292.             else {
  293.                 log.debug("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Invocazione della libreria terminata correttamente");
  294.             }
  295.            
  296.         }
  297.     }
  298. }