From c6a5636ab2f9c888ed6eb6bf05e8a61e7c8fb20a Mon Sep 17 00:00:00 2001 From: Susana Montes Pedreira Date: Mon, 10 Aug 2009 18:38:17 +0200 Subject: [PATCH] ItEr21S09CUIntroducionAvanceUnidadeTraballoItEr20S07: check the children of any orderElement no have other assignment with same advance type --- .../orders/entities/OrderElement.java | 37 +++++++++++++++++-- ...ddAdvanceAssigmentsToOrderElementTest.java | 17 +++++---- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java index dae65276a..70184a904 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java @@ -162,7 +162,10 @@ public abstract class OrderElement extends BaseEntity { throws DuplicateValueTrueReportGlobalAdvanceException, DuplicateAdvanceAssigmentForOrderElementException { checkNoOtherGlobalAdvanceAssignment(newAdvanceAssigment); - checkNoOtherAssignmentWithSameAdvanceType(this, newAdvanceAssigment); + checkAncestorsNoOtherAssignmentWithSameAdvanceType(this, + newAdvanceAssigment); + checkChildrenNoOtherAssignmentWithSameAdvanceType(this, + newAdvanceAssigment); this.advanceAssigments.add(newAdvanceAssigment); } @@ -187,7 +190,7 @@ public abstract class OrderElement extends BaseEntity { * @param newAdvanceAssigment * @throws DuplicateAdvanceAssigmentForOrderElementException */ - private void checkNoOtherAssignmentWithSameAdvanceType( + private void checkAncestorsNoOtherAssignmentWithSameAdvanceType( OrderElement orderElement, AdvanceAssigment newAdvanceAssigment) throws DuplicateAdvanceAssigmentForOrderElementException { for (AdvanceAssigment advanceAssigment : orderElement @@ -200,9 +203,35 @@ public abstract class OrderElement extends BaseEntity { } } if (orderElement.getParent() != null) { - checkNoOtherAssignmentWithSameAdvanceType(orderElement.getParent(), - newAdvanceAssigment); + checkAncestorsNoOtherAssignmentWithSameAdvanceType(orderElement + .getParent(), newAdvanceAssigment); } } + /** + * It checks there are no {@link AdvanceAssigment} with the same type in + * orderElement and its children + * @param orderElement + * @param newAdvanceAssigment + * @throws DuplicateAdvanceAssigmentForOrderElementException + */ + private void checkChildrenNoOtherAssignmentWithSameAdvanceType( + OrderElement orderElement, AdvanceAssigment newAdvanceAssigment) + throws DuplicateAdvanceAssigmentForOrderElementException { + for (AdvanceAssigment advanceAssigment : orderElement + .getAdvanceAssigments()) { + if (AdvanceType.equivalentInDB(advanceAssigment.getAdvanceType(), + newAdvanceAssigment.getAdvanceType())) { + throw new DuplicateAdvanceAssigmentForOrderElementException( + "Duplicate Advance Assigment For Order Element", this, + OrderElement.class); + } + } + if (!orderElement.getChildren().isEmpty()) { + for (OrderElement child : orderElement.getChildren()) { + checkChildrenNoOtherAssignmentWithSameAdvanceType(child, + newAdvanceAssigment); + } + } + } } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/AddAdvanceAssigmentsToOrderElementTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/AddAdvanceAssigmentsToOrderElementTest.java index a332df24a..70bef9e92 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/AddAdvanceAssigmentsToOrderElementTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/AddAdvanceAssigmentsToOrderElementTest.java @@ -372,13 +372,13 @@ public class AddAdvanceAssigmentsToOrderElementTest { } /** - * Trying define an AdvanceAssigment object when any grandfather of - * OrderElement with an AdvanceAssigment object that has the same - * AdvanceType Expected: It must throw - * DuplicateAdvanceAssigmentForOrderElementException Exception. + * Trying define an AdvanceAssigment object when any child of OrderElement + * with an AdvanceAssigment object that has the same AdvanceType Expected: + * It must throw DuplicateAdvanceAssigmentForOrderElementException + * Exception. **/ @Test - public void testSetAdvanceAssigmentOrdeElementGrandSonIllegal() { + public void testSetAdvanceAssigmentOrdeElementParentIllegal() { final Order order = createValidOrder(); final OrderElement[] containers = new OrderLineGroup[2]; for (int i = 0; i < containers.length; i++) { @@ -416,21 +416,22 @@ public class AddAdvanceAssigmentsToOrderElementTest { orderDao.save(order); try { - container.addAvanceAssigment(advanceAssigmentA); + orderLineGranSon.addAvanceAssigment(advanceAssigmentA); } catch (Exception e) { fail("It should not throw an exception "); } - assertThat(container.getAdvanceAssigments().size(), equalTo(1)); + assertThat(orderLineGranSon.getAdvanceAssigments().size(), equalTo(1)); try { - orderLineGranSon.addAvanceAssigment(advanceAssigmentB); + container.addAvanceAssigment(advanceAssigmentB); fail("It should throw an exception "); } catch (Exception e) { // Ok } } + @Test(expected = DuplicateAdvanceAssigmentForOrderElementException.class) public void addingAnotherAdvanceAssigmentWithAnEquivalentTypeButDifferentInstance() throws DuplicateValueTrueReportGlobalAdvanceException,