/*
 * Creado el 12-feb-04
 *
 */
package es.ejie.frmk.control.eventosremotos;

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

import es.ejie.frmk.Q70Factoria;
import es.ejie.frmk.control.excepciones.Q70GestorDeExcepcionesServidor;
import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;
import es.ejie.frmk.infraestructura.traza.Q70TrazaInterface;

/**
 * Clase que permanece a la escucha de mensajes JMS y se encarga de su recepción y 
 * tratamiento. Implementa el interfaz MessageListener y por tanto deberá implementar
 * el método onMessage que es el encargado de gestionar los mensajes JMS recibidos.
 */
public abstract class Q70EscuchaEventos implements MessageListener, MessageDrivenBean {
	
	private static final String ID_COMPONENTE = "GESTOREVENTOSREMOTOS";
	
	public Q70EscuchaEventos() {
		super();
	}

	/** 
	 * Método encargado del tratamiendo de los mensajes JMS recibidos.
	 * @see javax.jms.MessageListener#onMessage(javax.jms.Message)
	 */
	public void onMessage(Message mensaje) {
		Q70TrazaInterface traza = Q70Factoria.getTraza();
		if (traza.isTraceActive()) {
			traza.trace(ID_COMPONENTE, Q70TraceLevel.DEBUG, "EscuchaContextoGlobal --> onMessage");
		}
		String asunto = "error DestinationJMS";
		try {
			if (mensaje.getJMSDestination()!= null)
				asunto = mensaje.getJMSDestination().toString();
		} catch (JMSException e) {
		}

		/** 
		 * @version 2.0 Fecha 16-feb-06 - Comentado para que funcione en cluster. 		
			String idFrameworkMessage = null;
			try
			{
				idFrameworkMessage = mensaje.getStringProperty(Q70GestorArranqueConfiguracionServidor.ID_FRAMEWORK);
			}
			catch (JMSException jmse)
			{
				Q70GestorDeExcepcionesServidor.getSingleton().recogerThrowable(jmse);
			}

			//Si el mensaje fue publicado por este Geremua, no se hace nada
			if ( idFrameworkMessage == null || idFrameworkMessage.equals(Q70GestorArranqueConfiguracionServidor.getGlobalProperty(Q70GestorArranqueConfiguracionServidor.ID_FRAMEWORK)) ){
				return;
			}
		*/
		
		try{
			executeEvent(mensaje, asunto);
		} catch (Exception e){			
			Q70GestorEventosRemotosExcepcion gere = new Q70GestorEventosRemotosExcepcion(this.getClass().getName(), "onMessage", "Error al procesar el mensaje", e);
			Q70GestorDeExcepcionesServidor.getSingleton().recogerThrowable(gere);
		}							
		
	}
	
	/**
	 * @see javax.ejb.MessageDrivenBean#ejbRemove()
	 */
	public void ejbRemove() throws EJBException {
	}
	
	/**
	 * Set the associated context. The container calls this method 
	 * after the instance creation.  <br>
	 * 
	 * The enterprise bean instance should store the reference to the context 
	 * object in an instance variable. <br>
	 * 
	 * This method is called with no transaction context.
	 * 
	 * @param newContext A MessageDrivenContext interface for the instance. 
	 * 
	 * @throws EJBException Thrown by the method to indicate a failure caused by a system-level error.
	 */
	public void setMessageDrivenContext(MessageDrivenContext newContext)
		throws EJBException {
	}
	
	/**
	 * Metodo que ejecuta las acciones necesarias al recibir un evento
	 * 
	 * @param mensaje
	 * @param asunto
	 * @throws Exception 
	 */
	protected abstract void executeEvent(Message mensaje, String asunto) throws Exception;
}
