/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package hermes.ext.ems;
import hermes.Domain;
import hermes.Hermes;
import hermes.HermesAdmin;
import hermes.HermesException;
import hermes.JNDIConnectionFactory;
import hermes.browser.HermesBrowser;
import hermes.config.DestinationConfig;
import hermes.ext.HermesAdminSupport;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.TreeMap;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnectionFactory;
import javax.jms.TopicConnectionFactory;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;
import com.tibco.tibjms.admin.DestinationInfo;
import com.tibco.tibjms.admin.DurableInfo;
import com.tibco.tibjms.admin.QueueInfo;
import com.tibco.tibjms.admin.TibjmsAdmin;
import com.tibco.tibjms.admin.TibjmsAdminException;
import com.tibco.tibjms.admin.TopicInfo;
/**
* Administration plugin for Tibco EMS.
*
* @author colincrist@hermesjms.com last changed by: $Author: colincrist $
* @version $Id: TibcoEMSAdmin.java,v 1.10 2006/02/08 09:17:08 colincrist Exp $
*/
public class TibcoEMSAdmin extends HermesAdminSupport implements HermesAdmin
{
private static final Logger log = Logger.getLogger(TibcoEMSAdmin.class);
private TibcoEMSAdminFactory factory;
private TibjmsAdmin admin;
/**
*
*/
public TibcoEMSAdmin(Hermes hermes, TibcoEMSAdminFactory factory)
{
super(hermes);
this.factory = factory;
}
private synchronized TibjmsAdmin getAdmin() throws JMSException
{
if (admin == null)
{
admin = factory.createAdmin(getHermes().getConnectionFactory());
}
return admin;
}
public synchronized void close() throws JMSException
{
try
{
if (admin != null)
{
admin.close();
admin = null;
}
}
catch (TibjmsAdminException e)
{
throw new HermesException(e);
}
}
public int getDepth(final DestinationConfig destination) throws JMSException
{
if (destination.isDurable())
{
try
{
DurableInfo info = getAdmin().getDurable(destination.getClientID(), getHermes().getConnection().getClientID());
if (info != null)
{
return (int) info.getPendingMessageCount();
}
else
{
throw new HermesException("No durable information availble for clientID=" + getHermes().getConnection().getClientID() + ", durableName="
+ destination.getClientID());
}
}
catch (TibjmsAdminException ex)
{
throw new HermesException(ex);
}
}
else
{
DestinationInfo info = getDestinationInfo(destination);
if (info != null)
{
return (int) info.getPendingMessageCount();
}
else
{
return 0;
}
}
}
public Map getStatistics(final DestinationConfig destination) throws JMSException
{
try
{
final DestinationInfo info = getDestinationInfo(destination);
final TreeMap rval = new TreeMap();
rval.putAll(PropertyUtils.describe(info));
rval.remove("inboundStatistics");
rval.remove("outboundStatistics");
rval.put("inboundByteRate", new Long(info.getInboundStatistics().getByteRate()));
rval.put("inboundMessageRate", new Long(info.getInboundStatistics().getMessageRate()));
rval.put("inboundTotalBytes", new Long(info.getInboundStatistics().getTotalBytes()));
rval.put("inboundTotalMessages", new Long(info.getInboundStatistics().getTotalMessages()));
rval.put("outboundByteRate", new Long(info.getOutboundStatistics().getByteRate()));
rval.put("outboundMessageRate", new Long(info.getOutboundStatistics().getMessageRate()));
rval.put("outboundTotalBytes", new Long(info.getOutboundStatistics().getTotalBytes()));
rval.put("outboundTotalMessages", new Long(info.getOutboundStatistics().getTotalMessages()));
return rval;
}
catch (IllegalAccessException e)
{
throw new HermesException(e);
}
catch (InvocationTargetException e)
{
throw new HermesException(e);
}
catch (NoSuchMethodException e)
{
throw new HermesException(e);
}
}
private DestinationInfo getDestinationInfo(final DestinationConfig dConfig) throws JMSException
{
try
{
if (dConfig.getDomain() == Domain.QUEUE.getId())
{
return getAdmin().getQueue(getRealDestinationName(dConfig));
}
else
{
return getAdmin().getTopic(getRealDestinationName(dConfig));
}
}
catch (TibjmsAdminException e)
{
throw new HermesException(e);
}
}
private DestinationInfo getDestinationInfo(final Destination destination) throws JMSException
{
final String name = getHermes().getDestinationName(destination);
try
{
if (destination instanceof Queue)
{
return getAdmin().getQueue(name);
}
else
{
return getAdmin().getTopic(name);
}
}
catch (TibjmsAdminException e)
{
throw new HermesException(e);
}
}
public int truncate(final DestinationConfig dConfig) throws JMSException
{
try
{
final int rval = getDepth(dConfig);
if (dConfig.getDomain() == Domain.QUEUE.getId())
{
getAdmin().purgeQueue(dConfig.getName());
}
else
{
if (dConfig.isDurable())
{
getAdmin().purgeDurable(dConfig.getClientID(), getHermes().getConnection().getClientID());
}
else
{
getAdmin().purgeTopic(dConfig.getName());
}
}
return rval;
}
catch (TibjmsAdminException e)
{
throw new HermesException(e);
}
}
public Collection discoverDestinationConfigs() throws JMSException
{
/*
* As Tibco do not implement the browsing of their JNDI contexts, when the
* connection factory is JNDI we use their admin API instead to get the
* jndi names of queues/topics. If there is no JNDI name then it's not
* bound anywhere.
*/
try
{
final Collection<DestinationConfig> rval = new ArrayList<DestinationConfig>();
boolean both = (getHermes().getConnectionFactory() instanceof TopicConnectionFactory) && (getHermes().getConnectionFactory() instanceof TopicConnectionFactory) ;
if (!(getHermes().getConnectionFactory() instanceof TopicConnectionFactory) || both)
{
final QueueInfo[] qinfos = getAdmin().getQueues();
for (int i = 0; i < qinfos.length; i++)
{
if (getHermes().getConnectionFactory() instanceof JNDIConnectionFactory)
{
if (qinfos[i].getJNDINames() != null)
{
for (int j = 0; j < qinfos[i].getJNDINames().length; j++)
{
final DestinationConfig dConfig = HermesBrowser.getConfigDAO().createDestinationConfig();
dConfig.setName(qinfos[i].getJNDINames()[j]);
dConfig.setDomain(Domain.QUEUE.getId());
rval.add(dConfig);
}
}
}
else
{
final DestinationConfig dConfig = HermesBrowser.getConfigDAO().createDestinationConfig();
dConfig.setName(qinfos[i].getName());
dConfig.setDomain(Domain.QUEUE.getId());
rval.add(dConfig);
}
}
}
if (!(getHermes().getConnectionFactory() instanceof QueueConnectionFactory) || both)
{
final TopicInfo[] tinfos = getAdmin().getTopics();
for (int i = 0; i < tinfos.length; i++)
{
if (getHermes().getConnectionFactory() instanceof JNDIConnectionFactory)
{
if (tinfos[i].getJNDINames() != null)
{
for (int j = 0; j < tinfos[i].getJNDINames().length; j++)
{
final DestinationConfig dConfig = HermesBrowser.getConfigDAO().createDestinationConfig();
dConfig.setName(tinfos[i].getJNDINames()[j]);
dConfig.setDomain(Domain.TOPIC.getId());
rval.add(dConfig);
rval.addAll(discoverDurableSubscriptions(tinfos[i].getName(), tinfos[i].getJNDINames()[j]));
}
}
}
else
{
final DestinationConfig dConfig = HermesBrowser.getConfigDAO().createDestinationConfig();
dConfig.setName(tinfos[i].getName());
dConfig.setDomain(Domain.TOPIC.getId());
rval.add(dConfig);
rval.addAll(discoverDurableSubscriptions(tinfos[i].getName(), null));
}
}
}
return rval;
}
catch (TibjmsAdminException e)
{
log.error(e.getMessage(), e);
throw new HermesException(e);
}
}
@Override
protected Collection<DestinationConfig> discoverDurableSubscriptions(String topicName, String jndiName) throws JMSException
{
try
{
final Collection<DestinationConfig> rval = new ArrayList<DestinationConfig>();
final DurableInfo[] dInfos = getAdmin().getDurables(topicName);
for (int j = 0; j < dInfos.length; j++)
{
DurableInfo dInfo = dInfos[j];
final DestinationConfig dConfig = HermesBrowser.getConfigDAO().createDestinationConfig();
dConfig.setDurable(true);
dConfig.setName(jndiName == null ? dInfo.getTopicName() : jndiName);
dConfig.setClientID(dInfo.getDurableName());
dConfig.setSelector(dInfo.getSelector());
dConfig.setDomain(Domain.TOPIC.getId());
rval.add(dConfig);
}
return rval;
}
catch (TibjmsAdminException e)
{
log.error(e.getMessage(), e);
throw new HermesException(e);
}
}
}