From 65fcc3e0f153da93a1895135441f8bb3d077c1bc Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Mon, 26 Mar 2012 10:39:15 +0200 Subject: [PATCH] Add a map in MoneyCostCalculator to cache calculated values This prevents to recalculate money cost when it was already calculated before. The map with the cached values is reseted every time you enter in a project (when PlanningState is created). FEA: ItEr76S17MoneyCostMonitoringSystem --- .../entities/IMoneyCostCalculator.java | 6 +++ .../planner/entities/MoneyCostCalculator.java | 42 +++++++++++++++---- .../planner/order/PlanningStateCreator.java | 7 ++++ 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/IMoneyCostCalculator.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/IMoneyCostCalculator.java index 2f6f21230..21d1a9ea2 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/IMoneyCostCalculator.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/IMoneyCostCalculator.java @@ -50,4 +50,10 @@ public interface IMoneyCostCalculator { */ BigDecimal getMoneyCost(OrderElement orderElement); + /** + * Resets the map used to save cached values of money cost for each + * {@link OrderElement} + */ + void resetMoneyCostMap(); + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/MoneyCostCalculator.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/MoneyCostCalculator.java index 6089c2e13..38129f43a 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/MoneyCostCalculator.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/MoneyCostCalculator.java @@ -21,7 +21,9 @@ package org.libreplan.business.planner.entities; import java.math.BigDecimal; import java.math.RoundingMode; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.libreplan.business.costcategories.daos.IHourCostDAO; import org.libreplan.business.orders.entities.OrderElement; @@ -33,17 +35,16 @@ import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; /** - * Class to calculate the money cost of a {@link TaskElement}. + * Class to calculate the money cost of a {@link TaskElement}.
* * Money cost is calculated checking the hours reported for that task and using - * the cost category of each resource in the different dates. + * the cost category of each resource in the different dates.
+ * + * Money cost is stored in a map that will be cached in memeroy. This map could + * be reseted when needed with method {@code resetMoneyCostMap}. * * @author Manuel Rego Casasnovas */ -/** - * @author mrego - * - */ @Component @Scope(BeanDefinition.SCOPE_SINGLETON) public class MoneyCostCalculator implements IMoneyCostCalculator { @@ -54,10 +55,35 @@ public class MoneyCostCalculator implements IMoneyCostCalculator { @Autowired private IHourCostDAO hourCostDAO; + private Map moneyCostMap = new HashMap(); + + @Override + public void resetMoneyCostMap() { + moneyCostMap = new HashMap(); + } + @Override public BigDecimal getMoneyCost(OrderElement orderElement) { + BigDecimal result = moneyCostMap.get(orderElement); + if (result != null) { + return result; + } + + result = BigDecimal.ZERO.setScale(2); + for (OrderElement each : orderElement.getChildren()) { + result = result.add(getMoneyCost(each)); + } + + result = result.add(getMoneyCostFromOwnWorkReportLines(orderElement)) + .setScale(2, RoundingMode.HALF_UP); + + moneyCostMap.put(orderElement, result); + return result; + } + + private BigDecimal getMoneyCostFromOwnWorkReportLines(OrderElement orderElement) { List workReportLines = workReportLineDAO - .findByOrderElementAndChildren(orderElement, false); + .findByOrderElement(orderElement); BigDecimal result = BigDecimal.ZERO.setScale(2); for (WorkReportLine workReportLine : workReportLines) { @@ -78,7 +104,7 @@ public class MoneyCostCalculator implements IMoneyCostCalculator { result = result.add(cost); } - return result.setScale(2, RoundingMode.HALF_UP); + return result; } /** diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/PlanningStateCreator.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/PlanningStateCreator.java index f5dec3374..ff8af3495 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/PlanningStateCreator.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/PlanningStateCreator.java @@ -55,6 +55,7 @@ import org.libreplan.business.planner.entities.DayAssignment; import org.libreplan.business.planner.entities.Dependency; import org.libreplan.business.planner.entities.DerivedAllocation; import org.libreplan.business.planner.entities.GenericResourceAllocation; +import org.libreplan.business.planner.entities.IMoneyCostCalculator; import org.libreplan.business.planner.entities.ResourceAllocation; import org.libreplan.business.planner.entities.ResourceAllocation.IVisitor; import org.libreplan.business.planner.entities.SpecificResourceAllocation; @@ -171,6 +172,9 @@ public class PlanningStateCreator { @Autowired private IOrderAuthorizationDAO orderAuthorizationDAO; + @Autowired + private IMoneyCostCalculator moneyCostCalculator; + void synchronizeWithSchedule(Order order, IOptionalPersistence persistence) { List synchronizationsNeeded = order .calculateSynchronizationsNeeded(); @@ -274,6 +278,9 @@ public class PlanningStateCreator { currentScenario); forceLoadOfWorkingHours(result.getInitial()); + + moneyCostCalculator.resetMoneyCostMap(); + return result; }