package com.laytonsmith.core.functions; import com.laytonsmith.PureUtilities.Common.StringUtils; import com.laytonsmith.PureUtilities.Version; import com.laytonsmith.annotations.api; import com.laytonsmith.annotations.hide; import com.laytonsmith.core.CHVersion; import com.laytonsmith.core.Static; import com.laytonsmith.core.constructs.CArray; import com.laytonsmith.core.constructs.CInt; import com.laytonsmith.core.constructs.CVoid; import com.laytonsmith.core.constructs.Construct; import com.laytonsmith.core.constructs.Target; import com.laytonsmith.core.environments.Environment; import com.laytonsmith.core.environments.GlobalEnv; import com.laytonsmith.core.exceptions.CRE.CRECastException; import com.laytonsmith.core.exceptions.CRE.CREThrowable; import com.laytonsmith.core.exceptions.ConfigRuntimeException; import com.laytonsmith.core.taskmanager.CoreTaskType; import com.laytonsmith.core.taskmanager.TaskHandler; import com.laytonsmith.core.taskmanager.TaskManager; import com.laytonsmith.core.taskmanager.TaskState; /** * */ public class TaskHandling { public static String docs(){ return "This class is used to manage various tasks throughout MethodScript. It is a task manager of sorts."; } @api @hide("Only timeouts are added currently, making it mostly useless") public static class tm_get_tasks extends AbstractFunction { @Override public Class<? extends CREThrowable>[] thrown() { return new Class[]{}; } @Override public boolean isRestricted() { return true; } @Override public Boolean runAsync() { return null; } @Override public Construct exec(Target t, Environment environment, Construct... args) throws ConfigRuntimeException { TaskManager tm = environment.getEnv(GlobalEnv.class).GetTaskManager(); CArray ret = new CArray(t); for(TaskHandler task : tm.getTasks()){ CArray tt = new CArray(t); tt.set("id", new CInt(task.getID(), t), t); tt.set("type", task.getType().name()); tt.set("state", task.getState().name()); tt.set("target", task.getDefinedAt().toString()); CArray properties = CArray.GetAssociativeArray(t); for(String prop : task.getProperties()){ properties.set(prop, task.getPropertyData().get(prop).toString()); } tt.set("properties", properties, t); ret.push(tt, t); } return ret; } @Override public String getName() { return "tm_get_tasks"; } @Override public Integer[] numArgs() { return new Integer[]{0}; } @Override public String docs() { return "array {} Returns an array of currently running tasks. ---- Each task will be an associative array with the" + " following properties:\n" + "{| width=\"100%\" cellspacing=\"1\" cellpadding=\"1\" border=\"1\" class=\"wikitable\"\n" + "|-\n" + "! scope=\"col\" | Key\n" + "! scope=\"col\" | Value\n" + "|-\n" + "| id\n" + "| The id of the currently running task. This is not a unique id necessarily, across all tasks, but will be unique" + " across all tasks of this task type.\n" + "|-\n" + "| type\n" + "| The task type. This plus the id are the unique identifiers for a task. Extensions may add new task types, but the" + " builtin tasks are: " + StringUtils.Join(CoreTaskType.values(), ", ", ", and ") + "\n" + "|-\n" + "| state\n" + "| The state of the task. Will be either " + StringUtils.Join(TaskState.values(), ", ", ", or ") + "\n" + "|-" + "| target\n" + "| Where the task was defined in code.\n" + "|-\n" + "| properties\n" + "| An array of additional properties provided by the particular task type. May be empty (but not null).\n" + "|}\n"; } @Override public Version since() { return CHVersion.V3_3_1; } } @api @hide("This doesn't appear to work yet. It will be added once it does.") public static class tm_kill_task extends AbstractFunction { @Override public Class<? extends CREThrowable>[] thrown() { return new Class[]{CRECastException.class}; } @Override public boolean isRestricted() { return true; } @Override public Boolean runAsync() { return null; } @Override public Construct exec(Target t, Environment environment, Construct... args) throws ConfigRuntimeException { String type = args[0].val(); int id = Static.getInt32(args[1], t); TaskManager tm = environment.getEnv(GlobalEnv.class).GetTaskManager(); tm.killTask(type, id); return CVoid.VOID; } @Override public String getName() { return "tm_kill_task"; } @Override public Integer[] numArgs() { return new Integer[]{2}; } @Override public String docs() { return "void {taskType, id} Attempts to kill the specified task. The taskType and id will be listed with the task in the task manager." + " If the task is already finished, doesn't exist, or already in the process of finishing, nothing happens."; } @Override public Version since() { return CHVersion.V3_3_1; } } }