package org.springframework.autobuilds.jpetstore.web.spring; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.autobuilds.jpetstore.domain.Account; import org.springframework.autobuilds.jpetstore.domain.Cart; import org.springframework.autobuilds.jpetstore.domain.logic.OrderValidator; import org.springframework.autobuilds.jpetstore.domain.logic.PetStoreFacade; import org.springframework.validation.BindException; import org.springframework.validation.Errors; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndViewDefiningException; import org.springframework.web.servlet.mvc.AbstractWizardFormController; /** * @author Juergen Hoeller * @since 01.12.2003 */ public class OrderFormController extends AbstractWizardFormController { private PetStoreFacade petStore; public OrderFormController() { setCommandName("orderForm"); setPages(new String[] {"NewOrderForm", "ShippingForm", "ConfirmOrder"}); } public void setPetStore(PetStoreFacade petStore) { this.petStore = petStore; } protected Object formBackingObject(HttpServletRequest request) throws Exception { UserSession userSession = (UserSession) request.getSession().getAttribute("userSession"); Cart cart = (Cart) request.getSession().getAttribute("sessionCart"); if (cart != null) { // Re-read account from DB at team's request. Account account = this.petStore.getAccount(userSession.getAccount().getUsername()); OrderForm orderForm = new OrderForm(); orderForm.getOrder().initOrder(account, cart); return orderForm; } else { ModelAndView modelAndView = new ModelAndView("Error", "message", "An order could not be created because a cart could not be found."); throw new ModelAndViewDefiningException(modelAndView); } } protected boolean isFormSubmission(HttpServletRequest request) { return super.isFormSubmission(request) || request.getParameter(PARAM_FINISH) != null; } protected void onBindAndValidate(HttpServletRequest request, Object command, BindException errors, int page) throws Exception { if (page == 0 && request.getParameter("shippingAddressRequired") == null) { OrderForm orderForm = (OrderForm) command; orderForm.setShippingAddressRequired(false); } } protected Map referenceData(HttpServletRequest request, int page) throws Exception { if (page == 0) { List creditCardTypes = new ArrayList(); creditCardTypes.add("Visa"); creditCardTypes.add("MasterCard"); creditCardTypes.add("American Express"); Map model = new HashMap(); model.put("creditCardTypes", creditCardTypes); return model; } return null; } protected int getTargetPage(HttpServletRequest request, Object command, Errors errors, int currentPage) { OrderForm orderForm = (OrderForm) command; if (currentPage == 0 && orderForm.isShippingAddressRequired()) { return 1; } else { return 2; } } protected void validatePage(Object command, Errors errors, int page) { OrderForm orderForm = (OrderForm) command; OrderValidator orderValidator = (OrderValidator) getValidator(); errors.setNestedPath("order"); switch (page) { case 0: orderValidator.validateCreditCard(orderForm.getOrder(), errors); orderValidator.validateBillingAddress(orderForm.getOrder(), errors); break; case 1: orderValidator.validateShippingAddress(orderForm.getOrder(), errors); } errors.setNestedPath(""); } protected ModelAndView processFinish(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { OrderForm orderForm = (OrderForm) command; this.petStore.insertOrder(orderForm.getOrder()); request.getSession().removeAttribute("sessionCart"); Map model = new HashMap(); model.put("order", orderForm.getOrder()); model.put("message", "Thank you, your order has been submitted."); return new ModelAndView("ViewOrder", model); } protected ModelAndView processCancel(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { throw new UnsupportedOperationException(); } }