The resource type is taking into account when grouping.

This commit is contained in:
Óscar González Fernández 2009-12-13 16:08:10 +01:00
parent 7520dad3ff
commit 568acf930b
2 changed files with 89 additions and 18 deletions

View file

@ -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 <br />
@ -38,6 +41,54 @@ import org.navalplanner.business.resources.entities.Criterion;
*/
public class AggregatedHoursGroup {
private static class GroupingCriteria {
private static Map<GroupingCriteria, List<HoursGroup>> byCriterions(
Collection<? extends HoursGroup> hours) {
Map<GroupingCriteria, List<HoursGroup>> result = new HashMap<GroupingCriteria, List<HoursGroup>>();
for (HoursGroup each : hours) {
GroupingCriteria key = asGroupingCriteria(each);
if (!result.containsKey(key)) {
result.put(key,
new ArrayList<HoursGroup>());
}
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<Criterion> criterions;
private GroupingCriteria(ResourceEnum type, Set<Criterion> 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<AggregatedHoursGroup> aggregate(HoursGroup... hours) {
return aggregate(Arrays.asList(hours));
}
@ -45,7 +96,8 @@ public class AggregatedHoursGroup {
public static List<AggregatedHoursGroup> aggregate(
Collection<? extends HoursGroup> hours) {
List<AggregatedHoursGroup> result = new ArrayList<AggregatedHoursGroup>();
for (Entry<Set<Criterion>, List<HoursGroup>> entry : byCriterions(hours)
for (Entry<GroupingCriteria, List<HoursGroup>> 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<Set<Criterion>, List<HoursGroup>> byCriterions(
Collection<? extends HoursGroup> hours) {
Map<Set<Criterion>, List<HoursGroup>> result = new HashMap<Set<Criterion>, List<HoursGroup>>();
for (HoursGroup each : hours) {
if (!result.containsKey(each.getValidCriterions())) {
result.put(each.getValidCriterions(),
new ArrayList<HoursGroup>());
}
result.get(each.getValidCriterions()).add(each);
}
return result;
}
private final Set<Criterion> criterions;
private final List<HoursGroup> hoursGroup;
private AggregatedHoursGroup(Set<Criterion> criterions,
private ResourceEnum resourceType;
private AggregatedHoursGroup(GroupingCriteria groupingCriteria,
List<HoursGroup> hours) {
this.criterions = Collections.unmodifiableSet(criterions);
this.criterions = Collections
.unmodifiableSet(groupingCriteria.criterions);
this.hoursGroup = Collections.unmodifiableList(hours);
this.resourceType = groupingCriteria.type;
}
public Set<Criterion> 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) {

View file

@ -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 <ogonzalez@igalia.com>
@ -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<AggregatedHoursGroup> 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<AggregatedHoursGroup> {
@ -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;
}