Java tutorial
/* * [y] hybris Platform * * Copyright (c) 2000-2013 hybris AG * All rights reserved. * * This software is the confidential and proprietary information of hybris * ("Confidential Information"). You shall not disclose such Confidential * Information and shall use it only in accordance with the terms of the * license agreement you entered into with hybris. * * */ package com.acc.storefront.controllers.pages; import de.hybris.platform.acceleratorstorefrontcommons.annotations.RequireHardLogIn; import de.hybris.platform.acceleratorstorefrontcommons.breadcrumb.Breadcrumb; import de.hybris.platform.acceleratorstorefrontcommons.breadcrumb.ResourceBreadcrumbBuilder; import de.hybris.platform.acceleratorstorefrontcommons.forms.AddressForm; import de.hybris.platform.acceleratorstorefrontcommons.forms.UpdateEmailForm; import de.hybris.platform.acceleratorstorefrontcommons.forms.UpdatePasswordForm; import de.hybris.platform.acceleratorstorefrontcommons.forms.UpdateProfileForm; import de.hybris.platform.acceleratorstorefrontcommons.forms.validation.AddressValidator; import de.hybris.platform.acceleratorstorefrontcommons.forms.validation.EmailValidator; import de.hybris.platform.acceleratorstorefrontcommons.forms.validation.PasswordValidator; import de.hybris.platform.acceleratorstorefrontcommons.forms.validation.ProfileValidator; import de.hybris.platform.cms2.exceptions.CMSItemNotFoundException; import de.hybris.platform.commercefacades.address.AddressVerificationFacade; import de.hybris.platform.commercefacades.address.data.AddressVerificationResult; import de.hybris.platform.commercefacades.customer.CustomerFacade; import de.hybris.platform.commercefacades.i18n.I18NFacade; import de.hybris.platform.commercefacades.order.CheckoutFacade; import de.hybris.platform.commercefacades.order.OrderFacade; import de.hybris.platform.commercefacades.order.data.CCPaymentInfoData; import de.hybris.platform.commercefacades.order.data.OrderData; import de.hybris.platform.commercefacades.order.data.OrderHistoryData; import de.hybris.platform.commercefacades.user.UserFacade; import de.hybris.platform.commercefacades.user.data.AddressData; import de.hybris.platform.commercefacades.user.data.CountryData; import de.hybris.platform.commercefacades.user.data.CustomerData; import de.hybris.platform.commercefacades.user.data.RegionData; import de.hybris.platform.commercefacades.user.data.TitleData; import de.hybris.platform.commercefacades.user.exceptions.PasswordMismatchException; import de.hybris.platform.commerceservices.address.AddressVerificationDecision; import de.hybris.platform.commerceservices.customer.DuplicateUidException; import de.hybris.platform.commerceservices.search.pagedata.PageableData; import de.hybris.platform.commerceservices.search.pagedata.SearchPageData; import de.hybris.platform.servicelayer.exceptions.UnknownIdentifierException; import de.hybris.platform.util.Config; import com.acc.storefront.controllers.ControllerConstants; import de.hybris.platform.acceleratorstorefrontcommons.controllers.util.GlobalMessages; import de.hybris.platform.acceleratorstorefrontcommons.forms.verification.AddressVerificationResultHandler; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.context.annotation.Scope; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.mvc.support.RedirectAttributes; /** * Controller for home page */ @Controller @Scope("tenant") @RequestMapping("/my-account") public class AccountPageController extends AbstractSearchPageController { // Internal Redirects private static final String REDIRECT_MY_ACCOUNT = REDIRECT_PREFIX + "/my-account"; private static final String REDIRECT_TO_ADDRESS_BOOK_PAGE = REDIRECT_PREFIX + "/my-account/address-book"; private static final String REDIRECT_TO_PAYMENT_INFO_PAGE = REDIRECT_PREFIX + "/my-account/payment-details"; private static final String REDIRECT_TO_PROFILE_PAGE = REDIRECT_PREFIX + "/my-account/profile"; /** * We use this suffix pattern because of an issue with Spring 3.1 where a Uri value is incorrectly extracted if it * contains on or more '.' characters. Please see https://jira.springsource.org/browse/SPR-6164 for a discussion on * the issue and future resolution. */ private static final String ORDER_CODE_PATH_VARIABLE_PATTERN = "{orderCode:.*}"; private static final String ADDRESS_CODE_PATH_VARIABLE_PATTERN = "{addressCode:.*}"; // CMS Pages private static final String ACCOUNT_CMS_PAGE = "account"; private static final String PROFILE_CMS_PAGE = "profile"; private static final String ADDRESS_BOOK_CMS_PAGE = "address-book"; private static final String ADD_EDIT_ADDRESS_CMS_PAGE = "add-edit-address"; private static final String PAYMENT_DETAILS_CMS_PAGE = "payment-details"; private static final String ORDER_HISTORY_CMS_PAGE = "orders"; private static final String ORDER_DETAIL_CMS_PAGE = "order"; private static final Logger LOG = Logger.getLogger(AccountPageController.class); @Resource(name = "orderFacade") private OrderFacade orderFacade; @Resource(name = "acceleratorCheckoutFacade") private CheckoutFacade checkoutFacade; @Resource(name = "userFacade") protected UserFacade userFacade; @Resource(name = "customerFacade") protected CustomerFacade customerFacade; @Resource(name = "accountBreadcrumbBuilder") private ResourceBreadcrumbBuilder accountBreadcrumbBuilder; @Resource(name = "passwordValidator") private PasswordValidator passwordValidator; @Resource(name = "addressValidator") private AddressValidator addressValidator; @Resource(name = "profileValidator") private ProfileValidator profileValidator; @Resource(name = "emailValidator") private EmailValidator emailValidator; @Resource(name = "i18NFacade") private I18NFacade i18NFacade; @Resource(name = "addressVerificationFacade") private AddressVerificationFacade addressVerificationFacade; @Resource(name = "addressVerificationResultHandler") private AddressVerificationResultHandler addressVerificationResultHandler; protected PasswordValidator getPasswordValidator() { return passwordValidator; } protected AddressValidator getAddressValidator() { return addressValidator; } protected ProfileValidator getProfileValidator() { return profileValidator; } protected EmailValidator getEmailValidator() { return emailValidator; } protected I18NFacade getI18NFacade() { return i18NFacade; } protected AddressVerificationFacade getAddressVerificationFacade() { return addressVerificationFacade; } protected AddressVerificationResultHandler getAddressVerificationResultHandler() { return addressVerificationResultHandler; } @ModelAttribute("countries") public Collection<CountryData> getCountries() { return checkoutFacade.getDeliveryCountries(); } @ModelAttribute("titles") public Collection<TitleData> getTitles() { return userFacade.getTitles(); } @ModelAttribute("countryDataMap") public Map<String, CountryData> getCountryDataMap() { final Map<String, CountryData> countryDataMap = new HashMap<>(); for (final CountryData countryData : getCountries()) { countryDataMap.put(countryData.getIsocode(), countryData); } return countryDataMap; } @RequestMapping(value = "/addressform", method = RequestMethod.GET) public String getCountryAddressForm(@RequestParam("addressCode") final String addressCode, @RequestParam("countryIsoCode") final String countryIsoCode, final Model model) { model.addAttribute("supportedCountries", getCountries()); model.addAttribute("regions", getI18NFacade().getRegionsForCountryIso(countryIsoCode)); model.addAttribute("country", countryIsoCode); final AddressForm addressForm = new AddressForm(); model.addAttribute("addressForm", addressForm); for (final AddressData addressData : userFacade.getAddressBook()) { if (addressData.getId() != null && addressData.getId().equals(addressCode) && countryIsoCode.equals(addressData.getCountry().getIsocode())) { model.addAttribute("addressData", addressData); addressForm.setAddressId(addressData.getId()); addressForm.setTitleCode(addressData.getTitleCode()); addressForm.setFirstName(addressData.getFirstName()); addressForm.setLastName(addressData.getLastName()); addressForm.setLine1(addressData.getLine1()); addressForm.setLine2(addressData.getLine2()); addressForm.setTownCity(addressData.getTown()); addressForm.setPostcode(addressData.getPostalCode()); addressForm.setCountryIso(addressData.getCountry().getIsocode()); if (addressData.getRegion() != null && !StringUtils.isEmpty(addressData.getRegion().getIsocode())) { addressForm.setRegionIso(addressData.getRegion().getIsocode()); } break; } } return ControllerConstants.Views.Fragments.Account.CountryAddressForm; } @RequestMapping(method = RequestMethod.GET) @RequireHardLogIn public String account(final Model model) throws CMSItemNotFoundException { storeCmsPageInModel(model, getContentPageForLabelOrId(ACCOUNT_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(ACCOUNT_CMS_PAGE)); model.addAttribute("breadcrumbs", accountBreadcrumbBuilder.getBreadcrumbs(null)); model.addAttribute("metaRobots", "no-index,no-follow"); return ControllerConstants.Views.Pages.Account.AccountHomePage; } @RequestMapping(value = "/orders", method = RequestMethod.GET) @RequireHardLogIn public String orders(@RequestParam(value = "page", defaultValue = "0") final int page, @RequestParam(value = "show", defaultValue = "Page") final ShowMode showMode, @RequestParam(value = "sort", required = false) final String sortCode, final Model model) throws CMSItemNotFoundException { // Handle paged search results final PageableData pageableData = createPageableData(page, 5, sortCode, showMode); final SearchPageData<OrderHistoryData> searchPageData = orderFacade .getPagedOrderHistoryForStatuses(pageableData); populateModel(model, searchPageData, showMode); storeCmsPageInModel(model, getContentPageForLabelOrId(ORDER_HISTORY_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(ORDER_HISTORY_CMS_PAGE)); model.addAttribute("breadcrumbs", accountBreadcrumbBuilder.getBreadcrumbs("text.account.orderHistory")); model.addAttribute("metaRobots", "no-index,no-follow"); return ControllerConstants.Views.Pages.Account.AccountOrderHistoryPage; } @RequestMapping(value = "/order/" + ORDER_CODE_PATH_VARIABLE_PATTERN, method = RequestMethod.GET) @RequireHardLogIn public String order(@PathVariable("orderCode") final String orderCode, final Model model) throws CMSItemNotFoundException { try { final OrderData orderDetails = orderFacade.getOrderDetailsForCode(orderCode); model.addAttribute("orderData", orderDetails); final List<Breadcrumb> breadcrumbs = accountBreadcrumbBuilder.getBreadcrumbs(null); breadcrumbs.add(new Breadcrumb("/my-account/orders", getMessageSource() .getMessage("text.account.orderHistory", null, getI18nService().getCurrentLocale()), null)); breadcrumbs.add(new Breadcrumb("#", getMessageSource().getMessage("text.account.order.orderBreadcrumb", new Object[] { orderDetails.getCode() }, "Order {0}", getI18nService().getCurrentLocale()), null)); model.addAttribute("breadcrumbs", breadcrumbs); } catch (final UnknownIdentifierException e) { LOG.warn("Attempted to load a order that does not exist or is not visible", e); return REDIRECT_MY_ACCOUNT; } storeCmsPageInModel(model, getContentPageForLabelOrId(ORDER_DETAIL_CMS_PAGE)); model.addAttribute("metaRobots", "no-index,no-follow"); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(ORDER_DETAIL_CMS_PAGE)); return ControllerConstants.Views.Pages.Account.AccountOrderPage; } @RequestMapping(value = "/profile", method = RequestMethod.GET) @RequireHardLogIn public String profile(final Model model) throws CMSItemNotFoundException { final List<TitleData> titles = userFacade.getTitles(); final CustomerData customerData = customerFacade.getCurrentCustomer(); if (customerData.getTitleCode() != null) { model.addAttribute("title", findTitleForCode(titles, customerData.getTitleCode())); } model.addAttribute("customerData", customerData); storeCmsPageInModel(model, getContentPageForLabelOrId(PROFILE_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(PROFILE_CMS_PAGE)); model.addAttribute("breadcrumbs", accountBreadcrumbBuilder.getBreadcrumbs("text.account.profile")); model.addAttribute("metaRobots", "no-index,no-follow"); return ControllerConstants.Views.Pages.Account.AccountProfilePage; } protected TitleData findTitleForCode(final List<TitleData> titles, final String code) { if (code != null && !code.isEmpty() && titles != null && !titles.isEmpty()) { for (final TitleData title : titles) { if (code.equals(title.getCode())) { return title; } } } return null; } @RequestMapping(value = "/update-email", method = RequestMethod.GET) @RequireHardLogIn public String editEmail(final Model model) throws CMSItemNotFoundException { final CustomerData customerData = customerFacade.getCurrentCustomer(); final UpdateEmailForm updateEmailForm = new UpdateEmailForm(); updateEmailForm.setEmail(customerData.getDisplayUid()); model.addAttribute("updateEmailForm", updateEmailForm); storeCmsPageInModel(model, getContentPageForLabelOrId(PROFILE_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(PROFILE_CMS_PAGE)); model.addAttribute("breadcrumbs", accountBreadcrumbBuilder.getBreadcrumbs("text.account.profile")); model.addAttribute("metaRobots", "no-index,no-follow"); return ControllerConstants.Views.Pages.Account.AccountProfileEmailEditPage; } @RequestMapping(value = "/update-email", method = RequestMethod.POST) @RequireHardLogIn public String updateEmail(final UpdateEmailForm updateEmailForm, final BindingResult bindingResult, final Model model, final RedirectAttributes redirectAttributes) throws CMSItemNotFoundException { getEmailValidator().validate(updateEmailForm, bindingResult); String returnAction = REDIRECT_TO_PROFILE_PAGE; if (!bindingResult.hasErrors() && !updateEmailForm.getEmail().equals(updateEmailForm.getChkEmail())) { bindingResult.rejectValue("chkEmail", "validation.checkEmail.equals", new Object[] {}, "validation.checkEmail.equals"); } if (bindingResult.hasErrors()) { returnAction = errorUpdatingEmail(model); } else { try { customerFacade.changeUid(updateEmailForm.getEmail(), updateEmailForm.getPassword()); GlobalMessages.addFlashMessage(redirectAttributes, GlobalMessages.CONF_MESSAGES_HOLDER, "text.account.profile.confirmationUpdated", null); // Replace the spring security authentication with the new UID final String newUid = customerFacade.getCurrentCustomer().getUid().toLowerCase(); final Authentication oldAuthentication = SecurityContextHolder.getContext().getAuthentication(); final UsernamePasswordAuthenticationToken newAuthentication = new UsernamePasswordAuthenticationToken( newUid, null, oldAuthentication.getAuthorities()); newAuthentication.setDetails(oldAuthentication.getDetails()); SecurityContextHolder.getContext().setAuthentication(newAuthentication); } catch (final DuplicateUidException e) { bindingResult.rejectValue("email", "profile.email.unique"); returnAction = errorUpdatingEmail(model); } catch (final PasswordMismatchException passwordMismatchException) { bindingResult.rejectValue("password", "profile.currentPassword.invalid"); returnAction = errorUpdatingEmail(model); } } return returnAction; } protected String errorUpdatingEmail(final Model model) throws CMSItemNotFoundException { final String returnAction; GlobalMessages.addErrorMessage(model, "form.global.error"); storeCmsPageInModel(model, getContentPageForLabelOrId(PROFILE_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(PROFILE_CMS_PAGE)); model.addAttribute("breadcrumbs", accountBreadcrumbBuilder.getBreadcrumbs("text.account.profile")); returnAction = ControllerConstants.Views.Pages.Account.AccountProfileEmailEditPage; return returnAction; } @RequestMapping(value = "/update-profile", method = RequestMethod.GET) @RequireHardLogIn public String editProfile(final Model model) throws CMSItemNotFoundException { model.addAttribute("titleData", userFacade.getTitles()); final CustomerData customerData = customerFacade.getCurrentCustomer(); final UpdateProfileForm updateProfileForm = new UpdateProfileForm(); updateProfileForm.setTitleCode(customerData.getTitleCode()); updateProfileForm.setFirstName(customerData.getFirstName()); updateProfileForm.setLastName(customerData.getLastName()); model.addAttribute("updateProfileForm", updateProfileForm); storeCmsPageInModel(model, getContentPageForLabelOrId(PROFILE_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(PROFILE_CMS_PAGE)); model.addAttribute("breadcrumbs", accountBreadcrumbBuilder.getBreadcrumbs("text.account.profile")); model.addAttribute("metaRobots", "no-index,no-follow"); return ControllerConstants.Views.Pages.Account.AccountProfileEditPage; } @RequestMapping(value = "/update-profile", method = RequestMethod.POST) @RequireHardLogIn public String updateProfile(final UpdateProfileForm updateProfileForm, final BindingResult bindingResult, final Model model, final RedirectAttributes redirectAttributes) throws CMSItemNotFoundException { getProfileValidator().validate(updateProfileForm, bindingResult); String returnAction = ControllerConstants.Views.Pages.Account.AccountProfileEditPage; final CustomerData currentCustomerData = customerFacade.getCurrentCustomer(); final CustomerData customerData = new CustomerData(); customerData.setTitleCode(updateProfileForm.getTitleCode()); customerData.setFirstName(updateProfileForm.getFirstName()); customerData.setLastName(updateProfileForm.getLastName()); customerData.setUid(currentCustomerData.getUid()); customerData.setDisplayUid(currentCustomerData.getDisplayUid()); model.addAttribute("titleData", userFacade.getTitles()); if (bindingResult.hasErrors()) { GlobalMessages.addErrorMessage(model, "form.global.error"); } else { try { customerFacade.updateProfile(customerData); GlobalMessages.addFlashMessage(redirectAttributes, GlobalMessages.CONF_MESSAGES_HOLDER, "text.account.profile.confirmationUpdated", null); returnAction = REDIRECT_TO_PROFILE_PAGE; } catch (final DuplicateUidException e) { bindingResult.rejectValue("email", "registration.error.account.exists.title"); GlobalMessages.addErrorMessage(model, "form.global.error"); } } storeCmsPageInModel(model, getContentPageForLabelOrId(PROFILE_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(PROFILE_CMS_PAGE)); model.addAttribute("breadcrumbs", accountBreadcrumbBuilder.getBreadcrumbs("text.account.profile")); return returnAction; } @RequestMapping(value = "/update-password", method = RequestMethod.GET) @RequireHardLogIn public String updatePassword(final Model model) throws CMSItemNotFoundException { final UpdatePasswordForm updatePasswordForm = new UpdatePasswordForm(); model.addAttribute("updatePasswordForm", updatePasswordForm); storeCmsPageInModel(model, getContentPageForLabelOrId(PROFILE_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(PROFILE_CMS_PAGE)); model.addAttribute("breadcrumbs", accountBreadcrumbBuilder.getBreadcrumbs("text.account.profile.updatePasswordForm")); model.addAttribute("metaRobots", "no-index,no-follow"); return ControllerConstants.Views.Pages.Account.AccountChangePasswordPage; } @RequestMapping(value = "/update-password", method = RequestMethod.POST) @RequireHardLogIn public String updatePassword(final UpdatePasswordForm updatePasswordForm, final BindingResult bindingResult, final Model model, final RedirectAttributes redirectAttributes) throws CMSItemNotFoundException { getPasswordValidator().validate(updatePasswordForm, bindingResult); if (!bindingResult.hasErrors()) { if (updatePasswordForm.getNewPassword().equals(updatePasswordForm.getCheckNewPassword())) { try { customerFacade.changePassword(updatePasswordForm.getCurrentPassword(), updatePasswordForm.getNewPassword()); } catch (final PasswordMismatchException localException) { bindingResult.rejectValue("currentPassword", "profile.currentPassword.invalid", new Object[] {}, "profile.currentPassword.invalid"); } } else { bindingResult.rejectValue("checkNewPassword", "validation.checkPwd.equals", new Object[] {}, "validation.checkPwd.equals"); } } if (bindingResult.hasErrors()) { GlobalMessages.addErrorMessage(model, "form.global.error"); storeCmsPageInModel(model, getContentPageForLabelOrId(PROFILE_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(PROFILE_CMS_PAGE)); model.addAttribute("breadcrumbs", accountBreadcrumbBuilder.getBreadcrumbs("text.account.profile.updatePasswordForm")); return ControllerConstants.Views.Pages.Account.AccountChangePasswordPage; } else { GlobalMessages.addFlashMessage(redirectAttributes, GlobalMessages.CONF_MESSAGES_HOLDER, "text.account.confirmation.password.updated", null); return REDIRECT_TO_PROFILE_PAGE; } } @RequestMapping(value = "/ address-book", method = RequestMethod.GET) @RequireHardLogIn public String getAddressBook(final Model model) throws CMSItemNotFoundException { model.addAttribute("addressData", userFacade.getAddressBook()); storeCmsPageInModel(model, getContentPageForLabelOrId(ADDRESS_BOOK_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(ADDRESS_BOOK_CMS_PAGE)); model.addAttribute("breadcrumbs", accountBreadcrumbBuilder.getBreadcrumbs("text.account.addressBook")); model.addAttribute("metaRobots", "no-index,no-follow"); return ControllerConstants.Views.Pages.Account.AccountAddressBookPage; } @RequestMapping(value = "/add-address", method = RequestMethod.GET) @RequireHardLogIn public String addAddress(final Model model) throws CMSItemNotFoundException { model.addAttribute("countryData", checkoutFacade.getDeliveryCountries()); model.addAttribute("titleData", userFacade.getTitles()); final AddressForm addressForm = getPreparedAddressForm(); model.addAttribute("addressForm", addressForm); model.addAttribute("addressBookEmpty", Boolean.valueOf(userFacade.isAddressBookEmpty())); model.addAttribute("isDefaultAddress", Boolean.FALSE); storeCmsPageInModel(model, getContentPageForLabelOrId(ADD_EDIT_ADDRESS_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(ADD_EDIT_ADDRESS_CMS_PAGE)); final List<Breadcrumb> breadcrumbs = accountBreadcrumbBuilder.getBreadcrumbs(null); breadcrumbs.add(new Breadcrumb("/my-account/address-book", getMessageSource() .getMessage("text.account.addressBook", null, getI18nService().getCurrentLocale()), null)); breadcrumbs.add(new Breadcrumb("#", getMessageSource().getMessage("text.account.addressBook.addEditAddress", null, getI18nService().getCurrentLocale()), null)); model.addAttribute("breadcrumbs", breadcrumbs); model.addAttribute("metaRobots", "no-index,no-follow"); return ControllerConstants.Views.Pages.Account.AccountEditAddressPage; } protected AddressForm getPreparedAddressForm() { final CustomerData currentCustomerData = customerFacade.getCurrentCustomer(); final AddressForm addressForm = new AddressForm(); addressForm.setFirstName(currentCustomerData.getFirstName()); addressForm.setLastName(currentCustomerData.getLastName()); addressForm.setTitleCode(currentCustomerData.getTitleCode()); return addressForm; } @RequestMapping(value = "/add-address", method = RequestMethod.POST) @RequireHardLogIn public String addAddress(final AddressForm addressForm, final BindingResult bindingResult, final Model model, final HttpServletRequest request, final RedirectAttributes redirectModel) throws CMSItemNotFoundException { getAddressValidator().validate(addressForm, bindingResult); if (bindingResult.hasErrors()) { GlobalMessages.addErrorMessage(model, "form.global.error"); storeCmsPageInModel(model, getContentPageForLabelOrId(ADD_EDIT_ADDRESS_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(ADD_EDIT_ADDRESS_CMS_PAGE)); setUpAddressFormAfterError(addressForm, model); return ControllerConstants.Views.Pages.Account.AccountEditAddressPage; } final AddressData newAddress = new AddressData(); newAddress.setTitleCode(addressForm.getTitleCode()); newAddress.setFirstName(addressForm.getFirstName()); newAddress.setLastName(addressForm.getLastName()); newAddress.setLine1(addressForm.getLine1()); newAddress.setLine2(addressForm.getLine2()); newAddress.setTown(addressForm.getTownCity()); newAddress.setPostalCode(addressForm.getPostcode()); newAddress.setBillingAddress(false); newAddress.setShippingAddress(true); newAddress.setVisibleInAddressBook(true); newAddress.setCountry(getI18NFacade().getCountryForIsocode(addressForm.getCountryIso())); if (addressForm.getRegionIso() != null && !StringUtils.isEmpty(addressForm.getRegionIso())) { newAddress .setRegion(getI18NFacade().getRegion(addressForm.getCountryIso(), addressForm.getRegionIso())); } if (userFacade.isAddressBookEmpty()) { newAddress.setDefaultAddress(true); newAddress.setVisibleInAddressBook(true); } else { newAddress.setDefaultAddress( addressForm.getDefaultAddress() != null && addressForm.getDefaultAddress().booleanValue()); } final AddressVerificationResult<AddressVerificationDecision> verificationResult = getAddressVerificationFacade() .verifyAddressData(newAddress); final boolean addressRequiresReview = getAddressVerificationResultHandler().handleResult(verificationResult, newAddress, model, redirectModel, bindingResult, getAddressVerificationFacade().isCustomerAllowedToIgnoreAddressSuggestions(), "checkout.multi.address.added"); if (addressRequiresReview) { model.addAttribute("regions", getI18NFacade().getRegionsForCountryIso(addressForm.getCountryIso())); model.addAttribute("country", addressForm.getCountryIso()); storeCmsPageInModel(model, getContentPageForLabelOrId(ADD_EDIT_ADDRESS_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(ADD_EDIT_ADDRESS_CMS_PAGE)); return ControllerConstants.Views.Pages.Account.AccountEditAddressPage; } userFacade.addAddress(newAddress); return REDIRECT_TO_ADDRESS_BOOK_PAGE; } protected void setUpAddressFormAfterError(final AddressForm addressForm, final Model model) { model.addAttribute("countryData", checkoutFacade.getDeliveryCountries()); model.addAttribute("titleData", userFacade.getTitles()); model.addAttribute("addressBookEmpty", Boolean.valueOf(userFacade.isAddressBookEmpty())); model.addAttribute("isDefaultAddress", Boolean.valueOf(isDefaultAddress(addressForm.getAddressId()))); if (addressForm.getCountryIso() != null) { model.addAttribute("regions", getI18NFacade().getRegionsForCountryIso(addressForm.getCountryIso())); model.addAttribute("country", addressForm.getCountryIso()); } } @RequestMapping(value = "/edit-address/" + ADDRESS_CODE_PATH_VARIABLE_PATTERN, method = RequestMethod.GET) @RequireHardLogIn public String editAddress(@PathVariable("addressCode") final String addressCode, final Model model) throws CMSItemNotFoundException { final AddressForm addressForm = new AddressForm(); model.addAttribute("countryData", checkoutFacade.getDeliveryCountries()); model.addAttribute("titleData", userFacade.getTitles()); model.addAttribute("addressForm", addressForm); model.addAttribute("addressBookEmpty", Boolean.valueOf(userFacade.isAddressBookEmpty())); for (final AddressData addressData : userFacade.getAddressBook()) { if (addressData.getId() != null && addressData.getId().equals(addressCode)) { model.addAttribute("regions", getI18NFacade().getRegionsForCountryIso(addressData.getCountry().getIsocode())); model.addAttribute("country", addressData.getCountry().getIsocode()); model.addAttribute("addressData", addressData); addressForm.setAddressId(addressData.getId()); addressForm.setTitleCode(addressData.getTitleCode()); addressForm.setFirstName(addressData.getFirstName()); addressForm.setLastName(addressData.getLastName()); addressForm.setLine1(addressData.getLine1()); addressForm.setLine2(addressData.getLine2()); addressForm.setTownCity(addressData.getTown()); addressForm.setPostcode(addressData.getPostalCode()); addressForm.setCountryIso(addressData.getCountry().getIsocode()); if (addressData.getRegion() != null && !StringUtils.isEmpty(addressData.getRegion().getIsocode())) { addressForm.setRegionIso(addressData.getRegion().getIsocode()); } if (isDefaultAddress(addressData.getId())) { addressForm.setDefaultAddress(Boolean.TRUE); model.addAttribute("isDefaultAddress", Boolean.TRUE); } else { addressForm.setDefaultAddress(Boolean.FALSE); model.addAttribute("isDefaultAddress", Boolean.FALSE); } break; } } storeCmsPageInModel(model, getContentPageForLabelOrId(ADD_EDIT_ADDRESS_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(ADD_EDIT_ADDRESS_CMS_PAGE)); final List<Breadcrumb> breadcrumbs = accountBreadcrumbBuilder.getBreadcrumbs(null); breadcrumbs.add(new Breadcrumb("/my-account/address-book", getMessageSource() .getMessage("text.account.addressBook", null, getI18nService().getCurrentLocale()), null)); breadcrumbs.add(new Breadcrumb("#", getMessageSource().getMessage("text.account.addressBook.addEditAddress", null, getI18nService().getCurrentLocale()), null)); model.addAttribute("breadcrumbs", breadcrumbs); model.addAttribute("metaRobots", "no-index,no-follow"); model.addAttribute("edit", Boolean.TRUE); return ControllerConstants.Views.Pages.Account.AccountEditAddressPage; } /** * Method checks if address is set as default * * @param addressId - identifier for address to check * @return true if address is default, false if address is not default */ protected boolean isDefaultAddress(final String addressId) { final AddressData defaultAddress = userFacade.getDefaultAddress(); return (defaultAddress != null && defaultAddress.getId() != null && defaultAddress.getId().equals(addressId)); } @RequestMapping(value = "/edit-address/" + ADDRESS_CODE_PATH_VARIABLE_PATTERN, method = RequestMethod.POST) @RequireHardLogIn public String editAddress(final AddressForm addressForm, final BindingResult bindingResult, final Model model, final RedirectAttributes redirectModel) throws CMSItemNotFoundException { getAddressValidator().validate(addressForm, bindingResult); if (bindingResult.hasErrors()) { GlobalMessages.addErrorMessage(model, "form.global.error"); storeCmsPageInModel(model, getContentPageForLabelOrId(ADD_EDIT_ADDRESS_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(ADD_EDIT_ADDRESS_CMS_PAGE)); setUpAddressFormAfterError(addressForm, model); return ControllerConstants.Views.Pages.Account.AccountEditAddressPage; } model.addAttribute("metaRobots", "no-index,no-follow"); final AddressData newAddress = new AddressData(); newAddress.setId(addressForm.getAddressId()); newAddress.setTitleCode(addressForm.getTitleCode()); newAddress.setFirstName(addressForm.getFirstName()); newAddress.setLastName(addressForm.getLastName()); newAddress.setLine1(addressForm.getLine1()); newAddress.setLine2(addressForm.getLine2()); newAddress.setTown(addressForm.getTownCity()); newAddress.setPostalCode(addressForm.getPostcode()); newAddress.setBillingAddress(false); newAddress.setShippingAddress(true); newAddress.setVisibleInAddressBook(true); newAddress.setCountry(getI18NFacade().getCountryForIsocode(addressForm.getCountryIso())); if (addressForm.getRegionIso() != null && !StringUtils.isEmpty(addressForm.getRegionIso())) { newAddress .setRegion(getI18NFacade().getRegion(addressForm.getCountryIso(), addressForm.getRegionIso())); } if (Boolean.TRUE.equals(addressForm.getDefaultAddress()) || userFacade.getAddressBook().size() <= 1) { newAddress.setDefaultAddress(true); newAddress.setVisibleInAddressBook(true); } final AddressVerificationResult<AddressVerificationDecision> verificationResult = getAddressVerificationFacade() .verifyAddressData(newAddress); final boolean addressRequiresReview = getAddressVerificationResultHandler().handleResult(verificationResult, newAddress, model, redirectModel, bindingResult, getAddressVerificationFacade().isCustomerAllowedToIgnoreAddressSuggestions(), "checkout.multi.address.updated"); if (addressRequiresReview) { model.addAttribute("regions", getI18NFacade().getRegionsForCountryIso(addressForm.getCountryIso())); model.addAttribute("country", addressForm.getCountryIso()); model.addAttribute("edit", Boolean.TRUE); storeCmsPageInModel(model, getContentPageForLabelOrId(ADD_EDIT_ADDRESS_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(ADD_EDIT_ADDRESS_CMS_PAGE)); return ControllerConstants.Views.Pages.Account.AccountEditAddressPage; } userFacade.editAddress(newAddress); return REDIRECT_TO_ADDRESS_BOOK_PAGE; } @RequestMapping(value = "/select-suggested-address", method = RequestMethod.POST) public String doSelectSuggestedAddress(final AddressForm addressForm, final RedirectAttributes redirectModel) { final Set<String> resolveCountryRegions = org.springframework.util.StringUtils .commaDelimitedListToSet(Config.getParameter("resolve.country.regions")); final AddressData selectedAddress = new AddressData(); selectedAddress.setId(addressForm.getAddressId()); selectedAddress.setTitleCode(addressForm.getTitleCode()); selectedAddress.setFirstName(addressForm.getFirstName()); selectedAddress.setLastName(addressForm.getLastName()); selectedAddress.setLine1(addressForm.getLine1()); selectedAddress.setLine2(addressForm.getLine2()); selectedAddress.setTown(addressForm.getTownCity()); selectedAddress.setPostalCode(addressForm.getPostcode()); selectedAddress.setBillingAddress(false); selectedAddress.setShippingAddress(true); selectedAddress.setVisibleInAddressBook(true); final CountryData countryData = i18NFacade.getCountryForIsocode(addressForm.getCountryIso()); selectedAddress.setCountry(countryData); if (resolveCountryRegions.contains(countryData.getIsocode())) { if (addressForm.getRegionIso() != null && !StringUtils.isEmpty(addressForm.getRegionIso())) { final RegionData regionData = getI18NFacade().getRegion(addressForm.getCountryIso(), addressForm.getRegionIso()); selectedAddress.setRegion(regionData); } } if (resolveCountryRegions.contains(countryData.getIsocode())) { if (addressForm.getRegionIso() != null && !StringUtils.isEmpty(addressForm.getRegionIso())) { final RegionData regionData = getI18NFacade().getRegion(addressForm.getCountryIso(), addressForm.getRegionIso()); selectedAddress.setRegion(regionData); } } if (Boolean.TRUE.equals(addressForm.getEditAddress())) { selectedAddress.setDefaultAddress(Boolean.TRUE.equals(addressForm.getDefaultAddress()) || userFacade.getAddressBook().size() <= 1); userFacade.editAddress(selectedAddress); } else { selectedAddress.setDefaultAddress( Boolean.TRUE.equals(addressForm.getDefaultAddress()) || userFacade.isAddressBookEmpty()); userFacade.addAddress(selectedAddress); } GlobalMessages.addFlashMessage(redirectModel, GlobalMessages.CONF_MESSAGES_HOLDER, "account.confirmation.address.added"); return REDIRECT_TO_ADDRESS_BOOK_PAGE; } @RequestMapping(value = "/remove-address/" + ADDRESS_CODE_PATH_VARIABLE_PATTERN, method = { RequestMethod.GET, RequestMethod.POST }) @RequireHardLogIn public String removeAddress(@PathVariable("addressCode") final String addressCode, final RedirectAttributes redirectModel) { final AddressData addressData = new AddressData(); addressData.setId(addressCode); userFacade.removeAddress(addressData); GlobalMessages.addFlashMessage(redirectModel, GlobalMessages.CONF_MESSAGES_HOLDER, "account.confirmation.address.removed"); return REDIRECT_TO_ADDRESS_BOOK_PAGE; } @RequestMapping(value = "/set-default-address/" + ADDRESS_CODE_PATH_VARIABLE_PATTERN, method = RequestMethod.GET) @RequireHardLogIn public String setDefaultAddress(@PathVariable("addressCode") final String addressCode, final RedirectAttributes redirectModel) { final AddressData addressData = new AddressData(); addressData.setDefaultAddress(true); addressData.setVisibleInAddressBook(true); addressData.setId(addressCode); userFacade.setDefaultAddress(addressData); GlobalMessages.addFlashMessage(redirectModel, GlobalMessages.CONF_MESSAGES_HOLDER, "account.confirmation.default.address.changed"); return REDIRECT_TO_ADDRESS_BOOK_PAGE; } @RequestMapping(value = "/payment-details", method = RequestMethod.GET) @RequireHardLogIn public String paymentDetails(final Model model) throws CMSItemNotFoundException { model.addAttribute("customerData", customerFacade.getCurrentCustomer()); model.addAttribute("paymentInfoData", userFacade.getCCPaymentInfos(true)); storeCmsPageInModel(model, getContentPageForLabelOrId(PAYMENT_DETAILS_CMS_PAGE)); setUpMetaDataForContentPage(model, getContentPageForLabelOrId(ADD_EDIT_ADDRESS_CMS_PAGE)); model.addAttribute("breadcrumbs", accountBreadcrumbBuilder.getBreadcrumbs("text.account.paymentDetails")); model.addAttribute("metaRobots", "no-index,no-follow"); return ControllerConstants.Views.Pages.Account.AccountPaymentInfoPage; } @RequestMapping(value = "/set-default-payment-details", method = RequestMethod.POST) @RequireHardLogIn public String setDefaultPaymentDetails(@RequestParam final String paymentInfoId) { CCPaymentInfoData paymentInfoData = null; if (StringUtils.isNotBlank(paymentInfoId)) { paymentInfoData = userFacade.getCCPaymentInfoForCode(paymentInfoId); } userFacade.setDefaultPaymentInfo(paymentInfoData); return REDIRECT_TO_PAYMENT_INFO_PAGE; } @RequestMapping(value = "/remove-payment-method", method = RequestMethod.POST) @RequireHardLogIn public String removePaymentMethod(final Model model, @RequestParam(value = "paymentInfoId") final String paymentMethodId, final RedirectAttributes redirectAttributes) throws CMSItemNotFoundException { userFacade.unlinkCCPaymentInfo(paymentMethodId); GlobalMessages.addFlashMessage(redirectAttributes, GlobalMessages.CONF_MESSAGES_HOLDER, "text.account.profile.paymentCart.removed"); return REDIRECT_TO_PAYMENT_INFO_PAGE; } }