[+] Create task manager
This commit is contained in:
@@ -0,0 +1,27 @@
|
|||||||
|
package org.hydev.hyritone.task;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A task waiting to be executed.
|
||||||
|
* <p>
|
||||||
|
* Class created by the HyDEV Team on 2020-01-24!
|
||||||
|
*
|
||||||
|
* @author HyDEV Team (https://github.com/HyDevelop)
|
||||||
|
* @author Hykilpikonna (https://github.com/hykilpikonna)
|
||||||
|
* @author Vanilla (https://github.com/VergeDX)
|
||||||
|
* @since 2020-01-24 18:06
|
||||||
|
*/
|
||||||
|
public interface Task
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Execute the task
|
||||||
|
*/
|
||||||
|
void execute(TaskRunState state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop the task
|
||||||
|
*/
|
||||||
|
default void stop()
|
||||||
|
{
|
||||||
|
// Default nothing to do
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package org.hydev.hyritone.task;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instances of this class contains lists of tasks to be executed in order.
|
||||||
|
* <p>
|
||||||
|
* Class created by the HyDEV Team on 2020-01-24!
|
||||||
|
*
|
||||||
|
* @author HyDEV Team (https://github.com/HyDevelop)
|
||||||
|
* @author Hykilpikonna (https://github.com/hykilpikonna)
|
||||||
|
* @author Vanilla (https://github.com/VergeDX)
|
||||||
|
* @since 2020-01-24 18:05
|
||||||
|
*/
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class TaskList extends ArrayList<Task>
|
||||||
|
{
|
||||||
|
public final String name;
|
||||||
|
|
||||||
|
public TaskList(String name, Task... tasks)
|
||||||
|
{
|
||||||
|
this(name);
|
||||||
|
Collections.addAll(this, tasks);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
package org.hydev.hyritone.task;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is used to manage tasks.
|
||||||
|
* <p>
|
||||||
|
* Class created by the HyDEV Team on 2020-01-24!
|
||||||
|
*
|
||||||
|
* @author HyDEV Team (https://github.com/HyDevelop)
|
||||||
|
* @author Hykilpikonna (https://github.com/hykilpikonna)
|
||||||
|
* @author Vanilla (https://github.com/VergeDX)
|
||||||
|
* @since 2020-01-24 19:03
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
public class TaskManager
|
||||||
|
{
|
||||||
|
private TaskRunState runState = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a task list
|
||||||
|
*
|
||||||
|
* @param list Task list
|
||||||
|
* @return Successfully started or not
|
||||||
|
*/
|
||||||
|
public boolean run(TaskList list)
|
||||||
|
{
|
||||||
|
// Check already started
|
||||||
|
if (runState != null) return false;
|
||||||
|
|
||||||
|
// Reset values
|
||||||
|
runState = new TaskRunState(null, list, 0);
|
||||||
|
|
||||||
|
// Create thread
|
||||||
|
runState.thread = new Thread(() ->
|
||||||
|
{
|
||||||
|
// Execute step by step
|
||||||
|
while (runState.step < list.size())
|
||||||
|
{
|
||||||
|
list.get(runState.step).execute(runState);
|
||||||
|
runState.step++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finished
|
||||||
|
stop();
|
||||||
|
}, "Hyritone Task");
|
||||||
|
|
||||||
|
// Start async
|
||||||
|
runState.thread.start();
|
||||||
|
|
||||||
|
// Success
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop the task list
|
||||||
|
*/
|
||||||
|
public void stop()
|
||||||
|
{
|
||||||
|
// Not started
|
||||||
|
if (runState == null) return;
|
||||||
|
|
||||||
|
// Stop thread
|
||||||
|
runState.thread.interrupt();
|
||||||
|
|
||||||
|
// Stop task
|
||||||
|
if (runState.getStep() < runState.getTaskList().size())
|
||||||
|
{
|
||||||
|
runState.getTaskList().get(runState.getStep()).stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
runState = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: pause
|
||||||
|
}
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
package org.hydev.hyritone.task;
|
||||||
|
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.hydev.hyritone.Main;
|
||||||
|
|
||||||
|
import javax.script.ScriptException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.UncheckedIOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.FileVisitOption;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static org.hydev.hyritone.utils.ScriptUtils.getEngine;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class contains preset tasks
|
||||||
|
* TODO: Make a UI for task list!
|
||||||
|
* <p>
|
||||||
|
* Class created by the HyDEV Team on 2020-01-24!
|
||||||
|
*
|
||||||
|
* @author HyDEV Team (https://github.com/HyDevelop)
|
||||||
|
* @author Hykilpikonna (https://github.com/hykilpikonna)
|
||||||
|
* @author Vanilla (https://github.com/VergeDX)
|
||||||
|
* @since 2020-01-24 18:23
|
||||||
|
*/
|
||||||
|
public class TaskPresets
|
||||||
|
{
|
||||||
|
// Map<name.toLowerCase(), taskList>
|
||||||
|
public static Map<String, TaskList> presets = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a task list
|
||||||
|
*
|
||||||
|
* @param list Task list
|
||||||
|
*/
|
||||||
|
public static void register(TaskList list)
|
||||||
|
{
|
||||||
|
presets.put(list.name.toLowerCase(), list);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get preset by name
|
||||||
|
*
|
||||||
|
* @param name Lowercase name
|
||||||
|
* @return Task list by name, null if not found
|
||||||
|
*/
|
||||||
|
public static TaskList getPreset(String name)
|
||||||
|
{
|
||||||
|
if (presets.containsKey(name.toLowerCase()))
|
||||||
|
{
|
||||||
|
return presets.get(name.toLowerCase());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load presets from file
|
||||||
|
*/
|
||||||
|
@SneakyThrows
|
||||||
|
public static void reloadPresets()
|
||||||
|
{
|
||||||
|
Path scriptDirPath = Main.taskPresetsDir.toPath();
|
||||||
|
|
||||||
|
presets.clear();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Files.walk(scriptDirPath, FileVisitOption.FOLLOW_LINKS)
|
||||||
|
.filter(Files::isRegularFile)
|
||||||
|
.forEach(path ->
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String script = FileUtils.readFileToString(path.toFile(), StandardCharsets.UTF_8);
|
||||||
|
TaskList list = (TaskList) getEngine().eval(script);
|
||||||
|
presets.put(list.name.toLowerCase(), list);
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
throw new UncheckedIOException(e);
|
||||||
|
}
|
||||||
|
catch (ScriptException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (IOException | UncheckedIOException e)
|
||||||
|
{
|
||||||
|
System.err.println("Error when loading hyritone scripts.");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package org.hydev.hyritone.task;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write a description for this class!
|
||||||
|
* <p>
|
||||||
|
* Class created by the HyDEV Team on 2020-01-24!
|
||||||
|
*
|
||||||
|
* @author HyDEV Team (https://github.com/HyDevelop)
|
||||||
|
* @author Hykilpikonna (https://github.com/hykilpikonna)
|
||||||
|
* @author Vanilla (https://github.com/VergeDX)
|
||||||
|
* @since 2020-01-24 20:38
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class TaskRunState
|
||||||
|
{
|
||||||
|
public Thread thread;
|
||||||
|
public TaskList taskList;
|
||||||
|
public int step;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
return "Task " + thread.getId() + " is executing step " + step + " of " + taskList.size() + " " +
|
||||||
|
"| Current Task: " + taskList.get(step).getClass().getSimpleName();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user