From 8d13441dec5e52f0a6c1a02ed04e671cf17db094 Mon Sep 17 00:00:00 2001 From: Roni Dover Date: Wed, 26 Nov 2025 08:04:05 -0800 Subject: [PATCH 1/2] Fix division by zero in showOwner method when pet list is empty --- .../petclinic/owner/OwnerController.java | 34 +++++-------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java b/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java index 9ceba60c75c..79ba4fac504 100644 --- a/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java +++ b/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java @@ -19,8 +19,7 @@ import java.util.stream.Collectors;import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.api.trace.Tracer; -import io.opentelemetry.instrumentation.annotations.WithSpan; +import io.opentelemetry.api.trace.Tracer;import io.opentelemetry.instrumentation.annotations.WithSpan; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -38,9 +37,7 @@ * @author Arjen Poutsma * @author Michael Isvy */ -@Controllerclass OwnerController implements InitializingBean { - - private static final String VIEWS_OWNER_CREATE_OR_UPDATE_FORM = "owners/createOrUpdateOwnerForm"; +@Controllerclass OwnerController implements InitializingBean {private static final String VIEWS_OWNER_CREATE_OR_UPDATE_FORM = "owners/createOrUpdateOwnerForm"; private OwnerValidation validator; @@ -72,9 +69,7 @@ public void setAllowedFields(WebDataBinder dataBinder) { }@ModelAttribute("owner") public Owner findOwner(@PathVariable(name = "ownerId", required = false) Integer ownerId) { return ownerId == null ? new Owner() : this.owners.findById(ownerId); - } - - @GetMapping("/owners/new") + }@GetMapping("/owners/new") public String initCreationForm(Map model) { Owner owner = new Owner(); validator.ValidateOwnerWithExternalService(owner); @@ -98,9 +93,7 @@ public String processCreationForm(@Valid Owner owner, BindingResult result) { }@GetMapping("/owners/find") public String initFindForm() { return "owners/findOwners"; - } - - @GetMapping("/owners") + }@GetMapping("/owners") public String processFindForm(@RequestParam(defaultValue = "1") int page, Owner owner, BindingResult result, Model model) { @@ -123,9 +116,7 @@ public String processFindForm(@RequestParam(defaultValue = "1") int page, Owner return "redirect:/owners/" + owner.getId(); }// multiple owners found return addPaginationModel(page, model, ownersResults); - } - - @WithSpan + }@WithSpan private String addPaginationModel(int page, Model model, Page paginated) { // throw new RuntimeException(); model.addAttribute("listOwners", paginated); @@ -147,9 +138,7 @@ public String initUpdateOwnerForm(@PathVariable("ownerId") int ownerId, Model mo Owner owner = this.owners.findByIdWithPets(ownerId); model.addAttribute(owner); return VIEWS_OWNER_CREATE_OR_UPDATE_FORM; - } - - private static void delay(long millis) { + }private static void delay(long millis) { try { Thread.sleep(millis); } @@ -180,12 +169,10 @@ public String processUpdateOwnerForm(@Valid Owner owner, BindingResult result, */ @GetMapping("/owners/{ownerId}") public ModelAndView showOwner(@PathVariable("ownerId") int ownerId) { - validator.ValidateUserAccess("admin", "pwd", "fullaccess"); - - ModelAndView mav = new ModelAndView("owners/ownerDetails"); + validator.ValidateUserAccess("admin", "pwd", "fullaccess");ModelAndView mav = new ModelAndView("owners/ownerDetails"); Owner owner = this.owners.findByIdWithPets(ownerId); validator.ValidateOwnerWithExternalService(owner); - int petFactor = 1 / owner.getPets().size(); + int petFactor = (owner.getPets() == null || owner.getPets().size() == 0) ? 1 : 1 / owner.getPets().size(); System.out.println(petFactor); mav.addObject(owner); return mav; @@ -195,10 +182,7 @@ public ModelAndView showOwner(@PathVariable("ownerId") int ownerId) { @ResponseBody public List getOwnerPetsMap(@PathVariable("ownerId") int ownerId) { return this.owners.findPetsByOwnerId(ownerId); - }@Autowired -private OwnerRepository ownerRepository; - -public String getPetsForOwner(Integer ownerId) { + }@Autowiredprivate OwnerRepository ownerRepository;public String getPetsForOwner(Integer ownerId) { Owner owner = ownerRepository.findOwnerWithPets(ownerId) .orElseThrow(() -> new ResourceNotFoundException("Owner not found")); From ed0e5561bad206af01680dcaf86cfbb080601de4 Mon Sep 17 00:00:00 2001 From: Roni Dover Date: Wed, 26 Nov 2025 08:06:01 -0800 Subject: [PATCH 2/2] Fix division by zero error in pet factor calculation Add null check and guard clause to prevent division by zero when owner has no pets, defaulting petFactor to 1 when pets list is empty or null --- .../petclinic/owner/OwnerController.java | 42 +++++++------------ 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java b/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java index 79ba4fac504..60d0fd605c8 100644 --- a/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java +++ b/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java @@ -18,8 +18,7 @@ import java.util.Map; import java.util.stream.Collectors;import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.trace.Span; -import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.api.trace.Tracer;import io.opentelemetry.instrumentation.annotations.WithSpan; +import io.opentelemetry.api.trace.SpanKind;import io.opentelemetry.api.trace.Tracer;import io.opentelemetry.instrumentation.annotations.WithSpan; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -36,10 +35,7 @@ * @author Ken Krebs * @author Arjen Poutsma * @author Michael Isvy - */ -@Controllerclass OwnerController implements InitializingBean {private static final String VIEWS_OWNER_CREATE_OR_UPDATE_FORM = "owners/createOrUpdateOwnerForm"; - - private OwnerValidation validator; + */@Controllerclass OwnerController implements InitializingBean {private static final String VIEWS_OWNER_CREATE_OR_UPDATE_FORM = "owners/createOrUpdateOwnerForm";private OwnerValidation validator; @Autowired private OpenTelemetry openTelemetry; @@ -58,9 +54,7 @@ public void afterPropertiesSet() throws Exception { private final OwnerRepository owners; private final JdbcTemplate jdbcTemplate; - public OwnerController(OwnerRepository clinicService, JdbcTemplate jdbcTemplate - - ) { + public OwnerController(OwnerRepository clinicService, JdbcTemplate jdbcTemplate) { this.owners = clinicService; this.jdbcTemplate = jdbcTemplate; }@InitBinder @@ -78,9 +72,7 @@ public String initCreationForm(Map model) { validator.ValidateUserAccess("admin", "pwd", "fullaccess"); return VIEWS_OWNER_CREATE_OR_UPDATE_FORM; - } - - @PostMapping("/owners/new") + }@PostMapping("/owners/new") public String processCreationForm(@Valid Owner owner, BindingResult result) { if (result.hasErrors()) { return VIEWS_OWNER_CREATE_OR_UPDATE_FORM; @@ -102,9 +94,7 @@ public String processFindForm(@RequestParam(defaultValue = "1") int page, Owner // allow parameterless GET request for /owners to return all records if (owner.getLastName() == null) { owner.setLastName(""); // empty string signifies broadest possible search - } - - // find owners by last name + }// find owners by last name Page ownersResults = findPaginatedForOwnersLastName(page, owner.getLastName()); if (ownersResults.isEmpty()) { // no owners found @@ -125,15 +115,12 @@ private String addPaginationModel(int page, Model model, Page paginated) model.addAttribute("totalPages", paginated.getTotalPages()); model.addAttribute("totalItems", paginated.getTotalElements()); model.addAttribute("listOwners", listOwners); - return "owners/ownersList"; - }@WithSpan() + return "owners/ownersList";}@WithSpan() private Page findPaginatedForOwnersLastName(int page, String lastname) { int pageSize = 5; Pageable pageable = PageRequest.of(page - 1, pageSize); return owners.findByLastNameWithPets(lastname, pageable); - } - - @GetMapping("/owners/{ownerId}/edit") + }@GetMapping("/owners/{ownerId}/edit") public String initUpdateOwnerForm(@PathVariable("ownerId") int ownerId, Model model) { Owner owner = this.owners.findByIdWithPets(ownerId); model.addAttribute(owner); @@ -160,9 +147,7 @@ public String processUpdateOwnerForm(@Valid Owner owner, BindingResult result, }validator.PerformValidationFlow(owner); this.owners.save(owner); return "redirect:/owners/{ownerId}"; - } - - /** + }/** * Custom handler for displaying an owner. * @param ownerId the ID of the owner to display * @return a ModelMap with the model attributes for the view @@ -172,13 +157,16 @@ public ModelAndView showOwner(@PathVariable("ownerId") int ownerId) { validator.ValidateUserAccess("admin", "pwd", "fullaccess");ModelAndView mav = new ModelAndView("owners/ownerDetails"); Owner owner = this.owners.findByIdWithPets(ownerId); validator.ValidateOwnerWithExternalService(owner); - int petFactor = (owner.getPets() == null || owner.getPets().size() == 0) ? 1 : 1 / owner.getPets().size(); + int petFactor; + if (owner.getPets() != null && owner.getPets().size() > 0) { + petFactor = 1 / owner.getPets().size(); + } else { + petFactor = 1; + } System.out.println(petFactor); mav.addObject(owner); return mav; - } - - @GetMapping("/owners/{ownerId}/pets") + }@GetMapping("/owners/{ownerId}/pets") @ResponseBody public List getOwnerPetsMap(@PathVariable("ownerId") int ownerId) { return this.owners.findPetsByOwnerId(ownerId);