package cn.mutils.core.task;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import cn.mutils.core.IClearable;
import cn.mutils.core.task.RepeatTask.IRepeatTaskListener;
import cn.mutils.core.text.StringUtil;
@SuppressWarnings("SimplifiableIfStatement")
public class RepeatTaskManager implements IClearable, IRepeatTaskListener {
protected Map<String, List<RepeatTask>> mMap;
public void add(RepeatTask task) {
synchronized (this) {
if (mMap == null) {
mMap = new ConcurrentHashMap<String, List<RepeatTask>>();
}
}
String name = task.getName();
if (StringUtil.isEmpty(name)) {
throw new UnsupportedOperationException();
}
List<RepeatTask> tasks = mMap.get(name);
synchronized (this) {
if (tasks == null) {
tasks = new CopyOnWriteArrayList<RepeatTask>();
mMap.put(name, tasks);
}
}
tasks.add(0, task);
startOneItem(tasks);
}
public void clear() {
if (mMap == null) {
return;
}
for (Map.Entry<String, List<RepeatTask>> entry : mMap.entrySet()) {
List<RepeatTask> tasks = entry.getValue();
for (RepeatTask task : tasks) {
task.removeListener(this);
task.stop();
}
tasks.clear();
}
mMap.clear();
}
protected void startOneItem(List<RepeatTask> tasks) {
if (tasks == null || tasks.size() == 0) {
return;
}
if (tasks.size() == 1) {
RepeatTask task = tasks.get(0);
if (!task.isRunning()) {
task.addListener(this);
task.start();
}
} else {
boolean isRunning = false;
for (RepeatTask task : tasks) {
if (task.isRunning()) {
isRunning = true;
break;
}
}
if (!isRunning) {
RepeatTask task = tasks.get(0);
tasks.clear();
tasks.add(task);
task.addListener(this);
task.start();
}
}
}
@Override
public void onStart(RepeatTask task) {
}
@Override
public void onStop(RepeatTask task) {
if (mMap == null) {
return;
}
List<RepeatTask> tasks = mMap.get(task.getName());
if (tasks == null) {
return;
}
tasks.remove(task);
startOneItem(tasks);
}
@Override
public boolean onPreRepeat(RepeatTask task) {
if (mMap == null) {
return false;
}
List<RepeatTask> tasks = mMap.get(task.getName());
if (tasks == null) {
return false;
}
return tasks.indexOf(task) != 0;
}
@Override
public void onRepeat(RepeatTask task) {
}
}