package com.openedit.util;
import java.util.Timer;
import java.util.TimerTask;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class TaskRunner
{
protected Object fieldNotify = new Object();
public Object getNotify()
{
return fieldNotify;
}
protected Timer fieldQueue;
private static final Log log = LogFactory.getLog(TaskRunner.class);
protected int fieldCount;
protected boolean fieldHasHitMax;
protected int fieldMaxQueueSize = 200;
public Timer getQueue()
{
if( fieldQueue == null)
{
fieldQueue = new Timer(true);
}
return fieldQueue;
}
public void setQueue(Timer inQueue)
{
fieldQueue = inQueue;
}
protected void reduce()
{
fieldCount--;
if( fieldHasHitMax && fieldCount == 0)
{
log.info("Image Queue is now empty");
fieldHasHitMax = false;
}
synchronized (getNotify())
{
getNotify().notifyAll();
}
}
protected void increase()
{
fieldCount++;
}
public int getCount()
{
return fieldCount;
}
public void add(final Runnable inTask)
{
if(( fieldCount > getMaxQueueSize())) //We dont want this queue to get too big in case they cancel
{
fieldHasHitMax = true;
inTask.run();
return;
}
increase();
log.debug("Adding " + inTask);
TimerTask task = new TimerTask()
{
public void run()
{
try
{
log.debug("Running " + inTask);
inTask.run();
}
catch ( Throwable ex)
{
log.error("task failed " + ex.getMessage() + " on " + inTask );
}
reduce();
}
};
getQueue().schedule(task, 0);
}
public int getMaxQueueSize()
{
return fieldMaxQueueSize;
}
public void setMaxQueueSize(int inMaxQueueSize)
{
fieldMaxQueueSize = inMaxQueueSize;
}
}