package org.springframework.samples.petportal.portlet;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletPreferences;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.samples.petportal.domain.Pet;
import org.springframework.samples.petportal.service.PetService;
import org.springframework.samples.petportal.validation.PetValidator;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.portlet.bind.PortletRequestDataBinder;
import org.springframework.web.portlet.util.PortletUtils;
/**
* This is a simple Controller which delegates to the
* {@link PetService PetService} and then populates the model with all
* returned Pets. This could have extended AbstractController in which
* case only the render phase would have required handling. However,
* this demonstrates the ability to simply implement the Controller
* interface.
*
* @author John A. Lewis
* @author Mark Fisher
* @author Juergen Hoeller
*/
@Controller
@RequestMapping("VIEW")
@SessionAttributes("pet")
public class PetsController {
private final PetService petService;
@Autowired
public PetsController(PetService petService) {
this.petService = petService;
}
/**
* For the page where the 'birthdate' is to be entered, the dateFormat is
* provided so that it may be displayed to the user. The format is
* retrieved from the PortletPreferences.
*/
@ModelAttribute("dateFormat")
protected String getDateFormat(PortletPreferences preferences) {
return preferences.getValue("dateFormat", PetService.DEFAULT_DATE_FORMAT);
}
/**
* Registers a PropertyEditor with the data binder for handling Dates
* using the format as currently specified in the PortletPreferences.
*/
@InitBinder
public void initBinder(PortletRequestDataBinder binder, PortletPreferences preferences) {
String formatString = preferences.getValue("dateFormat", PetService.DEFAULT_DATE_FORMAT);
SimpleDateFormat dateFormat = new SimpleDateFormat(formatString);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
binder.setAllowedFields(new String[] {"species", "breed", "name", "birthdate"});
}
@RequestMapping // default render (action=list)
public String listPets(Model model) {
model.addAttribute("pets", this.petService.getAllPets());
return "pets";
}
@RequestMapping(params = "action=view") // render phase
public String viewPet(@RequestParam("pet") int petId, Model model) {
model.addAttribute("pet", this.petService.getPet(petId));
return "petView";
}
@RequestMapping(params = "action=add") // render phase
public String showPetForm(Model model) {
// Used for the initial form as well as for redisplaying with errors.
if (!model.containsAttribute("pet")) {
model.addAttribute("pet", new Pet());
model.addAttribute("page", 0);
}
return "petAdd";
}
@RequestMapping(params = "action=add") // action phase
public void submitPage(
ActionRequest request, ActionResponse response,
@ModelAttribute("pet") Pet pet, BindingResult result,
@RequestParam("_page") int currentPage, Model model) {
if (request.getParameter("_cancel") != null) {
response.setRenderParameter("action", "list");
}
else if (request.getParameter("_finish") != null) {
new PetValidator().validate(pet, result);
if (!result.hasErrors()) {
this.petService.addPet(pet);
response.setRenderParameter("action", "list");
}
else {
model.addAttribute("page", currentPage);
}
}
else {
switch (currentPage) {
case 0: new PetValidator().validateSpecies(pet, result); break;
case 1: new PetValidator().validateBreed(pet, result); break;
case 2: new PetValidator().validateName(pet, result); break;
case 3: new PetValidator().validateBirthdate(pet, result); break;
}
int targetPage = currentPage;
if (!result.hasErrors()) {
targetPage = PortletUtils.getTargetPage(request, "_target", currentPage);
}
model.addAttribute("page", targetPage);
}
}
@RequestMapping(params = "action=delete") // action phase
public void deletePet(@RequestParam("pet") int petId, ActionResponse response) {
this.petService.deletePet(petId);
response.setRenderParameter("action", "list");
}
}