diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java index 2afbf8583..8edd2d41a 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java @@ -28,6 +28,7 @@ import org.navalplanner.business.labels.daos.ILabelDAO; import org.navalplanner.business.labels.daos.ILabelTypeDAO; import org.navalplanner.business.materials.daos.IMaterialCategoryDAO; import org.navalplanner.business.materials.daos.IMaterialDAO; +import org.navalplanner.business.orders.daos.IHoursGroupDAO; import org.navalplanner.business.orders.daos.IOrderElementDAO; import org.navalplanner.business.qualityforms.daos.IQualityFormDAO; import org.navalplanner.business.resources.daos.ICriterionDAO; @@ -112,6 +113,9 @@ public class Registry { @Autowired private ICriterionDAO criterionDAO; + @Autowired + private IHoursGroupDAO hoursGroupDAO; + private Registry() { } @@ -190,4 +194,8 @@ public class Registry { return getInstance().criterionDAO; } + public static IHoursGroupDAO getHoursGroupDAO() { + return getInstance().hoursGroupDAO; + } + } 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 4a5c01970..fa371652f 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,11 +20,16 @@ package org.navalplanner.business.orders.daos; +import org.hibernate.Criteria; +import org.hibernate.criterion.Restrictions; import org.navalplanner.business.common.daos.GenericDAOHibernate; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.orders.entities.HoursGroup; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; /** * Dao for {@link HoursGroup} @@ -35,4 +40,45 @@ import org.springframework.stereotype.Repository; @Scope(BeanDefinition.SCOPE_SINGLETON) public class HoursGroupDAO extends GenericDAOHibernate implements IHoursGroupDAO { -} + + @Override + @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW) + public boolean existsByCodeAnotherTransaction(HoursGroup hoursGroup) { + return existsByCode(hoursGroup); + } + + private boolean existsByCode(HoursGroup hoursGroup) { + try { + HoursGroup result = findUniqueByCode(hoursGroup); + return result != null && result != hoursGroup; + } catch (InstanceNotFoundException e) { + return false; + } + } + + @Override + @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW) + public HoursGroup findUniqueByCodeAnotherTransaction(HoursGroup hoursGroup) + throws InstanceNotFoundException { + return findUniqueByCode(hoursGroup); + } + + private HoursGroup findUniqueByCode(HoursGroup hoursGroup) + throws InstanceNotFoundException { + if ((hoursGroup == null) || (hoursGroup.getCode() == null)) { + return null; + } + + Criteria c = getSession().createCriteria(HoursGroup.class); + c.add(Restrictions.eq("code", hoursGroup.getCode())); + + HoursGroup result = (HoursGroup) c.uniqueResult(); + if (result == null) { + throw new InstanceNotFoundException(hoursGroup.getCode(), + HoursGroup.class.getName()); + } else { + return result; + } + } + +} \ No newline at end of file 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 c8cd347d9..e4abdcbba 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,7 @@ package org.navalplanner.business.orders.daos; import org.navalplanner.business.common.daos.IGenericDAO; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.orders.entities.HoursGroup; /** @@ -30,4 +31,9 @@ import org.navalplanner.business.orders.entities.HoursGroup; */ public interface IHoursGroupDAO extends IGenericDAO { + boolean existsByCodeAnotherTransaction(HoursGroup hoursGroup); + + HoursGroup findUniqueByCodeAnotherTransaction(HoursGroup hoursGroup) + throws InstanceNotFoundException; + } 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 b6a26759a..5258c936a 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 @@ -26,10 +26,14 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; +import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotEmpty; import org.hibernate.validator.NotNull; import org.hibernate.validator.Valid; import org.navalplanner.business.common.BaseEntity; +import org.navalplanner.business.common.Registry; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.orders.daos.IHoursGroupDAO; import org.navalplanner.business.requirements.entities.CriterionRequirement; import org.navalplanner.business.requirements.entities.DirectCriterionRequirement; import org.navalplanner.business.requirements.entities.IndirectCriterionRequirement; @@ -275,4 +279,21 @@ public class HoursGroup extends BaseEntity implements Cloneable, return false; } + @AssertTrue(message = "code is already being used") + public boolean checkConstraintUniqueCode() { + 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; + } + } + } + }