org.broadleafcommerce.profile.web.controller.CustomerPhoneController.java Source code

Java tutorial

Introduction

Here is the source code for org.broadleafcommerce.profile.web.controller.CustomerPhoneController.java

Source

/*
 * #%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;
            }
        }
    }
}