package ilarkesto.ui.action;
import ilarkesto.concurrent.TaskManager;
import ilarkesto.core.logging.Log;
import ilarkesto.di.BeanProvider;
import ilarkesto.di.Context;
import ilarkesto.ui.AUi;
import java.util.HashMap;
import java.util.Map;
public final class ActionPerformer {
private static final Log LOG = Log.get(ActionPerformer.class);
private static Map<String, AAction> actions = new HashMap<String, AAction>();
/**
* Start or continue the given action.
*/
public AAction triggerAction(String actionId, AUi ui, BeanProvider userParameters) {
AAction action = actions.get(actionId);
if (action == null) {
try {
action = createAction(actionId);
} catch (ClassNotFoundException ex) {
return null;
}
if (action == null) return null;
startAction(action, ui, userParameters);
} else {
continueAction(action, ui, userParameters);
}
return action;
}
static void unregisterAction(String actionId) {
if (actions == null) return;
if (actionId == null) return;
actions.remove(actionId);
}
static void registerAction(AAction action) {
if (actions == null) return;
if (action == null) return;
actions.put(action.getActionId(), action);
}
public void performSubAction(AAction action, AAction waitingAction) {
action.setParentAction(waitingAction);
autowireAction(action, waitingAction.getUi(), null);
action.setUi(waitingAction.getUi());
action.run();
// action.setParentAction(waitingAction);
// startAction(action, waitingAction.getUi(), null);
// try {
// action.waitForFinish();
// } catch (InterruptedException ex) {
// throw new ActionAbortedException("InterruptedException");
// }
Throwable exception = action.getException();
if (exception != null) {
if (exception instanceof RuntimeException) throw (RuntimeException) exception;
throw new RuntimeException(exception);
}
}
private AAction createAction(String actionId) throws ClassNotFoundException {
Class<AAction> actionClass;
actionClass = getActionClass(actionId);
if (actionClass == null) return null;
try {
return actionClass.newInstance();
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
private void startAction(AAction action, AUi ui, BeanProvider userParameters) {
LOG.debug("Starting action:", action);
autowireAction(action, ui, userParameters);
action.setUi(ui);
taskManager.start(action);
}
private void continueAction(AAction action, AUi ui, BeanProvider userParameters) {
LOG.debug("Continuing action:", action);
autowireAction(action, ui, userParameters);
synchronized (action) {
action.notifyAll();
}
}
private void autowireAction(AAction action, AUi ui, BeanProvider userParameters) {
if (action == null) return;
if (userParameters != null) userParameters.autowire(action);
Context.get().autowire(action);
action.setUi(ui);
autowireAction(action.getParentAction(), ui, userParameters); // autowire parents recursively
}
private Class<AAction> getActionClass(String actionId) throws ClassNotFoundException {
return (Class<AAction>) Class.forName(actionId);
}
// --- dependencies ---
private TaskManager taskManager;
public void setTaskManager(TaskManager taskManager) {
this.taskManager = taskManager;
}
}