ItEr49S11CUEngadirModeloTraballoAOrganizacionTraballoItEr48S12: Fix bug propagate IndirectCriterions in HoursGroup for OrderLines

This commit is contained in:
Diego Pino Garcia 2010-02-23 13:27:36 +01:00 committed by Javier Moran Rua
parent bd9222912b
commit f176adce21
3 changed files with 94 additions and 10 deletions

View file

@ -259,12 +259,18 @@ public abstract class CriterionRequirementHandler<T, S, R> implements
protected abstract List<T> 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<IndirectCriterionRequirement> currents) {
for (DirectCriterionRequirement direct : getDirectCriterionRequirement(orderElement)) {
@ -561,7 +567,7 @@ public abstract class CriterionRequirementHandler<T, S, R> implements
* attribute
*
*/
public void copyIndirectCriterionRequirementFromOriginalToOrderLineGroupChildren(
public void propagateIndirectCriterionRequirementsForOrderLineGroupKeepingValid(
R orderLineGroup,
DirectCriterionRequirement parent) {

View file

@ -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<Criterion, Boolean> mapCriterionToValid = createCriterionToValidMap(origin
.getIndirectCriterionRequirement());
for (CriterionRequirement each : criterionRequirements) {
if (each instanceof IndirectCriterionRequirement) {
IndirectCriterionRequirement indirect = (IndirectCriterionRequirement) each;
indirect.setValid(mapCriterionToValid.get(each.getCriterion()));
}
}
}
private Map<Criterion, Boolean> createCriterionToValidMap(
Set<IndirectCriterionRequirement> indirects) {
Map<Criterion, Boolean> result = new HashMap<Criterion, Boolean>();
for (IndirectCriterionRequirement each : indirects) {
result.put(each.getCriterion(), each.isValid());
}
return result;
}
private Set<CriterionRequirement> getCriterionRequirementsFromParent() {
return (parentOrderLine != null) ? parentOrderLine
.getCriterionRequirements() : orderLineTemplate

View file

@ -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<OrderElementTemplate> 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();