package org.molgenis.ui.wizard;
import org.molgenis.ui.MolgenisPluginController;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import static org.molgenis.ui.MolgenisPluginAttributes.KEY_CONTEXT_URL;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
import static org.springframework.web.bind.annotation.RequestMethod.POST;
public abstract class AbstractWizardController extends MolgenisPluginController
{
private static final String VIEW_NAME = "view-wizard";
private final String wizardName;
public AbstractWizardController(String uri, String wizardName)
{
super(uri);
this.wizardName = wizardName;
}
protected abstract Wizard createWizard();
@ModelAttribute("javascripts")
public List<String> getJavascripts()
{
return Collections.emptyList();
}
@ModelAttribute("stylesheets")
public List<String> getStylesheets()
{
return Collections.emptyList();
}
@ModelAttribute("wizard")
public Wizard wizard(HttpSession session)
{
Wizard wizard = (Wizard) session.getAttribute(wizardName);
if (wizard == null)
{
wizard = createWizard();
session.setAttribute(wizardName, wizard);
}
return wizard;
}
@RequestMapping(value = "/**", method = GET)
public String init(HttpServletRequest request)
{
onInit(request);
return VIEW_NAME;
}
protected void onInit(HttpServletRequest request)
{
// in case you want to do something in the beginning
}
@RequestMapping(value = "/next", method = POST)
public String next(HttpServletRequest request, HttpServletResponse response,
@ModelAttribute("wizard") Wizard wizard, BindingResult result, Model model) throws IOException
{
if (wizard.isLastPage())
{
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return null;
}
WizardPage page = wizard.getCurrentPage();
String message = page.handleRequest(request, result, wizard);
if (!result.hasErrors())
{
model.addAttribute("successMessage", message);
wizard.next();
}
return VIEW_NAME;
}
@RequestMapping(value = "/previous", method = POST)
public String previous(HttpServletResponse response, @ModelAttribute("wizard") Wizard wizard) throws IOException
{
if (wizard.isFirstPage())
{
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return null;
}
wizard.previous();
return VIEW_NAME;
}
@RequestMapping(value = "/restart")
public String restart(HttpServletRequest request, HttpSession session)
{
session.removeAttribute(wizardName);
return "redirect:" + request.getAttribute(KEY_CONTEXT_URL);
}
}