From 9bc2b40cfd5ef95066ec47b21b0d4e669cb82e59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Mon, 25 Apr 2011 18:54:44 +0200 Subject: [PATCH] [Bug #1012] Fix bug at resource load Criterion parents were not considered. FEA: ItEr74S04BugFixing --- .../planner/daos/ResourceAllocationDAO.java | 80 +++++++++++++++---- .../resources/entities/Criterion.java | 26 ++++++ .../web/resourceload/ResourceLoadModel.java | 2 +- 3 files changed, 90 insertions(+), 18 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ResourceAllocationDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ResourceAllocationDAO.java index ebc7aa2f5..24e231964 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ResourceAllocationDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ResourceAllocationDAO.java @@ -164,19 +164,16 @@ public class ResourceAllocationDAO extends return result; } - @SuppressWarnings("unchecked") @Override public Map> findGenericAllocationsByCriterion() { - List results = getSession() + Query query = getSession() .createQuery( "select generic, criterion " + "from GenericResourceAllocation as generic " - + "join generic.criterions as criterion") - .list(); - return stripAllocationsWithoutAssignations(byCriterion(results)); + + "join generic.criterions as criterion"); + return toCriterionMapFrom(query); } - @SuppressWarnings("unchecked") @Override public Map> findGenericAllocationsByCriterion( Date intervalFilterStartDate, Date intervalFilterEndDate) { @@ -207,42 +204,39 @@ public class ResourceAllocationDAO extends q.setParameter("intervalFilterEndDate", LocalDate.fromDateFields(intervalFilterEndDate)); } - return stripAllocationsWithoutAssignations(byCriterion(q.list())); + return toCriterionMapFrom(q); } - @SuppressWarnings("unchecked") @Override public Map> findGenericAllocationsByCriterionFor( List tasks) { if (tasks.isEmpty()) { return new HashMap>(); } - List list = getSession().createQuery( + Query query = getSession().createQuery( "select generic, criterion " + "from GenericResourceAllocation as generic " + "join generic.criterions as criterion " + "join generic.task task where task in(:tasks)") - .setParameterList("tasks", tasks).list(); - return stripAllocationsWithoutAssignations(byCriterion(list)); + .setParameterList("tasks", tasks); + return toCriterionMapFrom(query); } - @SuppressWarnings("unchecked") @Override public Map> findGenericAllocationsBySomeCriterion( List criterions) { if (criterions.isEmpty()) { return new HashMap>(); } - List list = getSession().createQuery( + Query query = getSession().createQuery( "select generic, criterion " + "from GenericResourceAllocation as generic " + "join generic.criterions as criterion " + "where criterion in(:criterions)").setParameterList( - "criterions", criterions).list(); - return stripAllocationsWithoutAssignations(byCriterion(list)); + "criterions", criterions); + return toCriterionMapFrom(query); } - @SuppressWarnings("unchecked") @Override public Map> findGenericAllocationsBySomeCriterion( List criterions, Date intervalFilterStartDate, Date intervalFilterEndDate) { @@ -273,7 +267,13 @@ public class ResourceAllocationDAO extends q.setParameter("intervalFilterEndDate", LocalDate.fromDateFields(intervalFilterEndDate)); } - return stripAllocationsWithoutAssignations(byCriterion(q.list())); + return toCriterionMapFrom(q); + } + + @SuppressWarnings("unchecked") + private Map> toCriterionMapFrom(Query query){ + return addParents(stripAllocationsWithoutAssignations(byCriterion(query + .list()))); } private Map> byCriterion( @@ -302,6 +302,52 @@ public class ResourceAllocationDAO extends return (Criterion) elements[1]; } + private Map> addParents( + Map> byCriterion) { + Map> toBeMerged = new HashMap>(); + + for (Entry> each : byCriterion + .entrySet()) { + Criterion criterion = each.getKey(); + for (Criterion parent : getParentsFrom(criterion)) { + List childAllocations = each + .getValue(); + addToCriterion(toBeMerged, parent, childAllocations); + } + } + return mergeTo(byCriterion, toBeMerged); + } + + private void addToCriterion( + Map> map, + Criterion criterion, List toAdd) { + if (!map.containsKey(criterion)) { + map.put(criterion, + new ArrayList()); + } + map.get(criterion).addAll(toAdd); + } + + private Map> mergeTo( + Map> byCriterion, + Map> toMerge) { + for (Entry> each : toMerge + .entrySet()) { + addToCriterion(byCriterion, each.getKey(), each.getValue()); + } + return byCriterion; + } + + private List getParentsFrom(Criterion criterion) { + List result = new ArrayList(); + Criterion current = criterion.getParent(); + while (current != null) { + result.add(current); + current = current.getParent(); + } + return result; + } + @Override public List getSpecificAssignmentsBetween( Collection relatedToOne, LocalDate start, LocalDate end) { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Criterion.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Criterion.java index a81d6ef0f..455d18708 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Criterion.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Criterion.java @@ -100,6 +100,21 @@ public class Criterion extends IntegrationEntity implements ICriterion { } }; + public static final Comparator byInclusion = new Comparator() { + + @Override + public int compare(Criterion o1, Criterion o2) { + if (o1.isEquivalent(o2)) { + return 0; + } + if (o1.includes(o2)) { + return -1; + } else { + return 1; + } + } + }; + public static List sortByName( Collection criterions) { List result = new ArrayList(criterions); @@ -116,6 +131,17 @@ public class Criterion extends IntegrationEntity implements ICriterion { return result; } + @SuppressWarnings("unchecked") + public static List sortByInclusionTypeAndName( + Collection criterions) { + List result = new ArrayList(criterions); + Collections.sort( + result, + ComparatorUtils.chainedComparator(new Comparator[] { + byInclusion, byType, byName })); + return result; + } + /** * Returns a string of criterion names separated by comma * @deprecated use {@link #getCaptionFor(ResourceEnum, Collection)} instead diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/ResourceLoadModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/ResourceLoadModel.java index c75a5c02a..14a28cdda 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/ResourceLoadModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/ResourceLoadModel.java @@ -239,7 +239,7 @@ public class ResourceLoadModel implements IResourceLoadModel { return withAssociatedSpecific(findAllocationsGroupedByCriteria(criteriaToShowList)); } Map> result = findAllocationsByCriterion(); - allCriteriaList = Criterion.sortByTypeAndName(result.keySet()); + allCriteriaList = Criterion.sortByInclusionTypeAndName(result.keySet()); if (pageFilterPosition == -1) { return withAssociatedSpecific(result); }