From 36bbea7e18c867e57311512ba4efdad28aca397f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= Date: Wed, 2 Dec 2009 20:58:33 +0100 Subject: [PATCH] ItEr36S14CUAdministracionCategoriaCosteItEr35S15: added validation for negative time intervals in HourCost entity I have implemented entity-level validation using hibernate validators, and interface-level validation using ZK constraints modified dinamically in the onChange event. --- .../costcategories/entities/HourCost.java | 9 +++++++++ .../costcategories/daos/HourCostDAOTest.java | 10 ++++++++++ .../CostCategoryCRUDController.java | 19 ++++++++++++++++++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/HourCost.java b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/HourCost.java index 4a6262fd5..38927c3e6 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/HourCost.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/HourCost.java @@ -22,6 +22,7 @@ package org.navalplanner.business.costcategories.entities; import java.math.BigDecimal; +import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotNull; import org.joda.time.LocalDate; import org.navalplanner.business.common.BaseEntity; @@ -107,4 +108,12 @@ public class HourCost extends BaseEntity { if(category!=null && !category.getHourCosts().contains(this)) category.addHourCost(this); } + + @AssertTrue(message="The end date cannot be before the init date") + public boolean PositiveTimeInterval() { + if (endDate == null) { + return true; + } + return (endDate.isAfter(initDate) || initDate.equals(endDate)); + } } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/costcategories/daos/HourCostDAOTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/costcategories/daos/HourCostDAOTest.java index 70a8ca848..8cb0cee2f 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/costcategories/daos/HourCostDAOTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/costcategories/daos/HourCostDAOTest.java @@ -35,6 +35,7 @@ import org.joda.time.LocalDate; import org.junit.Test; import org.junit.runner.RunWith; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.costcategories.daos.ICostCategoryDAO; import org.navalplanner.business.costcategories.daos.IHourCostDAO; import org.navalplanner.business.costcategories.daos.ITypeOfWorkHoursDAO; @@ -137,4 +138,13 @@ public class HourCostDAOTest { assertFalse(costCategory1.getHourCosts().contains(hourCost)); assertTrue(costCategory2.getHourCosts().contains(hourCost)); } + + @Test(expected=ValidationException.class) + public void testPositiveTimeInterval() { + HourCost hourCost = createValidHourCost(); + hourCost.setInitDate(new LocalDate(2000,12,31)); + hourCost.setEndDate(new LocalDate(2000,12,1)); + + hourCostDAO.save(hourCost); + } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/CostCategoryCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/CostCategoryCRUDController.java index 15e81eb2f..2fe7f7410 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/CostCategoryCRUDController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/CostCategoryCRUDController.java @@ -303,11 +303,25 @@ public class CostCategoryCRUDController extends GenericForwardComposer * * @param row */ - private void appendDateboxInitDate(Row row) { + private void appendDateboxInitDate(final Row row) { Datebox initDateBox = new Datebox(); initDateBox.setConstraint("no empty:" + _("The init date cannot be empty")); bindDateboxInitDate(initDateBox, (HourCost) row.getValue()); row.appendChild(initDateBox); + + initDateBox.addEventListener("onChange", new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + // Updates the constraint of the endDate box with the new date + LocalDate initDate = ((HourCost)row.getValue()).getInitDate(); + Datebox endDateBox = (Datebox) row.getChildren().get(3); + endDateBox.setConstraint("after " + initDate.getYear() + + initDate.getMonthOfYear() + initDate.getDayOfMonth()); + + Util.reloadBindings(listHourCosts); + } + }); } /** @@ -352,6 +366,9 @@ public class CostCategoryCRUDController extends GenericForwardComposer */ private void appendDateboxEndDate(Row row) { Datebox endDateBox = new Datebox(); + LocalDate initDate = ((HourCost)row.getValue()).getInitDate(); + endDateBox.setConstraint("after " + initDate.getYear() + + initDate.getMonthOfYear() + initDate.getDayOfMonth()); bindDateboxEndDate(endDateBox, (HourCost) row.getValue()); row.appendChild(endDateBox); }