From e9b6aff0d46774284961b06443a0b380337167a3 Mon Sep 17 00:00:00 2001
From: Mic <misvy@vmware.com>
Date: Wed, 16 Jan 2013 10:57:50 +0800
Subject: [PATCH] Merged Pet Controllers into a single one

---
 .../samples/petclinic/NamedEntity.java        |  1 +
 .../samples/petclinic/Owner.java              | 12 +--
 .../petclinic/web/EditPetController.java      | 80 -------------------
 ...dPetController.java => PetController.java} | 41 ++++++++--
 .../WEB-INF/jsp/owners/ownerDetails.jsp       |  4 +-
 src/main/webapp/resources/html/tutorial.html  |  2 +-
 6 files changed, 45 insertions(+), 95 deletions(-)
 delete mode 100644 src/main/java/org/springframework/samples/petclinic/web/EditPetController.java
 rename src/main/java/org/springframework/samples/petclinic/web/{AddPetController.java => PetController.java} (56%)

diff --git a/src/main/java/org/springframework/samples/petclinic/NamedEntity.java b/src/main/java/org/springframework/samples/petclinic/NamedEntity.java
index f77348e..18c4714 100644
--- a/src/main/java/org/springframework/samples/petclinic/NamedEntity.java
+++ b/src/main/java/org/springframework/samples/petclinic/NamedEntity.java
@@ -3,6 +3,7 @@ package org.springframework.samples.petclinic;
 import javax.persistence.Column;
 import javax.persistence.MappedSuperclass;
 
+
 /**
  * Simple JavaBean domain object adds a name property to <code>BaseEntity</code>.
  * Used as a base class for objects needing these properties.
diff --git a/src/main/java/org/springframework/samples/petclinic/Owner.java b/src/main/java/org/springframework/samples/petclinic/Owner.java
index bde857e..65e3df8 100644
--- a/src/main/java/org/springframework/samples/petclinic/Owner.java
+++ b/src/main/java/org/springframework/samples/petclinic/Owner.java
@@ -12,8 +12,9 @@ import javax.persistence.Entity;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.validation.constraints.Digits;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
 
-import org.hibernate.validator.constraints.NotEmpty;
 import org.springframework.beans.support.MutableSortDefinition;
 import org.springframework.beans.support.PropertyComparator;
 import org.springframework.core.style.ToStringCreator;
@@ -24,19 +25,20 @@ import org.springframework.core.style.ToStringCreator;
  * @author Ken Krebs
  * @author Juergen Hoeller
  * @author Sam Brannen
+ * @author Michael Isvy
  */
 @Entity @Table(name="owners")
 public class Owner extends Person {
 	@Column(name="address")
-	@NotEmpty
+	@NotNull @Size(min = 1)
 	private String address;
 	
-	@Column(name="city")
-	@NotEmpty
+	@Column(name="city")	
+	@NotNull @Size(min = 1)
 	private String city;
 
 	@Column(name="telephone")
-	@NotEmpty @Digits(fraction = 0, integer = 10)
+	@NotNull @Digits(fraction = 0, integer = 10)
 	private String telephone;
 
 	@OneToMany(cascade=CascadeType.ALL, mappedBy="owner")
diff --git a/src/main/java/org/springframework/samples/petclinic/web/EditPetController.java b/src/main/java/org/springframework/samples/petclinic/web/EditPetController.java
deleted file mode 100644
index 0a02fda..0000000
--- a/src/main/java/org/springframework/samples/petclinic/web/EditPetController.java
+++ /dev/null
@@ -1,80 +0,0 @@
-
-package org.springframework.samples.petclinic.web;
-
-import java.util.Collection;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.samples.petclinic.Clinic;
-import org.springframework.samples.petclinic.Pet;
-import org.springframework.samples.petclinic.PetType;
-import org.springframework.samples.petclinic.validation.PetValidator;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.WebDataBinder;
-import org.springframework.web.bind.annotation.InitBinder;
-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.SessionAttributes;
-import org.springframework.web.bind.support.SessionStatus;
-
-/**
- * JavaBean Form controller that is used to edit an existing <code>Pet</code>.
- * 
- * @author Juergen Hoeller
- * @author Ken Krebs
- * @author Arjen Poutsma
- */
-@Controller
-@RequestMapping("/owners/*/pets/{petId}/edit")
-@SessionAttributes("pet")
-public class EditPetController {
-
-	private final Clinic clinic;
-
-
-	@Autowired
-	public EditPetController(Clinic clinic) {
-		this.clinic = clinic;
-	}
-
-	@ModelAttribute("types")
-	public Collection<PetType> populatePetTypes() {
-		return this.clinic.getPetTypes();
-	}
-
-	@InitBinder
-	public void setAllowedFields(WebDataBinder dataBinder) {
-		dataBinder.setDisallowedFields("id");
-	}
-
-	@RequestMapping(method = RequestMethod.GET)
-	public String setupForm(@PathVariable("petId") int petId, Model model) {
-		Pet pet = this.clinic.findPet(petId);
-		model.addAttribute("pet", pet);
-		return "pets/createOrUpdatePetForm";
-	}
-
-	@RequestMapping(method = { RequestMethod.PUT, RequestMethod.POST })
-	public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) {
-		new PetValidator().validate(pet, result);
-		if (result.hasErrors()) {
-			return "pets/createOrUpdatePetForm";
-		}
-		else {
-			this.clinic.storePet(pet);
-			status.setComplete();
-			return "redirect:/owners/" + pet.getOwner().getId();
-		}
-	}
-
-	@RequestMapping(method = RequestMethod.DELETE)
-	public String deletePet(@PathVariable int petId) {
-		Pet pet = this.clinic.findPet(petId);
-		this.clinic.deletePet(petId);
-		return "redirect:/owners/" + pet.getOwner().getId();
-	}
-
-}
diff --git a/src/main/java/org/springframework/samples/petclinic/web/AddPetController.java b/src/main/java/org/springframework/samples/petclinic/web/PetController.java
similarity index 56%
rename from src/main/java/org/springframework/samples/petclinic/web/AddPetController.java
rename to src/main/java/org/springframework/samples/petclinic/web/PetController.java
index 99de315..b18ab99 100644
--- a/src/main/java/org/springframework/samples/petclinic/web/AddPetController.java
+++ b/src/main/java/org/springframework/samples/petclinic/web/PetController.java
@@ -30,15 +30,14 @@ import org.springframework.web.bind.support.SessionStatus;
  * @author Arjen Poutsma
  */
 @Controller
