package org.jboss.mq.server.jmx;
import java.util.StringTokenizer;
import javax.naming.InitialContext;
import javax.management.MBeanRegistration;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.MalformedObjectNameException;
import javax.management.InvalidAttributeValueException;
import org.jboss.system.ServiceMBeanSupport;
import org.jboss.naming.Util;
import org.jboss.logging.Logger;
import org.jboss.mq.MessageStatistics;
import org.jboss.mq.SpyDestination;
import org.jboss.mq.server.BasicQueueParameters;
import org.jboss.mq.server.JMSDestinationManager;
import org.jboss.mq.server.MessageCounter;
import org.jboss.mq.server.Receivers;
import org.w3c.dom.Element;
abstract public class DestinationMBeanSupport extends ServiceMBeanSupport
implements DestinationMBean, MBeanRegistration
{
SpyDestination spyDest;
String destinationName;
String jndiName;
boolean jndiBound;
ObjectName jbossMQService;
Element securityConf;
BasicQueueParameters parameters = new BasicQueueParameters();
ObjectName securityManager;
public ObjectName getDestinationManager()
{
return jbossMQService;
}
public void setDestinationManager(ObjectName jbossMQService)
{
this.jbossMQService = jbossMQService;
}
protected SpyDestination getSpyDest()
{
return spyDest;
}
public void setSecurityConf(org.w3c.dom.Element securityConf) throws Exception
{
log.debug("Setting securityConf: " + securityConf);
this.securityConf = securityConf;
}
protected Element getSecurityConf()
{
return securityConf;
}
public void setSecurityManager(ObjectName securityManager)
{
this.securityManager = securityManager;
}
protected ObjectName getSecurityManager()
{
return securityManager;
}
public void createService() throws Exception
{
if (parameters.receiversImpl == null)
parameters.receiversImpl = (Class) server.getAttribute(jbossMQService, "ReceiversImpl");
}
public void startService() throws Exception
{
if (securityManager != null)
{
getServer().invoke(securityManager, "addDestination", new Object[]{spyDest.getName(), securityConf}, new String[]{"java.lang.String", "org.w3c.dom.Element"});
}
}
public void stopService() throws Exception
{
if (jndiBound)
{
InitialContext ctx = new InitialContext();
try
{
Util.unbind(ctx, jndiName);
}
finally
{
ctx.close();
}
jndiName = null;
jndiBound = false;
}
JMSDestinationManager jmsServer = (JMSDestinationManager) server.getAttribute(jbossMQService, "Interceptor");
if (jmsServer != null)
jmsServer.closeDestination(spyDest);
if (securityManager != null)
{
getServer().invoke(securityManager, "removeDestination", new Object[]{spyDest.getName()}, new String[]{"java.lang.String"});
}
}
protected ObjectName getObjectName(MBeanServer server, ObjectName name)
throws MalformedObjectNameException
{
destinationName = name.getKeyProperty("name");
if (destinationName == null || destinationName.length() == 0)
{
throw new MalformedObjectNameException("Property 'name' not provided");
}
log = Logger.getLogger(getClass().getName() + "." + destinationName);
return name;
}
public synchronized void setJNDIName(String name) throws Exception
{
if (spyDest == null)
{ jndiName = name;
return;
}
if (name == null)
{
throw new InvalidAttributeValueException("Destination JNDI names can not be null");
}
InitialContext ic = new InitialContext();
try
{
if (jndiName != null && jndiBound)
{
Util.unbind(ic, jndiName); jndiName = null;
jndiBound = false;
}
Util.rebind(ic, name, spyDest);
jndiName = name;
jndiBound = true;
}
finally
{
ic.close();
}
log.info("Bound to JNDI name: " + jndiName);
}
public String getJNDIName()
{
return jndiName;
}
abstract public MessageCounter[] getMessageCounter();
abstract public MessageStatistics[] getMessageStatistics() throws Exception;
public String listMessageCounter()
{
MessageCounter[] counter = getMessageCounter();
String ret = "<table width=\"100%\" border=\"1\" cellpadding=\"1\" cellspacing=\"1\">" +
"<tr>" +
"<th>Type</th>" +
"<th>Name</th>" +
"<th>Subscription</th>" +
"<th>Durable</th>" +
"<th>Count</th>" +
"<th>CountDelta</th>" +
"<th>Depth</th>" +
"<th>DepthDelta</th>" +
"<th>Last Add</th>" +
"</tr>";
for( int i=0; i<counter.length; i++ )
{
String data = counter[i].getCounterAsString();
StringTokenizer token = new StringTokenizer( data, ",");
String value;
ret += "<tr bgcolor=\"#" + ( (i%2)==0 ? "FFFFFF" : "F0F0F0") + "\">";
ret += "<td>" + token.nextToken() + "</td>"; ret += "<td>" + token.nextToken() + "</td>"; ret += "<td>" + token.nextToken() + "</td>"; ret += "<td>" + token.nextToken() + "</td>";
ret += "<td>" + token.nextToken() + "</td>";
value = token.nextToken();
if( value.equalsIgnoreCase("0") )
value = "-";
ret += "<td>" + value + "</td>";
ret += "<td>" + token.nextToken() + "</td>";
value = token.nextToken();
if( value.equalsIgnoreCase("0") )
value = "-";
ret += "<td>" + value + "</td>";
ret += "<td>" + token.nextToken() + "</td>";
ret += "</tr>";
}
ret += "</table>";
return ret;
}
public void resetMessageCounter()
{
MessageCounter[] counter = getMessageCounter();
for( int i=0; i<counter.length; i++ )
{
counter[i].resetCounter();
}
}
public String listMessageCounterHistory()
{
MessageCounter[] counter = getMessageCounter();
String ret = "";
for( int i=0; i<counter.length; i++ )
{
ret += ( counter[i].getDestinationTopic() ? "Topic '" : "Queue '" );
ret += counter[i].getDestinationName() + "'";
if( counter[i].getDestinationSubscription() != null )
ret += "Subscription '" + counter[i].getDestinationSubscription() + "'";
ret += "<table width=\"100%\" border=\"1\" cellpadding=\"1\" cellspacing=\"1\">" +
"<tr>" +
"<th>Date</th>";
for( int j = 0; j < 24; j++ )
ret += "<th width=\"4%\">" + j + "</th>";
ret += "<th>Total</th></tr>";
StringTokenizer tokens = new StringTokenizer( counter[i].getHistoryAsString(), ",\n");
int days = Integer.parseInt( tokens.nextToken() );
for( int j=0; j<days; j++ )
{
ret += "<tr bgcolor=\"#" + ((j%2)==0 ? "FFFFFF" : "F0F0F0") + "\">";
ret += "<td>" + tokens.nextToken() + "</td>";
int total = 0;
for( int k=0; k<24; k++ )
{
int value = Integer.parseInt( tokens.nextToken().trim() );
if( value == -1 )
{
ret += "<td></td>";
}
else
{
ret += "<td>" + value + "</td>";
total += value;
}
}
ret += "<td>" + total + "</td></tr>";
}
ret += "</table><br><br>";
}
return ret;
}
public void resetMessageCounterHistory()
{
MessageCounter[] counter = getMessageCounter();
for( int i=0; i<counter.length; i++ )
{
counter[i].resetHistory();
}
}
public void setMessageCounterHistoryDayLimit( int days )
{
if( days < -1 )
days = -1;
if (getState() != STARTED)
{
parameters.messageCounterHistoryDayLimit = days;
return;
}
MessageCounter[] counter = getMessageCounter();
for( int i=0; i<counter.length; i++ )
{
counter[i].setHistoryLimit( days );
}
}
public int getMessageCounterHistoryDayLimit()
{
if (getState() != STARTED)
return parameters.messageCounterHistoryDayLimit;
MessageCounter[] counter = getMessageCounter();
int days = 0;
if( counter.length > 0 )
{
days = counter[0].getHistoryLimit();
}
return days;
}
public int getMaxDepth()
{
return parameters.maxDepth;
}
public void setMaxDepth(int depth)
{
parameters.maxDepth = depth;
}
public boolean getInMemory()
{
return parameters.inMemory;
}
public void setInMemory(boolean mode)
{
parameters.inMemory = mode;
}
public int getRedeliveryLimit()
{
return parameters.redeliveryLimit;
}
public void setRedeliveryLimit(int limit)
{
parameters.redeliveryLimit = limit;
}
public long getRedeliveryDelay()
{
return parameters.redeliveryDelay;
}
public void setRedeliveryDelay(long rDelay)
{
parameters.redeliveryDelay = rDelay;
}
public Class getReceiversImpl()
{
return parameters.receiversImpl;
}
public void setReceiversImpl(Class clazz)
{
if (clazz != null && Receivers.class.isAssignableFrom(clazz) == false)
throw new IllegalArgumentException("Class " + clazz.getName() + " is not a Receivers implementation");
parameters.receiversImpl = clazz;
}
}