/*
 * Creado el 26-feb-04
 *
 * Para cambiar la plantilla para este archivo generado vaya a
 * Ventana&gt;Preferencias&gt;Java&gt;Generación de código&gt;Código y comentarios
 */
package es.ejie.frmk.conectores.conectorJMS;

import java.io.Serializable;

import javax.jms.ObjectMessage;
import javax.jms.Topic;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;

import es.ejie.frmk.Q70Factoria;
import es.ejie.frmk.control.arranque.Q70GestorArranqueConfiguracionServidor;
import es.ejie.frmk.infraestructura.logs.conectores.Q70LogConectoresInterface;
import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;
import es.ejie.frmk.infraestructura.traza.Q70TrazaInterface;

/**
 * @author sp86512
 *
 * Esta clase abstracta permite enviar mensajes a topics JMS. El componente o aplicación
 * que precise esta funcionalizad, extenderá esta clase. Una vez instanciada, bastará con
 * invocar al método de publicación para enviar el mensaje. 
 * Es importante cerrar la conexión una vez que la clase esté lista para se recogida por el GC
 */
public abstract class Q70PublicarJMS {
	
	private String ubicacion = null;
	
	public Q70PublicarJMS (String ubicacion)  throws Q70ConectorJMSExcepcion{
		Q70ConectorJMS.getSingleton().getConnection(ubicacion);		
		this.ubicacion = ubicacion;		
	}
	/**
	 * Permite la publicación de un mensaje
	 * @param <code>nombreJNDI</code> nombre JNDI del topic sobre el que se publica
	 * @param <code>deliveryMessage</code> Objeto serializable que se publica
	 * @exception <code>ConectorJMSExcepcion</code>
	 */			
	public synchronized void publishMessage(String nombreTopic, Serializable deliveryMessage) throws Q70ConectorJMSExcepcion{
		long tiempoDeVida = Long.parseLong(Q70GestorArranqueConfiguracionServidor.getGlobalProperty("TIEMPO_DE_VIDA_MENSAJE_JMS").toString());		
		publishMessage(nombreTopic, tiempoDeVida, deliveryMessage);
	}
	/**
	 * Permite la publicación de un mensaje
	 * @param <code>nombreJNDI</code> del topic sobre el que se publica
	 * @param <code>deliveryMessage</code> Objeto serializable que se publica
	 * @param <code>timeToLive</code> Tiempo transcurrido hasta que caduca el mensaje 
	 * @exception <code>ConectrJMSExcepcion</code>
	 */				
	public synchronized void publishMessage(String nombreTopic, long timeToLive, Serializable deliveryMessage) throws Q70ConectorJMSExcepcion{
		// Obtenemos la conexion JMS para la publicacion del mensaje y a continuación
		// publicamos el mensaje. Un vez hecho, se cierran las conexiones
		Q70TrazaInterface traza = Q70Factoria.getTraza();
		Q70LogConectoresInterface log = Q70Factoria.getLogConectores();
		
		if (traza.isTraceActive()){
			traza.trace(Q70Constantes.ID_COMPONENTE, Q70TraceLevel.DEBUG, "Servicio de Coordinacion --> publishMessage");
		} 
		TopicSession session = Q70ConectorJMS.getSingleton().getSession(ubicacion);
		TopicPublisher publisher = null;		
		try{                                                                                                      
			publisher = session.createPublisher((Topic)Q70ConectorJMS.getSingleton().getTopic(nombreTopic, ubicacion));                       
			ObjectMessage message = session.createObjectMessage(); 
			message.setStringProperty(Q70GestorArranqueConfiguracionServidor.ID_FRAMEWORK, Q70GestorArranqueConfiguracionServidor.getGlobalProperty(Q70GestorArranqueConfiguracionServidor.ID_FRAMEWORK));                                                      		  
			message.setObject(deliveryMessage);                                                              
			publisher.publish(message, Q70Constantes.delivery, Q70Constantes.priority, timeToLive);
			}catch(Exception e) {
				if (traza.isTraceActive()) {
					traza.trace(Q70Constantes.ID_COMPONENTE, Q70TraceLevel.ERROR, "" + "Error publicando mensaje JMS " + deliveryMessage.toString());
				}							
				throw new Q70ConectorJMSExcepcion(this.getClass().getName(), "publishMessage", "Error publicando mensaje JMS", e);                                                                                                               
			}finally{
				try{
					if(publisher != null)
						publisher.close();
					if(session != null)						
						session.close();
				}catch(Exception e){}
			}
		if (traza.isTraceActive()) {
			traza.trace(Q70Constantes.ID_COMPONENTE, Q70TraceLevel.DEBUG, "Publicado mensaje JMS " + deliveryMessage.getClass() + " en " + nombreTopic);
		}
		if(log.isEnabled())
			log.log(nombreTopic, Q70Constantes.ID_COMPONENTE,"Publicado mensaje " + deliveryMessage.toString(),"", "OK", "");
	}

	public void closeJMSConection(){
		Q70ConectorJMS.getSingleton().closeConnection(ubicacion);
	}
}
