package net.techreadiness.ui.task;
import java.util.List;
import javax.inject.Inject;
import net.techreadiness.service.exception.ServiceException;
import net.techreadiness.ui.BaseAction;
import net.techreadiness.ui.util.Conversation;
import net.techreadiness.ui.util.ConversationAware;
import net.techreadiness.util.GenericTypeUtils;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.context.ApplicationContext;
import com.google.common.collect.Lists;
public abstract class BaseTaskFlowAction<T extends TaskFlowData, E extends TaskFlowDefinition> extends BaseAction implements
ConversationAware {
private static final long serialVersionUID = 1L;
private String taskName;
private List<String> selectedTasks;
protected Conversation conversation;
@Inject
private ApplicationContext applicationContext;
public T getTaskFlowData() {
return applicationContext.getBean(getTaskFlowDataTypeArgument());
}
public E getTaskFlowDefinition() {
return applicationContext.getBean(getTaskFlowDefinitionTypeArgument());
}
protected void startNewTaskFlow() {
List<Task> tasks = Lists.newArrayList();
for (String taskName : selectedTasks) {
Task task = getTaskFlowDefinition().getTask(taskName);
if (task != null) {
tasks.add(task);
}
}
TaskFlowState state = new TaskFlowState();
state.setTasks(tasks);
getTaskFlowData().setTaskFlowState(state);
getTaskFlowData().setStandardInvocation(true);
}
@Action(value = "next", results = { @Result(name = "success", type = "redirectAction", params = { "actionName",
"${taskFlowData.taskFlowState.currentTask.action}", "namespace",
"${taskFlowData.taskFlowState.currentTask.namespace}" }) })
public String previousInTaskFlow() throws ServiceException {
getTaskFlowData().getTaskFlowState().next();
return SUCCESS;
}
@Action(value = "prev", results = { @Result(name = "success", type = "redirectAction", params = { "actionName",
"${taskFlowData.taskFlowState.currentTask.action}", "namespace",
"${taskFlowData.taskFlowState.currentTask.namespace}" }) })
public String nextInTaskFlow() throws ServiceException {
getTaskFlowData().getTaskFlowState().previous();
return SUCCESS;
}
protected String endTaskFlow() {
return SUCCESS;
}
@Action(value = "end", results = { @Result(name = "success", type = "redirect", location = "%{taskFlowDefinition.returnUrl}") })
public String end() {
return endTaskFlow();
}
@Action(value = "navigateToTask", results = { @Result(name = "success", type = "redirectAction", params = {
"actionName", "${taskFlowData.taskFlowState.currentTask.action}", "namespace",
"${taskFlowData.taskFlowState.currentTask.namespace}" }) })
public String navigateToTask() {
Task task = getTaskFlowDefinition().getTask(taskName);
getTaskFlowData().getTaskFlowState().setCurrentTask(task);
return SUCCESS;
}
@Override
public void setConversation(Conversation conversation) {
this.conversation = conversation;
}
public String getTaskUrl() {
return getTaskFlowData().getTaskFlowState().getCurrentTask().getTaskUrl();
}
public String getReturnUrl() {
return getTaskFlowDefinition().getReturnUrl();
}
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public List<String> getSelectedTasks() {
return selectedTasks;
}
public void setSelectedTasks(List<String> selectedTasks) {
this.selectedTasks = selectedTasks;
}
protected Class<T> getTaskFlowDataTypeArgument() {
return (Class<T>) GenericTypeUtils.getTypeArguments(BaseTaskFlowAction.class, getClass()).get(0);
}
protected Class<E> getTaskFlowDefinitionTypeArgument() {
return (Class<E>) GenericTypeUtils.getTypeArguments(BaseTaskFlowAction.class, getClass()).get(1);
}
}