-@RequestMapping("/owners/{ownerId}/pets/new")
 @SessionAttributes("pet")
-public class AddPetController {
+public class PetController {
 
 	private final Clinic clinic;
 
 
 	@Autowired
-	public AddPetController(Clinic clinic) {
+	public PetController(Clinic clinic) {
 		this.clinic = clinic;
 	}
 
@@ -52,8 +51,8 @@ public class AddPetController {
 		dataBinder.setDisallowedFields("id");
 	}
 
-	@RequestMapping(method = RequestMethod.GET)
-	public String setupForm(@PathVariable("ownerId") int ownerId, Model model) {
+	@RequestMapping( method = RequestMethod.GET)
+	public String initCreationForm(@PathVariable("ownerId") int ownerId, Model model) {
 		Owner owner = this.clinic.findOwner(ownerId);
 		Pet pet = new Pet();
 		owner.addPet(pet);
@@ -61,8 +60,8 @@ public class AddPetController {
 		return "pets/createOrUpdatePetForm";
 	}
 
-	@RequestMapping(method = RequestMethod.POST)
-	public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) {
+	@RequestMapping(value="/owners/{ownerId}/pets/new", method = RequestMethod.POST)
+	public String processCreationForm(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) {
 		new PetValidator().validate(pet, result);
 		if (result.hasErrors()) {
 			return "pets/createOrUpdatePetForm";
@@ -73,5 +72,33 @@ public class AddPetController {
 			return "redirect:/owners/" + pet.getOwner().getId();
 		}
 	}
+	
+	@RequestMapping(value="/owners/*/pets/{petId}/edit", method = RequestMethod.GET)
+	public String initUpdateForm(@PathVariable("petId") int petId, Model model) {
+		Pet pet = this.clinic.findPet(petId);
+		model.addAttribute("pet", pet);
+		return "pets/createOrUpdatePetForm";
+	}
+
+	@RequestMapping(value="/owners/*/pets/{petId}/edit", method = { RequestMethod.PUT, RequestMethod.POST })
+	public String processUpdateForm(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) {
+		// we're not using @Valid annotation here because it is easier to define such validation rule in Java
+		new PetValidator().validate(pet, result);
+		if (result.hasErrors()) {
+			return "pets/createOrUpdatePetForm";
+		}
+		else {
+			this.clinic.storePet(pet);
+			status.setComplete();
+			return "redirect:/owners/" + pet.getOwner().getId();
+		}
+	}
+
+	@RequestMapping(value="/owners/*/pets/{petId}/edit", method = RequestMethod.DELETE)
+	public String deletePet(@PathVariable("petId") int petId) {
+		Pet pet = this.clinic.findPet(petId);
+		this.clinic.deletePet(petId);
+		return "redirect:/owners/" + pet.getOwner().getId();
+	}
 
 }
diff --git a/src/main/webapp/WEB-INF/jsp/owners/ownerDetails.jsp b/src/main/webapp/WEB-INF/jsp/owners/ownerDetails.jsp
index 205cfda..6c0f881 100644
--- a/src/main/webapp/WEB-INF/jsp/owners/ownerDetails.jsp
+++ b/src/main/webapp/WEB-INF/jsp/owners/ownerDetails.jsp
@@ -36,13 +36,13 @@
 	  <table class="table-buttons">
 	    <tr>
 	      <td colspan="2" align="center">
-	        <spring:url value="{ownerId}/edit" var="editUrl">
+	        <spring:url value="{ownerId}/edit.html" var="editUrl">
 	        	<spring:param name="ownerId" value="${owner.id}" />
 	        </spring:url>
 	        <a href="${fn:escapeXml(editUrl)}">Edit Owner</a>
 	      </td>
 	      <td>
-	        <spring:url value="{ownerId}/pets/new" var="addUrl">
+	        <spring:url value="{ownerId}/pets/new.html" var="addUrl">
 	        	<spring:param name="ownerId" value="${owner.id}" />
 	        </spring:url>
 	        <a href="${fn:escapeXml(addUrl)}">Add New Pet</a>
diff --git a/src/main/webapp/resources/html/tutorial.html b/src/main/webapp/resources/html/tutorial.html
index ada7140..e1a408b 100644
--- a/src/main/webapp/resources/html/tutorial.html
+++ b/src/main/webapp/resources/html/tutorial.html
@@ -834,7 +834,7 @@
 		A copy of the existing <strong>Owner</strong> is used for editing.
 	  </li>
 	  <li>
-		<span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.web.AddPetController</span>
+		<span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.web.PetController</span>
 		is an annotation-driven, POJO <em>Form</em> controller that is used to add a new <strong>Pet</strong>
 		to an existing <strong>Owner</strong>.
 	  </li>
-- 
GitLab