package org.jboss.mq.server;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import org.jboss.mq.MessageStatistics;
public class MessageCounter
{
String destName;
String destSubscription;
boolean destTopic;
boolean destDurable;
BasicQueue destQueue;
int countTotal;
int countTotalLast;
int depthLast;
long timeLastUpdate;
int dayCounterMax;
ArrayList dayCounter;
public static MessageStatistics[] getMessageStatistics(MessageCounter[] counter) throws Exception
{
MessageStatistics[] stats = new MessageStatistics[counter.length];
for (int i = 0; i < counter.length; ++i)
{
stats[i] = new MessageStatistics();
stats[i].setName(counter[i].getDestinationName());
stats[i].setSubscriptionID(counter[i].getDestinationSubscription());
stats[i].setTopic(counter[i].getDestinationTopic());
stats[i].setDurable(counter[i].getDestinationDurable());
stats[i].setCount(counter[i].getCount());
stats[i].setCountDelta(counter[i].getCountDelta());
stats[i].setDepth(counter[i].getDepth());
stats[i].setDepthDelta(counter[i].getDepthDelta());
stats[i].setTimeLastUpdate(counter[i].getLastUpdate());
}
return stats;
}
public MessageCounter(
String name,
String subscription,
BasicQueue queue,
boolean topic,
boolean durable,
int daycountmax)
{
destName = name;
destSubscription = subscription;
destTopic = topic;
destDurable = durable;
destQueue = queue;
resetCounter();
dayCounter = new ArrayList();
setHistoryLimit(daycountmax);
}
public String toString()
{
return getCounterAsString();
}
public void incrementCounter()
{
countTotal++;
timeLastUpdate = System.currentTimeMillis();
updateHistory(true);
}
public String getDestinationName()
{
return destName;
}
public String getDestinationSubscription()
{
return destSubscription;
}
public boolean getDestinationTopic()
{
return destTopic;
}
public boolean getDestinationDurable()
{
return destDurable;
}
public int getCount()
{
return countTotal;
}
public int getCountDelta()
{
int delta = countTotal - countTotalLast;
countTotalLast = countTotal;
return delta;
}
public int getDepth()
{
return destQueue.getQueueDepth();
}
public int getDepthDelta()
{
int current = destQueue.getQueueDepth();
int delta = current - depthLast;
depthLast = current;
return delta;
}
public long getLastUpdate()
{
return timeLastUpdate;
}
public void resetCounter()
{
countTotal = 0;
countTotalLast = 0;
depthLast = 0;
timeLastUpdate = 0;
}
public String getCounterAsString()
{
String ret;
if (destTopic)
ret = "Topic,";
else
ret = "Queue,";
ret += destName + ",";
if (destSubscription != null)
ret += destSubscription + ",";
else
ret += "-,";
if (destTopic)
{
if (destDurable)
ret += "true,";
else
ret += "false,";
}
else
{
ret += "-,";
}
ret += getCount() + "," + getCountDelta() + "," + getDepth() + "," + getDepthDelta() + ",";
if (timeLastUpdate > 0)
{
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM);
ret += dateFormat.format(new Date(timeLastUpdate));
}
else
{
ret += "-";
}
return ret;
}
public int getHistoryLimit()
{
return dayCounterMax;
}
public void setHistoryLimit(int daycountmax)
{
boolean bInitialize = false;
dayCounterMax = daycountmax;
synchronized (dayCounter)
{
if (dayCounterMax > 0)
{
int delta = dayCounter.size() - dayCounterMax;
for (int i = 0; i < delta; i++)
{
dayCounter.remove(0);
}
bInitialize = dayCounter.isEmpty();
}
else if (dayCounterMax == 0)
{
dayCounter.clear();
}
else
{
bInitialize = dayCounter.isEmpty();
}
if (bInitialize)
{
dayCounter.add(new DayCounter(new GregorianCalendar(), true));
}
}
}
private void updateHistory(boolean incrementCounter)
{
if (dayCounter.isEmpty())
{
return;
}
synchronized (dayCounter)
{
DayCounter counterLast = (DayCounter) dayCounter.get(dayCounter.size() - 1);
GregorianCalendar calNow = new GregorianCalendar();
GregorianCalendar calLast = counterLast.getDate();
calNow.clear(Calendar.HOUR);
calNow.clear(Calendar.HOUR_OF_DAY);
calNow.clear(Calendar.MINUTE);
calNow.clear(Calendar.SECOND);
calNow.clear(Calendar.MILLISECOND);
calLast.clear(Calendar.HOUR);
calLast.clear(Calendar.HOUR_OF_DAY);
calLast.clear(Calendar.MINUTE);
calLast.clear(Calendar.SECOND);
calLast.clear(Calendar.MILLISECOND);
long millisPerDay = 86400000; long millisDelta = calNow.getTime().getTime() - calLast.getTime().getTime();
int dayDelta = (int) (millisDelta / millisPerDay);
if (dayDelta > 0)
{
counterLast.finalizeDayCounter();
DayCounter counterNew;
for (int i = 1; i < dayDelta; i++)
{
calLast.add(Calendar.DAY_OF_YEAR, 1);
counterNew = new DayCounter(calLast, false);
counterNew.finalizeDayCounter();
dayCounter.add(counterNew);
}
counterNew = new DayCounter(calNow, false);
dayCounter.add(counterNew);
setHistoryLimit(dayCounterMax);
}
counterLast = (DayCounter) dayCounter.get(dayCounter.size() - 1);
counterLast.updateDayCounter(incrementCounter);
}
}
public void resetHistory()
{
int max = dayCounterMax;
setHistoryLimit(0);
setHistoryLimit(max);
}
public String getHistoryAsString()
{
String ret = "";
updateHistory(false);
synchronized (dayCounter)
{
ret += dayCounter.size() + "\n";
for (int i = 0; i < dayCounter.size(); i++)
{
DayCounter counter = (DayCounter) dayCounter.get(i);
ret += counter.getDayCounterAsString() + "\n";
}
}
return ret;
}
static class DayCounter
{
static final int HOURS = 24;
GregorianCalendar date = null;
int[] counters = new int[HOURS];
DayCounter(GregorianCalendar date, boolean isStartDay)
{
this.date = (GregorianCalendar) date.clone();
int hour = date.get(Calendar.HOUR_OF_DAY);
for (int i = 0; i < HOURS; i++)
{
if (i < hour)
{
if (isStartDay)
counters[i] = -1;
else
counters[i] = 0;
}
else
{
counters[i] = -1;
}
}
counters[hour] = 0;
}
GregorianCalendar getDate()
{
return (GregorianCalendar) date.clone();
}
void updateDayCounter(boolean incrementCounter)
{
GregorianCalendar cal = new GregorianCalendar();
int currentIndex = cal.get(Calendar.HOUR_OF_DAY);
boolean bUpdate = false;
for (int i = 0; i <= currentIndex; i++)
{
if (counters[i] > -1)
{
bUpdate = true;
}
if (bUpdate == true)
{
if (counters[i] == -1)
counters[i] = 0;
}
}
if (incrementCounter)
{
counters[currentIndex]++;
}
}
void finalizeDayCounter()
{
boolean bFinalize = false;
for (int i = 0; i < HOURS; i++)
{
if (counters[i] > -1)
{
bFinalize = true;
}
if (bFinalize)
{
if (counters[i] == -1)
counters[i] = 0;
}
}
}
String getDayCounterAsString()
{
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT);
String strData = dateFormat.format(date.getTime());
for (int i = 0; i < HOURS; i++)
{
strData += "," + counters[i];
}
return strData;
}
}
}