From 2b27d3e03ddf053580882812c7735c3b0875e8f7 Mon Sep 17 00:00:00 2001 From: Hykilpikonna Date: Fri, 21 Feb 2020 14:39:39 -0500 Subject: [PATCH] [+] Create task manager --- .../java/org/hydev/hyritone/task/Task.java | 27 +++++ .../org/hydev/hyritone/task/TaskList.java | 28 ++++++ .../org/hydev/hyritone/task/TaskManager.java | 76 ++++++++++++++ .../org/hydev/hyritone/task/TaskPresets.java | 98 +++++++++++++++++++ .../org/hydev/hyritone/task/TaskRunState.java | 30 ++++++ 5 files changed, 259 insertions(+) create mode 100644 src/main/java/org/hydev/hyritone/task/Task.java create mode 100644 src/main/java/org/hydev/hyritone/task/TaskList.java create mode 100644 src/main/java/org/hydev/hyritone/task/TaskManager.java create mode 100644 src/main/java/org/hydev/hyritone/task/TaskPresets.java create mode 100644 src/main/java/org/hydev/hyritone/task/TaskRunState.java diff --git a/src/main/java/org/hydev/hyritone/task/Task.java b/src/main/java/org/hydev/hyritone/task/Task.java new file mode 100644 index 00000000..c19982a6 --- /dev/null +++ b/src/main/java/org/hydev/hyritone/task/Task.java @@ -0,0 +1,27 @@ +package org.hydev.hyritone.task; + +/** + * A task waiting to be executed. + *

+ * 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 + } +} diff --git a/src/main/java/org/hydev/hyritone/task/TaskList.java b/src/main/java/org/hydev/hyritone/task/TaskList.java new file mode 100644 index 00000000..e37122ef --- /dev/null +++ b/src/main/java/org/hydev/hyritone/task/TaskList.java @@ -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. + *

+ * 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 +{ + public final String name; + + public TaskList(String name, Task... tasks) + { + this(name); + Collections.addAll(this, tasks); + } +} diff --git a/src/main/java/org/hydev/hyritone/task/TaskManager.java b/src/main/java/org/hydev/hyritone/task/TaskManager.java new file mode 100644 index 00000000..99b18985 --- /dev/null +++ b/src/main/java/org/hydev/hyritone/task/TaskManager.java @@ -0,0 +1,76 @@ +package org.hydev.hyritone.task; + +import lombok.Getter; + +/** + * This class is used to manage tasks. + *

+ * 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 +} diff --git a/src/main/java/org/hydev/hyritone/task/TaskPresets.java b/src/main/java/org/hydev/hyritone/task/TaskPresets.java new file mode 100644 index 00000000..7c2c92d1 --- /dev/null +++ b/src/main/java/org/hydev/hyritone/task/TaskPresets.java @@ -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! + *

+ * 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 + public static Map 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(); + } + } +} diff --git a/src/main/java/org/hydev/hyritone/task/TaskRunState.java b/src/main/java/org/hydev/hyritone/task/TaskRunState.java new file mode 100644 index 00000000..390a2c0e --- /dev/null +++ b/src/main/java/org/hydev/hyritone/task/TaskRunState.java @@ -0,0 +1,30 @@ +package org.hydev.hyritone.task; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * TODO: Write a description for this class! + *

+ * 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(); + } +}