ConsegnaContenutiApplicativiMDB.java

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



package org.openspcoop2.pdd.mdb;

import javax.ejb.EJBException;
import javax.ejb.MessageDrivenBean;
import javax.ejb.MessageDrivenContext;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;

import org.slf4j.Logger;
import org.openspcoop2.core.constants.TipoPdD;
import org.openspcoop2.pdd.config.RichiestaApplicativa;
import org.openspcoop2.pdd.config.RichiestaDelegata;
import org.openspcoop2.pdd.core.CostantiPdD;
import org.openspcoop2.pdd.core.PdDContext;
import org.openspcoop2.pdd.core.node.TransactionManager;
import org.openspcoop2.pdd.core.state.IOpenSPCoopState;
import org.openspcoop2.pdd.core.state.OpenSPCoopStateful;
import org.openspcoop2.pdd.core.state.OpenSPCoopStateless;
import org.openspcoop2.pdd.logger.Dump;
import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
import org.openspcoop2.pdd.logger.MsgDiagnostico;
import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
import org.openspcoop2.pdd.logger.Tracciamento;
import org.openspcoop2.pdd.services.OpenSPCoop2Startup;
import org.openspcoop2.pdd.timers.TimerMonitoraggioRisorseThread;
import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
import org.openspcoop2.protocol.engine.constants.Costanti;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.state.RequestInfo;
import org.openspcoop2.protocol.sdk.state.StatelessMessage;
import org.openspcoop2.utils.LoggerWrapperFactory;


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


public class ConsegnaContenutiApplicativiMDB implements MessageDrivenBean, MessageListener {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 1L;

	
	
	
	/* ********  F I E L D S  P R I V A T I   S T A T I C I  ******** */
	
	/** Message Driven Context */
	private transient MessageDrivenContext ctxMDB;
	
	/* ********  M E T O D I  D I MDB  ******** */
	
	/**
	 * Imposta il Contesto del Message Driven Bean.
	 * Metodo necessario per l'implementazione dell'interfaccia <code>MessageDrivenBean</code>.
	 *
	 * @param mdc Contesto del Message Driven Bean.
	 * 
	 */
	@Override
	public void setMessageDrivenContext(MessageDrivenContext mdc) throws EJBException {
		this.ctxMDB = mdc;
	}


	/**
	 * Metodo necessario per l'implementazione dell'interfaccia <code>MessageDrivenBean</code>.
	 *
	 * 
	 */
	public void ejbCreate() {
		// nop
	}


	/**
	 * Metodo necessario per l'implementazione dell'interfaccia <code>MessageDrivenBean</code>.
	 * 
	 */
	@Override
	public void ejbRemove() {
		// nop
	}
	

