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