package org.oddjob.monitor.action; import java.util.Properties; import javax.swing.KeyStroke; import org.apache.log4j.Logger; import org.oddjob.Stateful; import org.oddjob.input.InputRequest; import org.oddjob.jobs.tasks.BasicTask; import org.oddjob.jobs.tasks.TaskException; import org.oddjob.jobs.tasks.TaskExecutor; import org.oddjob.monitor.Standards; import org.oddjob.monitor.context.ExplorerContext; import org.oddjob.monitor.model.JobAction; import org.oddjob.state.StateConditions; import org.oddjob.state.StateEvent; import org.oddjob.state.StateListener; import org.oddjob.swing.SwingInputHandler; import org.oddjob.util.ThreadManager; /** * An action that calls a parameterised execution. * * @author Rob Gordon */ public class TaskAction extends JobAction implements StateListener { private static final Logger logger = Logger.getLogger(TaskAction.class); /** The job */ private Object job = null; /** The ThreadManager that will run the job. */ private ThreadManager threadManager; /* * (non-Javadoc) * @see org.oddjob.monitor.model.JobOption#getName() */ public String getName() { return "Execute"; } public String getGroup() { return JOB_GROUP; } public Integer getMnemonicKey() { return Standards.EXECUTE_MNEMONIC_KEY; } public KeyStroke getAcceleratorKey() { return Standards.EXECUTE_ACCELERATOR_KEY; } @Override protected void doPrepare(ExplorerContext explorerContext) { if (isPrepared()) { return; } Object component = explorerContext.getThisComponent(); if (component instanceof TaskExecutor) { this.job = component; this.threadManager = explorerContext.getThreadManager(); if (job instanceof Stateful) { ((Stateful) job).addStateListener(this); } else { setEnabled(true); } setVisible(true); } else { this.job = null; setEnabled(false); setVisible(false); } } @Override protected void doFree(ExplorerContext explorerContext) { if (job != null && job instanceof Stateful) { ((Stateful) job).removeStateListener(this); } job = null; } @Override protected void doAction() throws Exception { final TaskExecutor execution = (TaskExecutor) job; InputRequest[] requestsArray = execution.getParameterInfo(); final Properties props = new SwingInputHandler(null).handleInput(requestsArray); if (props != null) { threadManager.run(new Runnable() { public void run() { try { execution.execute(new BasicTask(props)); } catch (TaskException e) { logger.warn(e); } } }, "Executing " + job); } } /* * (non-Javadoc) * @see org.oddjob.state.JobStateListener#jobStateChange(org.oddjob.state.JobStateEvent) */ public void jobStateChange(StateEvent event) { if (StateConditions.STARTED.test(event.getState())) { setEnabled(true); } else { setEnabled(false); } } }