	/**
	 * Attivato,  quando viene ricevuto sulla coda associata al mdb (coda RequestIN_Soap)
	 * un messaggio JMS. Questo metodo implementa la logica del modulo ConsegnaContenutiApplicativi
	 * dell'infrastruttura OpenSPCoop.
	 * 
	 */
	@Override
	public void onMessage(Message message) {
		if(message instanceof ObjectMessage) {
			
			

			/* ------------ Controllo inizializzazione OpenSPCoop -------------------- */
			if( !OpenSPCoop2Startup.initialize){
				this.ctxMDB.setRollbackOnly();
				return;
			}
			
			/* logger */
			Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
			if (log == null) {
				LoggerWrapperFactory.getLogger(ConsegnaContenutiApplicativiMDB.class).error("["+ConsegnaContenutiApplicativi.ID_MODULO+"]"+" Logger nullo. MDB abortito");
				return;
			}
			
			/* ----------- Controllo risorse disponibili --------------- */
			if( !TimerMonitoraggioRisorseThread.isRisorseDisponibili()){
				log.error("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Risorse di sistema non disponibili: "+TimerMonitoraggioRisorseThread.getRisorsaNonDisponibile().getMessage(),TimerMonitoraggioRisorseThread.getRisorsaNonDisponibile());
				this.ctxMDB.setRollbackOnly();
				return;
			}
			if( !Tracciamento.tracciamentoDisponibile){
				log.error("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Tracciatura non disponibile: "+Tracciamento.motivoMalfunzionamentoTracciamento.getMessage(),Tracciamento.motivoMalfunzionamentoTracciamento);
				this.ctxMDB.setRollbackOnly();
				return;
			}
			if( !MsgDiagnostico.gestoreDiagnosticaDisponibile){
				log.error("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Sistema di diagnostica non disponibile: "+MsgDiagnostico.motivoMalfunzionamentoDiagnostici.getMessage(),MsgDiagnostico.motivoMalfunzionamentoDiagnostici);
				this.ctxMDB.setRollbackOnly();
				return;
			}
			if( !Dump.isSistemaDumpDisponibile()){
				log.error("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Sistema di dump dei contenuti applicativi non disponibile: "+Dump.getMotivoMalfunzionamentoDump().getMessage(),Dump.getMotivoMalfunzionamentoDump());
				this.ctxMDB.setRollbackOnly();
				return;
			}
			
			
			/* Creazione libreria e verifica che sia inizializzata */
			ConsegnaContenutiApplicativi lib = null;
			try{
				lib = new ConsegnaContenutiApplicativi(log);
			}catch(Exception e){
				log.error("ConsegnaContenutiApplicativi.instanziazione: "+e.getMessage(),e);
				this.ctxMDB.setRollbackOnly();
				return;
			}
		
			if (!lib.inizializzazioneUltimata){
				log = LoggerWrapperFactory.getLogger(ConsegnaContenutiApplicativiMDB.class);
				log.error("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Inizializzazione MDB non riuscita");
				this.ctxMDB.setRollbackOnly();
				return;
			}
			
			/* ------------  Lettura parametri della richiesta  ------------- */

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

			//	Ricezione Messaggio
			msgDiag.mediumDebug("Ricezione richiesta (ConsegnaContenutiApplicativiMessage)...");	
			ObjectMessage received = (ObjectMessage)message;
			ConsegnaContenutiApplicativiMessage consegnaContenutiApplicativiMsg = null;
			try{
				consegnaContenutiApplicativiMsg = (ConsegnaContenutiApplicativiMessage)received.getObject();
			}	catch(javax.jms.JMSException e){ 
				msgDiag.logErroreGenerico(e,"received.getObject(ConsegnaContenutiApplicativiMessage)");
				return; 
			}
			
			RequestInfo requestInfo = null;
			if(consegnaContenutiApplicativiMsg.getPddContext()!=null && consegnaContenutiApplicativiMsg.getPddContext().containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
				requestInfo = (RequestInfo) consegnaContenutiApplicativiMsg.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
			}
			
			if(consegnaContenutiApplicativiMsg.getRichiestaApplicativa()!=null && consegnaContenutiApplicativiMsg.getRichiestaApplicativa().getIdPortaApplicativa()!=null) {
				msgDiag.updatePorta(consegnaContenutiApplicativiMsg.getRichiestaApplicativa().getIdPortaApplicativa().getNome(), requestInfo);
			}
			else if(consegnaContenutiApplicativiMsg.getRichiestaDelegata()!=null && consegnaContenutiApplicativiMsg.getRichiestaDelegata().getIdPortaDelegata()!=null) {
				msgDiag.updatePorta(TipoPdD.DELEGATA, consegnaContenutiApplicativiMsg.getRichiestaDelegata().getIdPortaDelegata().getNome(), requestInfo);
			}
			
			// ID associato alla richiesta
			String idMessaggioConsegna = null; //(serve anche per una validazione sincrona)
			try{
				idMessaggioConsegna = received.getStringProperty("ID");
			}	catch(javax.jms.JMSException e){ 
				msgDiag.logErroreGenerico(e,"received.getStringProperty(ID)");
				return;
			}
			
			// Stato
			IOpenSPCoopState stato = null;
			try {
				
				if ( consegnaContenutiApplicativiMsg.getOpenspcoopstate() != null ){
					stato = consegnaContenutiApplicativiMsg.getOpenspcoopstate();
					
					if(stato.getStatoRichiesta()==null &&
						consegnaContenutiApplicativiMsg.getBusta()!=null){
						// Imposto busta nello stato, poiche' lo stato non viene serializzato.
						StatelessMessage statoRichiesta = new StatelessMessage();
						statoRichiesta.setBusta(consegnaContenutiApplicativiMsg.getBusta());
						stato.setStatoRichiesta(statoRichiesta);
					}
										
					((OpenSPCoopStateless)stato).setUseConnection(true);
					((OpenSPCoopStateless)stato).setMessageLib(consegnaContenutiApplicativiMsg);
					((OpenSPCoopStateless)stato).setIDMessaggioSessione(idMessaggioConsegna);
				}
				else {
					stato = new OpenSPCoopStateful();
					((OpenSPCoopStateful)stato).setIDMessaggioSessione(idMessaggioConsegna);
					((OpenSPCoopStateful)stato).setMessageLib(consegnaContenutiApplicativiMsg);	
				}
				
			}catch (Exception e) {
				log.error("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Invocazione della libreria non riuscita (verrà effettuato un rollback sulla coda JMS)",e);
				this.ctxMDB.setRollbackOnly();
				return;
			}
			
			// update diagnostico
			msgDiag.updateState(stato.getStatoRichiesta(),stato.getStatoRisposta());
			
			
			/* PddContext */
			PdDContext pddContext = consegnaContenutiApplicativiMsg.getPddContext();
			
			try{
				msgDiag.setPddContext(pddContext, ProtocolFactoryManager.getInstance().getProtocolFactoryByName((String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME)));
			}catch(ProtocolException e){
				msgDiag.logErroreGenerico(e,"ProtocolFactory.instanziazione");
				this.ctxMDB.setRollbackOnly();
				return;
			}
			
			
			RichiestaApplicativa richiestaApplicativa = consegnaContenutiApplicativiMsg.getRichiestaApplicativa();
			RichiestaDelegata richiestaDelegata = consegnaContenutiApplicativiMsg.getRichiestaDelegata();
			String servizioApplicativo = null;
			if (richiestaApplicativa != null)servizioApplicativo = richiestaApplicativa.getServizioApplicativo();
			else servizioApplicativo = richiestaDelegata.getServizioApplicativo();
			
			/* ------------------ Validity Check  --------------- */
			msgDiag.mediumDebug("Transaction Manager...");
			try{
				if(!TransactionManager.validityCheck(msgDiag,ConsegnaContenutiApplicativi.ID_MODULO,idMessaggioConsegna,
						Costanti.INBOX,received.getJMSMessageID(),pddContext,
						servizioApplicativo)){
					msgDiag.addKeyword(CostantiPdD.KEY_ID_MESSAGGIO_TRANSACTION_MANAGER, idMessaggioConsegna);
					msgDiag.addKeyword(CostantiPdD.KEY_PROPRIETARIO_MESSAGGIO, ConsegnaContenutiApplicativi.ID_MODULO);
					msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_ALL,"transactionManager.validityCheckError");
					return;
				}
			}catch(Exception e){
				msgDiag.logErroreGenerico(e,"TransactionManager.validityCheck");
				this.ctxMDB.setRollbackOnly();
				return;
			}

			
			EsitoLib esito = null;
			try {
				
				esito = lib.onMessage(stato);
				
			}catch (Exception e) {
				log.error("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Invocazione della libreria non riuscita (verrà effettuato un rollback sulla coda JMS)",e);
				this.ctxMDB.setRollbackOnly();
				return;
			}
		
			if (!esito.isEsitoInvocazione()){
				log.info("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Invocazione della libreria terminata con esito negativo, verrà effettuato un rollback sulla coda JMS");
				this.ctxMDB.setRollbackOnly();
			}	
			
			else {
				log.debug("["+ConsegnaContenutiApplicativi.ID_MODULO+"] Invocazione della libreria terminata correttamente");
			}
			
		}
	}
}