diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/BaseCalendarDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/BaseCalendarDAO.java index 6dc70ada2..7da879062 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/BaseCalendarDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/BaseCalendarDAO.java @@ -12,6 +12,8 @@ import org.navalplanner.business.common.daos.GenericDAOHibernate; 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 BaseCalendar} @@ -69,4 +71,22 @@ public class BaseCalendarDAO extends GenericDAOHibernate return list; } + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true) + @Override + public boolean thereIsOtherWithSameName(BaseCalendar baseCalendar) { + List withSameName = findByName(baseCalendar); + if (withSameName.isEmpty()) + return false; + if (withSameName.size() > 1) + return true; + return areDifferentInDB(withSameName.get(0), baseCalendar); + } + + private boolean areDifferentInDB(BaseCalendar one, BaseCalendar other) { + if ((one.getId() == null) || (other.getId() == null)) { + return true; + } + return !one.getId().equals(other.getId()); + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/IBaseCalendarDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/IBaseCalendarDAO.java index 5fa4fbab3..0fd4ba2ac 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/IBaseCalendarDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/daos/IBaseCalendarDAO.java @@ -5,6 +5,11 @@ import java.util.List; import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.business.common.daos.IGenericDAO; +/** + * Contract for {@link BaseCalendarDAO} + * + * @author Manuel Rego Casasnovas + */ public interface IBaseCalendarDAO extends IGenericDAO { List getBaseCalendars(); @@ -13,4 +18,6 @@ public interface IBaseCalendarDAO extends IGenericDAO { List findByName(BaseCalendar baseCalendar); + boolean thereIsOtherWithSameName(BaseCalendar baseCalendar); + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarModel.java index d774f6c64..d5cc969a9 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarModel.java @@ -148,7 +148,7 @@ public class BaseCalendarModel implements IBaseCalendarModel { if (getBaseCalendar() != null) { for (BaseCalendar calendar : baseCalendars) { - if (areSameInDB(calendar, getBaseCalendar())) { + if (calendar.getId().equals(getBaseCalendar().getId())) { baseCalendars.remove(calendar); break; } @@ -409,25 +409,17 @@ public class BaseCalendarModel implements IBaseCalendarModel { throw new ValidationException(invalidValues); } - List list = baseCalendarDAO.findByName(getBaseCalendar()); - if (!list.isEmpty()) { - if ((list.size() > 1) - || !areSameInDB(entity, list.get(0))) { - InvalidValue[] invalidValues2 = { new InvalidValue(_( - "{0} already exists", entity.getName()), - BaseCalendar.class, "name", entity.getName(), entity) }; - throw new ValidationException(invalidValues2, - _("Could not save new calendar")); - } + if (baseCalendarDAO.thereIsOtherWithSameName(getBaseCalendar())) { + InvalidValue[] invalidValues2 = { new InvalidValue(_( + "{0} already exists", entity.getName()), + BaseCalendar.class, "name", entity.getName(), entity) }; + throw new ValidationException(invalidValues2, + _("Could not save new calendar")); } baseCalendarDAO.save(getBaseCalendar()); } - private boolean areSameInDB(BaseCalendar one, BaseCalendar another) { - return one.getId().equals(another.getId()); - } - @Override @Transactional public void confirmRemove() {