From 0413e0b3e17d1fa80c814e5ce86a910ae58df9a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Mon, 14 Feb 2011 14:19:51 +0100 Subject: [PATCH] Avoid having Orders as proxies It can cause ClassCastExceptions when doing orderElement.getOrder FEA: AnA08S10Reports --- .../workreports/daos/IWorkReportDAO.java | 2 + .../workreports/daos/WorkReportDAO.java | 49 +++++++++++++++++++ .../web/workreports/WorkReportModel.java | 14 +++++- 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/workreports/daos/IWorkReportDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/workreports/daos/IWorkReportDAO.java index 2b21e4e83..d6e43d72c 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/workreports/daos/IWorkReportDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/workreports/daos/IWorkReportDAO.java @@ -38,4 +38,6 @@ public interface IWorkReportDAO extends IIntegrationEntityDAO { List getAll(); + List allWorkReportsWithAssociatedOrdersUnproxied(); + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/workreports/daos/WorkReportDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/workreports/daos/WorkReportDAO.java index 97449cdb4..12bea6d72 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/workreports/daos/WorkReportDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/workreports/daos/WorkReportDAO.java @@ -21,13 +21,22 @@ package org.navalplanner.business.workreports.daos; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.hibernate.Criteria; +import org.hibernate.Query; import org.hibernate.criterion.Restrictions; +import org.navalplanner.business.common.IAdHocTransactionService; +import org.navalplanner.business.common.IOnTransaction; import org.navalplanner.business.common.daos.IntegrationEntityDAO; +import org.navalplanner.business.orders.daos.IOrderDAO; +import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.workreports.entities.WorkReport; import org.navalplanner.business.workreports.entities.WorkReportType; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; @@ -42,6 +51,12 @@ import org.springframework.stereotype.Repository; public class WorkReportDAO extends IntegrationEntityDAO implements IWorkReportDAO { + @Autowired + private IAdHocTransactionService adHocTransactionService; + + @Autowired + private IOrderDAO orderDAO; + @SuppressWarnings("unchecked") @Override public List getAllByWorkReportType(WorkReportType workReportType) { @@ -54,4 +69,38 @@ public class WorkReportDAO extends IntegrationEntityDAO return list(WorkReport.class); } + @Override + public List allWorkReportsWithAssociatedOrdersUnproxied() { + forceOrdersUnproxied(); + return list(WorkReport.class); + } + + private void forceOrdersUnproxied() { + List elements = adHocTransactionService + .runOnAnotherReadOnlyTransaction(new IOnTransaction>() { + + @Override + public List execute() { + return getOrderElementsAssociatedWithWorkReports(); + } + }); + orderDAO.loadOrdersAvoidingProxyFor(elements); + } + + private List getOrderElementsAssociatedWithWorkReports() { + Set result = new HashSet(); + result.addAll(elementsFrom(getSession().createQuery( + "select w.orderElement from WorkReport w"))); + result + .addAll(elementsFrom(getSession() + .createQuery( + "select line.orderElement from WorkReport w JOIN w.workReportLines line"))); + return new ArrayList(result); + } + + @SuppressWarnings("unchecked") + private List elementsFrom(Query orderElementsQuery) { + return orderElementsQuery.list(); + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/WorkReportModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/WorkReportModel.java index 0d3f28ece..7fbba315f 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/WorkReportModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/WorkReportModel.java @@ -40,11 +40,13 @@ import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.labels.daos.ILabelDAO; import org.navalplanner.business.labels.entities.Label; import org.navalplanner.business.labels.entities.LabelType; +import org.navalplanner.business.orders.daos.IOrderDAO; import org.navalplanner.business.orders.daos.IOrderElementDAO; import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.resources.daos.IWorkerDAO; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.Worker; +import org.navalplanner.business.scenarios.IScenarioManager; import org.navalplanner.business.workreports.daos.IWorkReportDAO; import org.navalplanner.business.workreports.daos.IWorkReportTypeDAO; import org.navalplanner.business.workreports.entities.WorkReport; @@ -82,12 +84,18 @@ public class WorkReportModel extends IntegrationEntityModel implements @Autowired private IOrderElementDAO orderElementDAO; + @Autowired + private IOrderDAO orderDAO; + @Autowired private IWorkerDAO workerDAO; @Autowired private ILabelDAO labelDAO; + @Autowired + private IScenarioManager scenarioManager; + @Autowired private IConfigurationDAO configurationDAO; @@ -213,7 +221,7 @@ public class WorkReportModel extends IntegrationEntityModel implements private void forceLoadPrincipalDataWorkReportLines(WorkReportLine line) { line.getNumHours(); line.getResource().getShortDescription(); - line.getOrderElement().getName(); + line.getOrderElement().getOrder(); line.getTypeOfWorkHours().getName(); } @@ -318,13 +326,15 @@ public class WorkReportModel extends IntegrationEntityModel implements private List getAllWorkReports() { List result = new ArrayList(); - for (WorkReport each : workReportDAO.list(WorkReport.class)) { + for (WorkReport each : workReportDAO + .allWorkReportsWithAssociatedOrdersUnproxied()) { each.getWorkReportType().getName(); if (each.getResource() != null) { each.getResource().getShortDescription(); } if (each.getOrderElement() != null) { each.getOrderElement().getName(); + each.getOrderElement().getOrder(); } result.add(each); }