diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/TaskMaster.java b/projects/samskivert/src/java/com/samskivert/swing/util/TaskMaster.java index 0740cd80..4e7a3fba 100644 --- a/projects/samskivert/src/java/com/samskivert/swing/util/TaskMaster.java +++ b/projects/samskivert/src/java/com/samskivert/swing/util/TaskMaster.java @@ -1,8 +1,9 @@ // -// $Id: TaskMaster.java,v 1.3 2001/03/15 19:34:06 mdb Exp $ +// $Id: TaskMaster.java,v 1.4 2001/05/25 18:44:01 mdb Exp $ package com.samskivert.swing.util; +import java.lang.reflect.Method; import java.util.Hashtable; import javax.swing.SwingUtilities; @@ -39,6 +40,22 @@ public class TaskMaster runner.start(); } + /** + * Invokes the method with the specified name on the supplied source + * object as if it were a task. The observer is notified when the + * method has completed and returned its result or if it fails. The + * named method must have a signature the same as the + * invoke method of the Task interface. + * Aborting tasks run in this way is not supported. + */ + public static void invokeMethodTask (String name, Object source, + TaskObserver observer) + { + // create a method task instance to invoke the named method and + // then run that through the normal task invocation mechanism + invokeTask(name, new MethodTask(name, source), observer); + } + /** * Called by the task runner to remove itself from the task table when * the task has completed or been aborted. @@ -126,5 +143,30 @@ public class TaskMaster protected static final int FAILED = 2; } + protected static class MethodTask implements Task + { + public MethodTask (String name, Object source) + { + _name = name; + _source = source; + } + + public Object invoke () throws Exception + { + // look up the named method on the source object and invoke it + Method meth = _source.getClass().getMethod(_name, null); + return meth.invoke(_source, null); + } + + public boolean abort () + { + // aborting not supported + return false; + } + + protected String _name; + protected Object _source; + } + protected static Hashtable _tasks = new Hashtable(); }