package wowodc.background.components;
import com.webobjects.appserver.WOActionResults;
import com.webobjects.appserver.WOContext;
import com.webobjects.foundation.NSArray;
import er.extensions.components.ERXStatelessComponent;
import er.extensions.concurrency.ERXFutureTask;
import er.extensions.concurrency.ERXTaskInfo;
import er.extensions.concurrency.ERXTaskThread;
import er.extensions.concurrency.IERXPercentComplete;
import er.extensions.concurrency.IERXStoppable;
import er.extensions.foundation.IERXStatus;
/**
* This stateless component is regenerated on each refresh with fresh statistics.
*
* @author kieran
*/
public class TaskThreadMonitor extends ERXStatelessComponent {
public TaskThreadMonitor(WOContext context) {
super(context);
}
private NSArray<ERXTaskInfo> _tasks;
/** @return the current tasks */
public NSArray<ERXTaskInfo> tasks() {
if ( _tasks == null ) {
// Grab all tasks that are instances of ERXTaskThread
_tasks = ERXTaskThread.taskInfos();
}
return _tasks;
}
private ERXTaskInfo _loopTaskItem;
/** @return the loop task item */
public ERXTaskInfo loopTaskItem() {
return _loopTaskItem;
}
/** @param loopTaskItem the loop task item */
public void setLoopTaskItem(ERXTaskInfo loopTaskItem){
_loopTaskItem = loopTaskItem;
}
public Double taskPercentageComplete() {
Double result = null;
if (loopTaskItem().task() != null && loopTaskItem().task() instanceof IERXPercentComplete) {
result = ((IERXPercentComplete) loopTaskItem().task()).percentComplete();
if (result != null) {
result = result * 100.0;
} //~ if (result != null)
} //~ if (loopTaskItem() != null && loopTaskItem() instanceof IERXPercentComplete)
return result;
}
public String taskStatus() {
String result = null;
if (loopTaskItem().task() instanceof IERXStatus) {
result = ((IERXStatus) loopTaskItem().task()).status();
} //~ if (loopTaskItem() instanceof IERXStatus)
return result;
}
public String taskDescription() {
return loopTaskItem().task().toString();
}
@Override
public void reset() {
super.reset();
_loopTaskItem = null;
_tasks = null;
}
public boolean showCancel() {
boolean show = false;
ERXTaskInfo taskInfo = loopTaskItem();
Object task = taskInfo.task();
if (task instanceof ERXFutureTask) {
show = ((ERXFutureTask)task).isStoppable();
} else {
show = task instanceof IERXStoppable;
}
return show;
}
public WOActionResults stopTask() {
IERXStoppable task = loopStopTask();
if (task != null) {
task.stop();
} //~ if (task != null)
return null;
}
/**
* @return the current task if it implements {@link IERXStoppable}, otherwise returns null.
*/
private IERXStoppable loopStopTask() {
IERXStoppable iERXStop = null;
ERXTaskInfo info = loopTaskItem();
Object task = info.task();
if (task instanceof ERXFutureTask) {
task = ((ERXFutureTask)task).task();
}
if (task instanceof IERXStoppable) {
iERXStop = (IERXStoppable) task;
}
return iERXStop;
}
}