From 1207aa9198bfd68651a8d63118eda072c30f4ee7 Mon Sep 17 00:00:00 2001 From: Diego Pino Garcia Date: Tue, 31 Aug 2010 16:56:00 +0200 Subject: [PATCH] Move constraint validation hoursgroup.code must be unique to OrderModel.save() HoursGroup.code must be unique for each OrderElement. This constraint was being validation in HoursGroup, as an Hibernate validation. This validation was very slow has for each HoursGroup it was needed to check against all other HoursGroup. I moved this validation to OrderModel.save() and speed up the process, keeping the same funcionality. FEA: ItEr61S07PerformanceOrderEdition --- .../business/orders/daos/HoursGroupDAO.java | 40 ++++++++++++++++++- .../business/orders/daos/IHoursGroupDAO.java | 12 ++++++ .../business/orders/entities/HoursGroup.java | 23 +---------- .../business/orders/entities/Order.java | 13 +++--- .../navalplanner/web/orders/OrderModel.java | 25 ++++++++++++ 5 files changed, 84 insertions(+), 29 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/HoursGroupDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/HoursGroupDAO.java index cd263819e..4df24e2bc 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/HoursGroupDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/HoursGroupDAO.java @@ -20,6 +20,10 @@ package org.navalplanner.business.orders.daos; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import org.apache.commons.lang.Validate; import org.hibernate.Criteria; import org.hibernate.HibernateException; @@ -27,6 +31,7 @@ import org.hibernate.criterion.Restrictions; import org.navalplanner.business.common.daos.IntegrationEntityDAO; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.orders.entities.HoursGroup; +import org.navalplanner.business.orders.entities.Order; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; @@ -88,4 +93,37 @@ public class HoursGroupDAO extends IntegrationEntityDAO } } -} \ No newline at end of file + @Override + @Transactional(readOnly= true, propagation = Propagation.REQUIRES_NEW) + public HoursGroup findRepeatedHoursGroupCodeInDB(List hoursGroupList) { + final Map hoursGroups = createMapByCode(hoursGroupList); + final Map hoursGroupsInDB = createMapByCode(getAll()); + + for (String code : hoursGroups.keySet()) { + HoursGroup hoursGroup = hoursGroups.get(code); + HoursGroup hoursGroupInDB = hoursGroupsInDB.get(code); + + // There's an element in the DB with the same code and it's a + // different element + if (hoursGroupInDB != null + && !hoursGroupInDB.getId().equals(hoursGroup.getId())) { + return hoursGroup; + } + } + return null; + } + + private List getAll() { + return list(HoursGroup.class); + } + + private Map createMapByCode(List hoursGroups) { + Map result = new HashMap(); + for (HoursGroup each: hoursGroups) { + final String code = each.getCode(); + result.put(code, each); + } + return result; + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IHoursGroupDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IHoursGroupDAO.java index f061fa8ad..58bb9f43b 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IHoursGroupDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IHoursGroupDAO.java @@ -21,6 +21,9 @@ package org.navalplanner.business.orders.daos; import org.navalplanner.business.common.daos.IIntegrationEntityDAO; +import java.util.List; + +import org.navalplanner.business.common.daos.IGenericDAO; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.orders.entities.HoursGroup; @@ -28,6 +31,7 @@ import org.navalplanner.business.orders.entities.HoursGroup; * Contract for {@link HoursGroupDAO} * * @author Manuel Rego Casasnovas + * @author Diego Pino Garcia */ public interface IHoursGroupDAO extends IIntegrationEntityDAO { @@ -36,4 +40,12 @@ public interface IHoursGroupDAO extends IIntegrationEntityDAO { HoursGroup findUniqueByCodeAnotherTransaction(HoursGroup hoursGroup) throws InstanceNotFoundException; + /** + * Checks if there's another {@link HoursGroup} in DB which code is the same as + * some of the ones in order.hoursGroups + * + * @param order + * @return + */ + HoursGroup findRepeatedHoursGroupCodeInDB(List hoursGroupList); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/HoursGroup.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/HoursGroup.java index caa77ff8c..51033b663 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/HoursGroup.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/HoursGroup.java @@ -33,7 +33,6 @@ import java.util.UUID; import org.apache.commons.lang.Validate; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotEmpty; import org.hibernate.validator.NotNull; import org.hibernate.validator.Valid; @@ -42,6 +41,7 @@ import org.navalplanner.business.common.Registry; import org.navalplanner.business.common.daos.IIntegrationEntityDAO; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.orders.daos.IHoursGroupDAO; +import org.navalplanner.business.common.BaseEntity; import org.navalplanner.business.requirements.entities.CriterionRequirement; import org.navalplanner.business.requirements.entities.DirectCriterionRequirement; import org.navalplanner.business.requirements.entities.IndirectCriterionRequirement; @@ -396,27 +396,6 @@ public class HoursGroup extends IntegrationEntity implements Cloneable, return false; } - @AssertTrue(message = "hours group code is already being used") - public boolean checkConstraintUniqueCode() { - if (code == null) { - LOG.warn("Hours group code is null. " - + "Not checking unique code since it would fail"); - return true; - } - IHoursGroupDAO hoursGroupDAO = Registry.getHoursGroupDAO(); - if (isNewObject()) { - return !hoursGroupDAO.existsByCodeAnotherTransaction(this); - } else { - try { - HoursGroup hoursGroup = hoursGroupDAO - .findUniqueByCodeAnotherTransaction(this); - return hoursGroup.getId().equals(getId()); - } catch (InstanceNotFoundException e) { - return true; - } - } - } - public OrderLineTemplate getOrderLineTemplate() { return orderLineTemplate; } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/Order.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/Order.java index 29d323345..9c1bbef59 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/Order.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/Order.java @@ -451,19 +451,20 @@ public class Order extends OrderLineGroup { } } - @AssertTrue(message = "some code is repeated between hours group codes") - public boolean checkConstraintHoursGroupCodeNotRepeated() { + public HoursGroup findRepeatedHoursGroupCode() { Set codes = new HashSet(); for (HoursGroup hoursGroup : getHoursGroups()) { String code = hoursGroup.getCode(); - if (codes.contains(code)) { - return false; + if (code != null) { + if (codes.contains(code)) { + return hoursGroup; + } + codes.add(code); } - codes.add(code); } - return true; + return null; } @Override diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java index ba76de3bf..f5fcc1dfb 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java @@ -50,6 +50,7 @@ import org.navalplanner.business.externalcompanies.daos.IExternalCompanyDAO; import org.navalplanner.business.externalcompanies.entities.ExternalCompany; import org.navalplanner.business.labels.daos.ILabelDAO; import org.navalplanner.business.labels.entities.Label; +import org.navalplanner.business.orders.daos.IHoursGroupDAO; import org.navalplanner.business.orders.daos.IOrderDAO; import org.navalplanner.business.orders.daos.IOrderElementDAO; import org.navalplanner.business.orders.entities.HoursGroup; @@ -173,6 +174,9 @@ public class OrderModel implements IOrderModel { @Autowired private IOrderVersionDAO orderVersionDAO; + @Autowired + private IHoursGroupDAO hoursGroupDAO; + @Override @Transactional(readOnly = true) public List