/* * #%L * BroadleafCommerce Profile Web * %% * Copyright (C) 2009 - 2013 Broadleaf Commerce * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ package org.broadleafcommerce.profile.web.controller; import org.apache.commons.validator.GenericValidator; import org.broadleafcommerce.common.persistence.EntityConfiguration; import org.broadleafcommerce.profile.core.domain.CustomerPhone; import org.broadleafcommerce.profile.core.domain.Phone; import org.broadleafcommerce.profile.core.service.CustomerPhoneService; import org.broadleafcommerce.profile.web.controller.validator.CustomerPhoneValidator; import org.broadleafcommerce.profile.web.controller.validator.PhoneValidator; import org.broadleafcommerce.profile.web.core.CustomerState; import org.broadleafcommerce.profile.web.core.model.PhoneNameForm; import org.broadleafcommerce.profile.web.core.util.PhoneFormatter; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.ValidationUtils; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; /** * Provides access and mutator functions to manage a customer's phones. * * @author sconlon */ @Controller("blCustomerPhoneController") @RequestMapping("/myaccount/phone") public class CustomerPhoneController { private static final String prefix = "myAccount/phone/customerPhones"; private static final String redirect = "redirect:/myaccount/phone/viewPhone.htm"; @Resource(name="blCustomerPhoneService") private CustomerPhoneService customerPhoneService; @Resource(name="blCustomerPhoneValidator") private CustomerPhoneValidator customerPhoneValidator; @Resource(name="blCustomerState") private CustomerState customerState; @Resource(name="blEntityConfiguration") private EntityConfiguration entityConfiguration; @Resource(name="blPhoneFormatter") private PhoneFormatter phoneFormatter; @Resource(name="blPhoneValidator") private PhoneValidator phoneValidator; /* ??? - * Will these static defaults alter their ability to be * overwritten via the appContext? TODO scc: test this scenario * */ private String deletePhoneSuccessView = redirect; private String makePhoneDefaultSuccessView = redirect; private String savePhoneErrorView = prefix; private String savePhoneSuccessView = prefix; private String viewPhoneErrorView = prefix; private String viewPhoneSuccessView = prefix; /** * Completely deletes the customerPhone with the given customerPhoneId from the database. * * @param customerPhoneId * @param request * * @return */ @RequestMapping(value="deletePhone", method = { RequestMethod.GET, RequestMethod.POST} ) public String deletePhone(@RequestParam(required = true) Long customerPhoneId, HttpServletRequest request) { customerPhoneService.deleteCustomerPhoneById(customerPhoneId); request.setAttribute("phone.deletedPhone", "true"); return deletePhoneSuccessView + customerPhoneId; } /** * Called before each and every request comes into the controller, and is placed on the request for use by those methods. * * * @param request * @param model * * @return */ @ModelAttribute("phoneNameForm") public PhoneNameForm initPhoneNameForm(HttpServletRequest request, Model model) { PhoneNameForm form = new PhoneNameForm(); form.setPhone((Phone) entityConfiguration.createEntityInstance("org.broadleafcommerce.profile.core.domain.Phone")); return form; } /** * Sets the passed in customerPhoneId as the default phone for the user. * * @param customerPhoneId * @param request * * @return */ @RequestMapping(value="makePhoneDefault", method = { RequestMethod.GET, RequestMethod.POST} ) public String makePhoneDefault(@RequestParam(required = true) Long customerPhoneId, HttpServletRequest request) { CustomerPhone customerPhone = customerPhoneService.readCustomerPhoneById(customerPhoneId); customerPhoneService.makeCustomerPhoneDefault(customerPhone.getId(), customerPhone.getCustomer().getId()); request.setAttribute("phone.madePhoneDefault", "true"); return makePhoneDefaultSuccessView; } /** * Creates a new phone if no customerPhoneId & phoneId are passed in; otherwise, it creates a new customerPhone object otherwise. If they are passed in, * it is assumed that there is an update. * * @param phoneNameForm * @param errors * @param request * @param customerPhoneId DOCUMENT ME! * @param phoneId DOCUMENT ME! * * @return */ @RequestMapping(value="savePhone", method = { RequestMethod.GET, RequestMethod.POST} ) public String savePhone(@ModelAttribute("phoneNameForm") PhoneNameForm phoneNameForm, BindingResult errors, HttpServletRequest request, @RequestParam(required = false) Long customerPhoneId, @RequestParam(required = false) Long phoneId) { if (GenericValidator.isBlankOrNull(phoneNameForm.getPhoneName())) { ValidationUtils.rejectIfEmptyOrWhitespace(errors, "phoneName", "phoneName.required"); } if(phoneId != null){ phoneNameForm.getPhone().setId(phoneId); } phoneFormatter.formatPhoneNumber(phoneNameForm.getPhone()); errors.pushNestedPath("phone"); phoneValidator.validate(phoneNameForm.getPhone(), errors); errors.popNestedPath(); if (!errors.hasErrors()) { CustomerPhone customerPhone = (CustomerPhone) entityConfiguration.createEntityInstance("org.broadleafcommerce.profile.core.domain.CustomerPhone"); customerPhone.setCustomer(customerState.getCustomer(request)); customerPhone.setPhoneName(phoneNameForm.getPhoneName()); customerPhone.setPhone(phoneNameForm.getPhone()); if ((customerPhoneId != null) && (customerPhoneId > 0)) { customerPhone.setId(customerPhoneId); } customerPhoneValidator.validate(customerPhone, errors); if (!errors.hasErrors()) { customerPhone = customerPhoneService.saveCustomerPhone(customerPhone); request.setAttribute("customerPhoneId", customerPhone.getId()); request.setAttribute("phoneId", customerPhone.getPhone().getId()); } return savePhoneSuccessView; } else { return savePhoneErrorView; } } public void setCustomerPhoneService(CustomerPhoneService customerPhoneService) { this.customerPhoneService = customerPhoneService; } public void setCustomerPhoneValidator(CustomerPhoneValidator customerPhoneValidator) { this.customerPhoneValidator = customerPhoneValidator; } public void setCustomerState(CustomerState customerState) { this.customerState = customerState; } public void setdeletePhoneSuccessView(String deletePhoneSuccessView) { this.deletePhoneSuccessView = deletePhoneSuccessView; } public void setEntityConfiguration(EntityConfiguration entityConfiguration) { this.entityConfiguration = entityConfiguration; } public void setmakePhoneDefaultSuccessView(String makePhoneDefaultSuccessView) { this.makePhoneDefaultSuccessView = makePhoneDefaultSuccessView; } public void setPhoneFormatter(PhoneFormatter phoneFormatter) { this.phoneFormatter = phoneFormatter; } public void setPhoneValidator(PhoneValidator phoneValidator) { this.phoneValidator = phoneValidator; } public void setsavePhoneErrorView(String savePhoneErrorView) { this.savePhoneErrorView = savePhoneErrorView; } public void setsavePhoneSuccessView(String savePhoneSuccessView) { this.savePhoneSuccessView = savePhoneSuccessView; } public void setviewPhoneErrorView(String viewPhoneErrorView) { this.viewPhoneErrorView = viewPhoneErrorView; } public void setviewPhoneSuccessView(String viewPhoneSuccessView) { this.viewPhoneSuccessView = viewPhoneSuccessView; } /** * Provides a blank template for a new Customer Phone to be created if no customerPhoneId is provided. * Otherwise, when a customerPhoneId is provided, the associated customerPhone object is retrieved, * and placed on the request. * * @param customerPhoneId * @param request * @param phoneNameForm * @param errors * @return */ @RequestMapping(value="viewPhone", method = { RequestMethod.GET, RequestMethod.POST} ) public String viewPhone(@RequestParam(required = false) Long customerPhoneId, HttpServletRequest request, @ModelAttribute("phoneNameForm") PhoneNameForm phoneNameForm, BindingResult errors) { if (customerPhoneId == null) { return viewPhoneSuccessView; } else { Long currCustomerId = customerState.getCustomer(request).getId(); CustomerPhone cPhone = customerPhoneService.readCustomerPhoneById(customerPhoneId); if (cPhone != null) { // TODO: verify this is the current customers phone //? - do we really need this since we read the phone with the currCustomerId? if (!cPhone.getCustomer().getId().equals(currCustomerId)) { return viewPhoneErrorView; } phoneNameForm.setPhone(cPhone.getPhone()); phoneNameForm.setPhoneName(cPhone.getPhoneName()); request.setAttribute("customerPhoneId", cPhone.getId()); request.setAttribute("phoneId", cPhone.getPhone().getId()); return viewPhoneSuccessView; } else { return viewPhoneErrorView; } } } }