diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/AggregatedHoursGroup.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/AggregatedHoursGroup.java index 6731360e1..4279d291e 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/AggregatedHoursGroup.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/AggregatedHoursGroup.java @@ -30,7 +30,10 @@ import java.util.Set; import java.util.Map.Entry; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; import org.navalplanner.business.resources.entities.Criterion; +import org.navalplanner.business.resources.entities.ResourceEnum; /** * A collection of HoursGroup with the same name required
@@ -38,6 +41,54 @@ import org.navalplanner.business.resources.entities.Criterion; */ public class AggregatedHoursGroup { + private static class GroupingCriteria { + + private static Map> byCriterions( + Collection hours) { + Map> result = new HashMap>(); + for (HoursGroup each : hours) { + GroupingCriteria key = asGroupingCriteria(each); + if (!result.containsKey(key)) { + result.put(key, + new ArrayList()); + } + result.get(key).add(each); + } + return result; + } + + private static GroupingCriteria asGroupingCriteria(HoursGroup hoursGroup) { + return new GroupingCriteria(hoursGroup.getResourceType(), + hoursGroup.getValidCriterions()); + } + + private final ResourceEnum type; + + private final Set criterions; + + private GroupingCriteria(ResourceEnum type, Set criterions) { + this.type = type; + this.criterions = criterions; + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(type).append(criterions) + .toHashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof GroupingCriteria) { + GroupingCriteria other = (GroupingCriteria) obj; + return new EqualsBuilder().append(type, other.type).append( + criterions, + other.criterions).isEquals(); + } + return false; + } + } + public static List aggregate(HoursGroup... hours) { return aggregate(Arrays.asList(hours)); } @@ -45,7 +96,8 @@ public class AggregatedHoursGroup { public static List aggregate( Collection hours) { List result = new ArrayList(); - for (Entry, List> entry : byCriterions(hours) + for (Entry> entry : GroupingCriteria + .byCriterions(hours) .entrySet()) { result.add(new AggregatedHoursGroup(entry.getKey(), entry .getValue())); @@ -61,27 +113,19 @@ public class AggregatedHoursGroup { return result; } - private static Map, List> byCriterions( - Collection hours) { - Map, List> result = new HashMap, List>(); - for (HoursGroup each : hours) { - if (!result.containsKey(each.getValidCriterions())) { - result.put(each.getValidCriterions(), - new ArrayList()); - } - result.get(each.getValidCriterions()).add(each); - } - return result; - } - private final Set criterions; private final List hoursGroup; - private AggregatedHoursGroup(Set criterions, + private ResourceEnum resourceType; + + + private AggregatedHoursGroup(GroupingCriteria groupingCriteria, List hours) { - this.criterions = Collections.unmodifiableSet(criterions); + this.criterions = Collections + .unmodifiableSet(groupingCriteria.criterions); this.hoursGroup = Collections.unmodifiableList(hours); + this.resourceType = groupingCriteria.type; } public Set getCriterions() { @@ -92,6 +136,10 @@ public class AggregatedHoursGroup { return hoursGroup; } + public ResourceEnum getResourceType() { + return resourceType; + } + public int getHours() { int result = 0; for (HoursGroup each : hoursGroup) { diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/AggregatedHoursGroupTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/AggregatedHoursGroupTest.java index 4bf4b893f..889635297 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/AggregatedHoursGroupTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/AggregatedHoursGroupTest.java @@ -40,6 +40,7 @@ import org.navalplanner.business.orders.entities.HoursGroup; import org.navalplanner.business.requirements.entities.CriterionRequirement; import org.navalplanner.business.requirements.entities.DirectCriterionRequirement; import org.navalplanner.business.resources.entities.Criterion; +import org.navalplanner.business.resources.entities.ResourceEnum; /** * @author Óscar González Fernández @@ -95,6 +96,23 @@ public class AggregatedHoursGroupTest { assertThat(AggregatedHoursGroup.sum(list), equalTo(15)); } + @Test + @SuppressWarnings("unchecked") + public void theResourceTypeIsTakingIntoAccountWhenGrouping() { + HoursGroup h1 = createHoursGroupWithCriterions(ResourceEnum.MACHINE, criterion1, + criterion2); + h1.setWorkingHours(10); + HoursGroup h2 = createHoursGroupWithCriterions(ResourceEnum.WORKER, + criterion1, criterion2); + h1.setWorkingHours(5); + List aggregate = AggregatedHoursGroup.aggregate(h1,h2); + assertThat(aggregate.size(), equalTo(2)); + assertThat(aggregate, hasItem(allOf(withCriterions(criterion1, + criterion2), withHours(h1)))); + assertThat(aggregate, hasItem(allOf(withCriterions(criterion1, + criterion2), withHours(h2)))); + } + private static abstract class AggregatedHoursGroupMatcher extends BaseMatcher { @@ -149,9 +167,14 @@ public class AggregatedHoursGroupTest { } private HoursGroup createHoursGroupWithCriterions(Criterion... criterions) { + return createHoursGroupWithCriterions(ResourceEnum.WORKER, criterions); + } + + private HoursGroup createHoursGroupWithCriterions( + ResourceEnum resourceType, Criterion... criterions) { HoursGroup result = new HoursGroup(); - result - .setCriterionRequirements(asCriterionRequirements(criterions)); + result.setCriterionRequirements(asCriterionRequirements(criterions)); + result.setResourceType(resourceType); return result; }