package org.theospi.portfolio.presentation.control;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.sakaiproject.content.api.ResourceEditingHelper;
import org.sakaiproject.metaobj.shared.FormHelper;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import org.theospi.portfolio.presentation.support.PresentationService;
public abstract class AbstractCalloutController extends AbstractController {
protected PresentationService presentationService;
protected String helperView = "formHelper";
protected String returnView = "editPresentationRedirect";
//There are only three ways this controller gets invoked
// 1: Initial request -- set up session and call out to helper
// 2: Return from helper -- handle helper action, tear down session, return to the return view
// 2a: Save callback -- act on the details returned from helper to commit a change
// 2b: Cancel callback -- clean up any extra materials required
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpSession session = request.getSession();
Object helperAction = session.getAttribute(FormHelper.RETURN_ACTION_TAG);
String cachedId = (String) session.getAttribute(FormHelper.PRESENTATION_ID);
if (FormHelper.RETURN_ACTION_SAVE.equals(helperAction)) {
return handleSave(cachedId, session);
}
else if (FormHelper.RETURN_ACTION_CANCEL.equals(helperAction)) {
return handleCancel(cachedId, session);
}
else {
return handleEdit(request);
}
}
protected ModelAndView handleEdit(HttpServletRequest request) {
String presentationId = request.getParameter("id");
HttpSession session = request.getSession();
cleanUpSession(session);
for (Entry<String, Object> entry : getSessionParams(presentationId, request).entrySet())
session.setAttribute(entry.getKey(), entry.getValue());
session.setAttribute(FormHelper.PRESENTATION_ID, presentationId);
return sendToHelper();
}
protected Map<String, Object> getSessionParams(String presentationId, HttpServletRequest request) {
return new HashMap<String, Object>();
}
protected ModelAndView handleSave(String presentationId, HttpSession session) {
String reference = (String) session.getAttribute(FormHelper.RETURN_REFERENCE_TAG);
save(presentationId, reference, session);
cleanUpSession(session);
return sendToReturn(presentationId);
}
protected void save(String presentationId, String reference, HttpSession session) {
return;
}
protected ModelAndView handleCancel(String presentationId, HttpSession session) {
cancel(presentationId);
cleanUpSession(session);
return sendToReturn(presentationId);
}
protected void cancel(String presentationId) {
return;
}
protected void cleanUpSession(HttpSession session) {
session.removeAttribute(ResourceEditingHelper.CREATE_TYPE);
session.removeAttribute(ResourceEditingHelper.CREATE_SUB_TYPE);
session.removeAttribute(ResourceEditingHelper.CREATE_PARENT);
session.removeAttribute(ResourceEditingHelper.ATTACHMENT_ID);
session.removeAttribute(FormHelper.RETURN_ACTION_TAG);
session.removeAttribute(FormHelper.PARENT_ID_TAG);
session.removeAttribute(FormHelper.NEW_FORM_DISPLAY_NAME_TAG);
session.removeAttribute(FormHelper.PRESENTATION_ID);
}
private ModelAndView sendToHelper() {
return new ModelAndView(helperView);
}
private ModelAndView sendToHelper(Map model) {
return new ModelAndView(helperView, model);
}
private ModelAndView sendToReturn() {
return new ModelAndView(returnView);
}
private ModelAndView sendToReturn(String presentationId) {
HashMap<String, Object> model = new HashMap<String, Object>();
model.put("id", presentationId);
return new ModelAndView(returnView, model);
}
private ModelAndView sendToReturn(Map model) {
return new ModelAndView(returnView, model);
}
public String getHelperView() {
return helperView;
}
public String getReturnView() {
return returnView;
}
public void setReturnView(String returnView) {
this.returnView = returnView;
}
public void setHelperView(String helperView) {
this.helperView = helperView;
}
public void setPresentationService(PresentationService presentationService) {
this.presentationService = presentationService;
}
}