JMSSender.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.core;

import javax.jms.JMSException;
import javax.jms.ObjectMessage;
import javax.jms.MessageProducer;
import javax.jms.Queue;

import org.slf4j.Logger;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.pdd.config.JMSObject;
import org.openspcoop2.pdd.config.QueueManager;
import org.openspcoop2.pdd.config.Resource;

/**
 * Classe utilizzata per spedire messaggi JMS ai componenti dell'architettura di OpenSPCoop.
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */

public class JMSSender {

	/** QueueManager */
	private QueueManager qmanager;
	/** Indicazione sul modulo che utilizza il Sender  */
	private String idModulo = null;
	/** Indicazione sul codice porta del Sender */
	private IDSoggetto codicePorta = null;


	/** motivo di un eventuale errore */
	private String errore;
	/** eventuale eccezione */
	private Exception exception;


	/** Logger */
	private Logger log;
	
	/** IDTransazione */
	private String idTransazione;
	

	/**
	 * Costruttore
	 *
	 * @param aCodicePorta Codice del dominio che sta gestendo la richiesta.
	 * @param aIDModulo Identificativo del Sender.
	 * 
	 */
	public JMSSender(IDSoggetto aCodicePorta,String aIDModulo,Logger log,String idTransazione) throws Exception {
		this.codicePorta = aCodicePorta;
		this.idModulo = "JMSSender."+aIDModulo;
		this.qmanager = QueueManager.getInstance();
		this.log = log;
		this.idTransazione = idTransazione;
	}


	/**
	 * Spedizione di un messaggio  
	 *
	 * @param destinatario Nodo destinatario a cui spedire il messaggio. 
	 * @param objectToSend Oggetto da spedire.
	 * @param idBusta Identificativo da impostare come proprieta;
	 * @return true se la spedizione JMS e' andata a buon fine, false altrimenti.
	 * 
	 */
	public boolean send(String destinatario,java.io.Serializable objectToSend,String idBusta){
		java.util.Properties prop = new java.util.Properties();
		prop.put("ID",idBusta);
		return send(destinatario,objectToSend,prop);
	}
	/**
	 * Spedizione di un messaggio  
	 *
	 * @param destinatario Nodo destinatario a cui spedire il messaggio. 
	 * @param objectToSend Oggetto da spedire.
	 * @param properties Proprieta' da impostare.
	 * @return true se la spedizione JMS e' andata a buon fine, false altrimenti.
	 * 
	 */
	public boolean send(String destinatario,java.io.Serializable objectToSend,java.util.Properties properties){

		Resource resource = null;
		MessageProducer sender = null;
		try{

			if(destinatario == null)
				return true; // non deve essere spedito nulla.
			
			JMSObject jmsObject = null;
			try{
				resource = this.qmanager.getResource(this.codicePorta,this.idModulo,this.idTransazione);
				if(resource == null)
					throw new JMSException("Resource is null");
				if(resource.getResource() == null)
					throw new JMSException("JMSObject is null");
				jmsObject = (JMSObject) resource.getResource();
				if(jmsObject.getConnection()==null)
					throw new Exception("Connessione is null");
				if(jmsObject.getSession()==null)
					throw new Exception("Sessione is null");
			}catch(Exception e){
				this.log.error("JMSObject non ottenibile dal Pool: "+e.getMessage(),e);
				this.errore ="JMSObject non ottenibile dal Pool: "+e.getMessage();
				this.exception = e;
				return false;
			}


			// Get Coda
			Queue queue = this.qmanager.getQueue(destinatario);
			if(queue == null){
				this.qmanager.releaseResource(this.codicePorta,this.idModulo,resource);
				this.errore="La coda ["+destinatario+"] non e' tra quelle registrate per OpenSPCoop";
				return false;
			}

			// Sender
			try{
				sender = jmsObject.getSession().createProducer(queue);
			}catch(javax.jms.JMSException e){
				this.qmanager.releaseResource(this.codicePorta,this.idModulo,resource);
				this.log.error("Riscontrato errore durante la creazione del sender ["+destinatario+"] :"+e.getMessage(),e);
				this.errore = "Riscontrato errore durante la creazione del sender ["+destinatario+"] :"+e.getMessage();
				this.exception = e;
				return false;
			}

			// Oggetto da Spedire
			ObjectMessage message = jmsObject.getSession().createObjectMessage(objectToSend);
			java.util.Enumeration<?> en = properties.propertyNames();
			for (; en.hasMoreElements() ;) {
				String key = (String) en.nextElement();
				String value = properties.getProperty(key);
				// Controllo boolean
				if( "true".equalsIgnoreCase(value) ){
					message.setBooleanProperty(key,true);
				}else if("false".equalsIgnoreCase(value)){
					message.setBooleanProperty(key,false);
				}else{
					Long testLong = null;
					try{
						testLong = Long.valueOf(value);
					}catch(Exception e){
						testLong = null;
					}
					// controllo long
					if(testLong != null)
						message.setLongProperty(key,testLong.longValue());
					// string
					else{
						message.setStringProperty(key,value);
					}
				}
			}

			// Send Message
			sender.send(message);
			
			//	Rilascio producer
			sender.close();

			this.qmanager.releaseResource(this.codicePorta,this.idModulo,resource);
			return true;

		}catch(Exception e){
			//	Rilascio producer
			try{
				if(sender!=null)
					sender.close();
			}catch(Exception eClose){
				// close
			}
			if(resource!=null){
				try{
					this.qmanager.releaseResource(this.codicePorta,this.idModulo,resource);
				}catch(Exception eClose){
					// close
				}	
			}
			this.log.error("Riscontrato errore durante la creazione/spedizione dell'oggetto :"+e.getMessage(),e);
			this.errore = "Riscontrato errore durante la creazione/spedizione dell'oggetto :"+e.getMessage();
			this.exception = e;
			return false;
		}

	}

	/**
	 * In caso di avvenuto errore in fase di consegna, questo metodo ritorna il motivo dell'errore.
	 *
	 * @return motivo dell'errore (se avvenuto in fase di consegna).
	 * 
	 */
	public String getErrore(){
		return this.errore;
	}

	
	public Exception getException() {
		return this.exception;
	}
}