/*
* GLIMPSE: A generic and flexible monitoring infrastructure.
* For further information: http://labsewiki.isti.cnr.it/labse/tools/glimpse/public/main
*
* Copyright (C) 2011 Software Engineering Laboratory - ISTI CNR - Pisa - Italy
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* 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 .
*
*/
package it.cnr.isti.labsedc.glimpse.probe;
import java.util.Properties;
import javax.jms.JMSException;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import it.cnr.isti.labsedc.glimpse.event.GlimpseBaseEvent;
import it.cnr.isti.labsedc.glimpse.event.GlimpseBaseEventAbstract;
import it.cnr.isti.labsedc.glimpse.utils.DebugMessages;
import it.cnr.isti.labsedc.glimpse.utils.Manager;
/**
* This class represent a generic implementation of the interface {@link GlimpseProbe}.
* It provides the abstract method: {@link #sendMessage(GlimpseBaseEvent, boolean)}
* that can be extended if needed.
*
* @author Antonello Calabrò
* @version 3.2
*
*/
public abstract class GlimpseAbstractProbe implements GlimpseProbe {
protected static InitialContext initContext;
protected static TopicSession publishSession;
protected static TopicPublisher tPub;
protected static TopicConnection connection;
protected static Topic connectionTopic;
protected static int MESSAGEID = 0;
/**
* This constructor allow to create a GlimpseAbstractProbe object
* providing the {@link Properties} settings object
* @param settings can be generated automatically
* using {@link Manager#createConsumerSettingsPropertiesObject(String, String, String, String, String, String, boolean, String)}.
*
*/
public GlimpseAbstractProbe(Properties settings) {
try {
initContext = this.initConnection(settings, true);
this.createConnection(initContext,settings.getProperty("probeChannel"), settings, true);
} catch (NamingException e) {
e.printStackTrace();
} catch (JMSException e) {
e.printStackTrace();
}
}
/**
* This method setup a {@link TopicConnection} object.
*
* @param initConn the InitialContext object generated using the method {@link #initConnection(Properties, boolean)}.
* @param settings can be generated automatically using {@link Manager#createProbeSettingsPropertiesObject(String, String, String, String, String, String, boolean, String, String)}
* @param probeChannel
* @param settings
* @param debug
* @return a {@link TopicPublisher} object
* @throws NamingException
* @throws JMSException
*/
protected TopicPublisher createConnection(InitialContext initConn, String probeChannel, Properties settings, boolean debug) throws NamingException, JMSException
{
if (debug)
DebugMessages.print(this.getClass().getSimpleName(),
"Creating ConnectionFactory with settings ");
TopicConnectionFactory connFact = (TopicConnectionFactory)initConn.lookup(settings.getProperty("connectionFactoryNames"));
if (debug) {
DebugMessages.ok();
DebugMessages.print(this.getClass().getSimpleName(),
"Creating TopicConnection "); }
connection = connFact.createTopicConnection();
if (debug) {
DebugMessages.ok();
DebugMessages.line(); }
if (debug) {
DebugMessages.print(this.getClass().getSimpleName(),
"Creating Session "); }
publishSession = connection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
if (debug) {
DebugMessages.ok();
DebugMessages.print(this.getClass().getSimpleName(),
"Looking up for channel ");}
connectionTopic = (Topic) initContext.lookup(probeChannel);
if (debug) {
DebugMessages.ok();
DebugMessages.print(this.getClass().getSimpleName(),
"Creating Publisher "); }
return tPub = publishSession.createPublisher(connectionTopic);
}
/**
* This method setup the connection parameters using the {@link Properties} object {@link #settings}
*
* @param settings the parameter to setup the connection to the Enterprise Service Bus
to send messages
* @param debug
* @return it provides an {@link InitialContext} object that will be used
during the Consumer <-> Monitoring interaction.
* @throws NamingException
*/
protected InitialContext initConnection(Properties settings, boolean debug) throws NamingException {
if (debug)
DebugMessages.print(this.getClass().getSimpleName(),
"Creating InitialContext with settings ");
InitialContext initConn = new InitialContext(settings);
if (debug) {
DebugMessages.ok();
DebugMessages.line(); }
return initConn;
}
public abstract void sendMessage(GlimpseBaseEvent> event, boolean debug);
/**
* This method send a {@link GlimpseBaseEvent} message on the ESB
* specifically on the channel specified in the {@link #settings} object.
*
* @param event the event to send
* @param debug
* @throws JMSException
* @throws NamingException
*/
protected void sendEventMessage(GlimpseBaseEventAbstract> event, boolean debug) throws JMSException,
NamingException {
if (debug) {
DebugMessages.print(this.getClass().getSimpleName(),
"Creating Message "); }
try
{
ObjectMessage messageToSend = publishSession.createObjectMessage();
messageToSend.setJMSMessageID(String.valueOf(MESSAGEID++));
messageToSend.setObject(event);
if (debug) {
DebugMessages.ok();
DebugMessages.print(this.getClass().getSimpleName(),
"Publishing message "); }
tPub.publish(messageToSend);
if (debug) {
DebugMessages.ok();
DebugMessages.line(); }
} catch (JMSException e) {
e.printStackTrace();
}
}
}