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 extends HoursGroup> 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 extends HoursGroup> 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 extends HoursGroup> 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;
}