package me.escapeNT.pail.scheduler;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.logging.Level;
import me.escapeNT.pail.Util.Util;
import org.bukkit.Bukkit;
import org.bukkit.scheduler.BukkitScheduler;
/**
* Registers and executes all scheduled tasks.
* @author escapeNT
*/
public class Scheduler {
private static HashMap<ScheduledTask, Boolean> tasks = new HashMap<ScheduledTask, Boolean>();
private static HashMap<ScheduledTask, Integer> taskIDs = new HashMap<ScheduledTask, Integer>();
private static final BukkitScheduler bs = Bukkit.getServer().getScheduler();
private static final File file = new File(Util.getPlugin().getDataFolder(), "tasks.dat");
/**
* Registers a task to be executed.
* If the task has already been registered, the method simply returns.
* @param task The task to register.
*/
public static void registerTask(final ScheduledTask task) {
if(isTaskRegistered(task)) {
return;
}
tasks.put(task, Boolean.FALSE);
if(!task.isEnabled()) {
return;
}
int id;
if(task.isRepeating()) {
id = bs.scheduleAsyncRepeatingTask(Util.getPlugin(), new Runnable() {
public void run() {
task.execute();
tasks.put(task, Boolean.TRUE);
}
}, task.getInterval(), task.getInterval());
} else {
id = bs.scheduleAsyncDelayedTask(Util.getPlugin(), new Runnable() {
public void run() {
task.execute();
tasks.put(task, Boolean.TRUE);
}
}, task.getInterval());
}
taskIDs.put(task, id);
}
/**
* Determines if a task has already been registered with the scheduler.
* @param task The task to check.
* @return True if it has been registered, false otherwise.
*/
public static boolean isTaskRegistered(ScheduledTask task) {
return tasks.containsKey(task);
}
/**
* Gets the map of all currently registered tasks and whether they have been executed yet.
* @return The map of tasks to weather or not they have been executed at least once.
*/
public static HashMap<ScheduledTask, Boolean> getTasks() {
return tasks;
}
/**
* Saves the current list of tasks to file.
*/
public static void saveTasks() {
Util.getPlugin().getDataFolder().mkdir();
try {
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(tasks);
oos.close();
} catch (IOException ex) {
Util.log(Level.SEVERE, ex.toString());
}
}
/**
* Loads the saved list of tasks.
*/
public static void loadTasks() {
if(!file.exists()) {
saveTasks();
}
for(Integer i : taskIDs.values()) {
bs.cancelTask(i);
}
try {
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
tasks = (HashMap<ScheduledTask, Boolean>)ois.readObject();
ois.close();
} catch (Exception ex) {
Util.log(Level.SEVERE, ex.toString());
}
for(final ScheduledTask task : tasks.keySet()) {
if(!task.isEnabled()) {
continue;
}
int id;
if(task.isRepeating()) {
id = bs.scheduleAsyncRepeatingTask(Util.getPlugin(), new Runnable() {
public void run() {
task.execute();
tasks.put(task, Boolean.TRUE);
}
}, task.getInterval(), task.getInterval());
} else {
id = bs.scheduleAsyncDelayedTask(Util.getPlugin(), new Runnable() {
public void run() {
task.execute();
tasks.put(task, Boolean.TRUE);
}
}, task.getInterval());
}
taskIDs.put(task, id);
}
}
/**
* Gets a task matching a specified name, or null if it isn't found.
* @param name The name of the task.
* @return The task with the given name, or null if not found.
*/
public ScheduledTask getTask(String name) {
for(ScheduledTask t : tasks.keySet()) {
if(t.getName().equals(name)) {
return t;
}
}
return null;
}
/**
* Removes a task from the list.
* @param name
*/
public void removeTask(String name) {
for(ScheduledTask t : tasks.keySet()) {
if(t.getName().equals(name)) {
bs.cancelTask(taskIDs.get(t));
taskIDs.remove(t);
tasks.remove(t);
return;
}
}
}
}