diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/CriterionRequirementHandler.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/CriterionRequirementHandler.java index c0f561acf..2649ea8a3 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/CriterionRequirementHandler.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/CriterionRequirementHandler.java @@ -259,12 +259,18 @@ public abstract class CriterionRequirementHandler implements protected abstract List getChildren(T orderElement); - private void updateCriterionRequirementsIntoOrderLine(S orderLine) { + public void updateCriterionRequirementsIntoOrderLine(S orderLine) { for (HoursGroup hoursGroup : getHoursGroups(orderLine)) { hoursGroup.updateMyCriterionRequirements(); } } + public void propagateIndirectCriterionRequirementsKeepingValid(S orderLine) { + for (HoursGroup hoursGroup : getHoursGroups(orderLine)) { + hoursGroup.propagateIndirectCriterionRequirementsKeepingValid(); + } + } + void transformDirectToIndirectIfNeeded(T orderElement, Set currents) { for (DirectCriterionRequirement direct : getDirectCriterionRequirement(orderElement)) { @@ -561,7 +567,7 @@ public abstract class CriterionRequirementHandler implements * attribute * */ - public void copyIndirectCriterionRequirementFromOriginalToOrderLineGroupChildren( + public void propagateIndirectCriterionRequirementsForOrderLineGroupKeepingValid( R orderLineGroup, DirectCriterionRequirement parent) { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/HoursGroup.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/HoursGroup.java index 89301b540..bfa130344 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/HoursGroup.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/HoursGroup.java @@ -24,7 +24,9 @@ import static org.navalplanner.business.i18n.I18nHelper._; import java.math.BigDecimal; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; import java.util.UUID; @@ -319,6 +321,31 @@ public class HoursGroup extends BaseEntity implements Cloneable, criterionRequirementHandler.addNewsIndirects(this, currentIndirects); } + public void propagateIndirectCriterionRequirementsKeepingValid() { + updateMyCriterionRequirements(); + + // Set valid value as original value for every indirect + Map mapCriterionToValid = createCriterionToValidMap(origin + .getIndirectCriterionRequirement()); + + for (CriterionRequirement each : criterionRequirements) { + if (each instanceof IndirectCriterionRequirement) { + IndirectCriterionRequirement indirect = (IndirectCriterionRequirement) each; + indirect.setValid(mapCriterionToValid.get(each.getCriterion())); + } + } + } + + private Map createCriterionToValidMap( + Set indirects) { + Map result = new HashMap(); + + for (IndirectCriterionRequirement each : indirects) { + result.put(each.getCriterion(), each.isValid()); + } + return result; + } + private Set getCriterionRequirementsFromParent() { return (parentOrderLine != null) ? parentOrderLine .getCriterionRequirements() : orderLineTemplate diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderLineGroupTemplate.java b/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderLineGroupTemplate.java index 3b5be13a7..b494f66e2 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderLineGroupTemplate.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderLineGroupTemplate.java @@ -28,10 +28,12 @@ import org.navalplanner.business.i18n.I18nHelper; import org.navalplanner.business.orders.entities.CriterionRequirementOrderElementHandler; import org.navalplanner.business.orders.entities.HoursGroup; import org.navalplanner.business.orders.entities.OrderElement; +import org.navalplanner.business.orders.entities.OrderLine; import org.navalplanner.business.orders.entities.OrderLineGroup; import org.navalplanner.business.orders.entities.SchedulingState; import org.navalplanner.business.orders.entities.TreeNodeOnListWithSchedulingState; import org.navalplanner.business.requirements.entities.DirectCriterionRequirement; +import org.navalplanner.business.requirements.entities.IndirectCriterionRequirement; import org.navalplanner.business.trees.ITreeParentNode; /** @@ -103,14 +105,40 @@ public class OrderLineGroupTemplate extends OrderElementTemplate implements List result = buildChildrenTemplates(beingBuilt, group.getChildren()); beingBuilt.children = result; - beingBuilt.copyIndirectRequirementsFromOriginalDirectRequirements(); + beingBuilt.propagateIndirectCriterionRequirements(); return beingBuilt; } - public void copyIndirectRequirementsFromOriginalDirectRequirements() { - for (DirectCriterionRequirement each: getDirectCriterionRequirements()) { + /** + * Propagates {@link IndirectCriterionRequirement} for order to template, + * preserving the original value of 'valid' field + * + * This method is meant to be used the first time an + * {@link OrderElementTemplate} was created out from an {@link OrderElement} + * and it's needed to propagate its criteria while preserving the original + * value of 'valid' field in {@link IndirectCriterionRequirement} + */ + private void propagateIndirectCriterionRequirements() { + propagateIndirectCriterionRequirementsForOrderLineGroup(this); + propagateIndirectCriterionRequirementsForOrderLines(this); + } + + private void propagateIndirectCriterionRequirementsForOrderLineGroup( + OrderLineGroupTemplate orderLineGroup) { + for (DirectCriterionRequirement each : getDirectCriterionRequirements()) { criterionRequirementTemplateHandler - .copyIndirectCriterionRequirementFromOriginalToOrderLineGroupChildren(this, each); + .propagateIndirectCriterionRequirementsForOrderLineGroupKeepingValid( + orderLineGroup, each); + } + } + + private void propagateIndirectCriterionRequirementsForOrderLines( + OrderLineGroupTemplate orderLineGroup) { + for (OrderElementTemplate each : orderLineGroup.getChildren()) { + if (each instanceof OrderLineTemplate) { + criterionRequirementTemplateHandler + .propagateIndirectCriterionRequirementsKeepingValid((OrderLineTemplate) each); + } } } @@ -198,17 +226,40 @@ public class OrderLineGroupTemplate extends OrderElementTemplate implements for (OrderElementTemplate each : children) { each.createElement(parent); } - copyIndirectCriterionRequirementFromOriginalToOrderLineGroupChildren(parent); + propagateIndirectCriterionRequirements(parent); return parent; } - private void copyIndirectCriterionRequirementFromOriginalToOrderLineGroupChildren(OrderLineGroup orderElement) { - for (DirectCriterionRequirement each: orderElement.getDirectCriterionRequirement()) { - criterionRequirementOrderElementHandler.copyIndirectCriterionRequirementFromOriginalToOrderLineGroupChildren( + /** + * Propagates {@link IndirectCriterionRequirement} from template to order, + * preserving the original value of 'valid' field + */ + private void propagateIndirectCriterionRequirements(OrderLineGroup orderLineGroup) { + propagateIndirectCriterionRequirementsForOrderLineGroup(orderLineGroup); + propagateIndirectCriterionRequirementsForOrderLines(orderLineGroup); + } + + private void propagateIndirectCriterionRequirementsForOrderLineGroup( + OrderLineGroup orderElement) { + + for (DirectCriterionRequirement each : orderElement + .getDirectCriterionRequirement()) { + criterionRequirementOrderElementHandler + .propagateIndirectCriterionRequirementsForOrderLineGroupKeepingValid( orderElement, each); } } + private void propagateIndirectCriterionRequirementsForOrderLines( + OrderLineGroup orderLineGroup) { + for (OrderElement each : orderLineGroup.getChildren()) { + if (each instanceof OrderLine) { + criterionRequirementOrderElementHandler + .propagateIndirectCriterionRequirementsKeepingValid((OrderLine) each); + } + } + } + @Override public OrderLineGroup createElement() { OrderLineGroup orderLineGroup = OrderLineGroup.create();