diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/IWorkerDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/IWorkerDAO.java index d12d00ed9..7435403eb 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/IWorkerDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/IWorkerDAO.java @@ -118,4 +118,12 @@ public interface IWorkerDAO extends IIntegrationEntityDAO { List getWorkingHoursGroupedPerWorker(List workerNifs, Date startingDate, Date endingDate); + Worker findByNifAnotherTransaction(String nif) + throws InstanceNotFoundException; + + public List findByFirstNameSecondName(String firstname, + String secondname); + + public List findByFirstNameSecondNameAnotherTransaction( + String firstname, String secondname); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/WorkerDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/WorkerDAO.java index 5de16d2f2..f561c31bb 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/WorkerDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/WorkerDAO.java @@ -53,10 +53,9 @@ public class WorkerDAO extends IntegrationEntityDAO @Override public Worker findUniqueByNif(String nif) throws InstanceNotFoundException { Criteria criteria = getSession().createCriteria(Worker.class); - criteria.add(Restrictions.eq("nif", nif).ignoreCase()); + criteria.add(Restrictions.eq("nif", nif.trim()).ignoreCase()); List list = criteria.list(); - if (list.size() != 1) { throw new InstanceNotFoundException(nif, Worker.class.getName()); } @@ -64,6 +63,13 @@ public class WorkerDAO extends IntegrationEntityDAO return list.get(0); } + @Override + @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW) + public Worker findByNifAnotherTransaction(String nif) + throws InstanceNotFoundException { + return findUniqueByNif(nif); + } + @Override public List getWorkers() { return getSession().createQuery( @@ -122,6 +128,22 @@ public class WorkerDAO extends IntegrationEntityDAO return findByFirstNameSecondNameAndNif(firstname, secondname, nif); } + @SuppressWarnings("unchecked") + @Override + public List findByFirstNameSecondName(String firstname, + String secondname) { + return getSession().createCriteria(Worker.class).add( + Restrictions.and(Restrictions.ilike("firstName", firstname), + Restrictions.ilike("surname", secondname))).list(); + } + + @Override + @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW) + public List findByFirstNameSecondNameAnotherTransaction( + String firstname, String secondname) { + return findByFirstNameSecondName(firstname, secondname); + } + @Override @Transactional(readOnly = true) public List getWorkingHoursPerWorker(List workers, Date startingDate, Date endingDate) { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/VirtualWorker.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/VirtualWorker.java index 7b53a5a9d..32b8cd27f 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/VirtualWorker.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/VirtualWorker.java @@ -75,7 +75,7 @@ public class VirtualWorker extends Worker { @AssertTrue @Override - public boolean checkConstraintUniqueFirstNameSurnameNif() { + public boolean checkConstraintUniqueNif() { return true; } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java index ddc5403ea..77d0d5e53 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java @@ -21,12 +21,11 @@ package org.navalplanner.business.resources.entities; -import java.util.List; - import org.apache.commons.lang.StringUtils; import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotEmpty; import org.navalplanner.business.common.Registry; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; /** * This class models a worker. @@ -142,31 +141,27 @@ public class Worker extends Resource { return !isVirtual(); } - @AssertTrue(message = "Worker with the same first name, surname and nif previously existed") - public boolean checkConstraintUniqueFirstNameSurnameNif() { - + @AssertTrue(message = "Worker with the same nif previously existed") + public boolean checkConstraintUniqueNif() { if (!areFirstNameSurnameNifSpecified()) { return true; } + try { /* Check the constraint. */ - List list = Registry.getWorkerDAO() - .findByFirstNameSecondNameAndNifAnotherTransaction(firstName, - surname, nif); - - if (isNewObject()) { - return list.isEmpty(); - } else { - if (list.isEmpty()) { - return true; + Worker worker = Registry.getWorkerDAO() + .findByNifAnotherTransaction(nif); + if (isNewObject()) { + return false; } else { - return list.get(0).getId().equals(getId()); + return worker.getId().equals(getId()); } + } catch (InstanceNotFoundException e) { + return isNewObject(); } - } - private boolean areFirstNameSurnameNifSpecified() { + protected boolean areFirstNameSurnameNifSpecified() { return !StringUtils.isBlank(firstName) && !StringUtils.isBlank(surname) && diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/api/ResourceServiceTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/api/ResourceServiceTest.java index c1c95e002..6727ce4c7 100644 --- a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/api/ResourceServiceTest.java +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/api/ResourceServiceTest.java @@ -395,7 +395,8 @@ public class ResourceServiceTest { machineDTO.criterionSatisfactions.add( new CriterionSatisfactionDTO(workerCt.getName() , "c1", getDate(2001, 1, 1), null)); // Incorrect type. - WorkerDTO workerDTO = new WorkerDTO(getUniqueName(), "surname", "nif"); + WorkerDTO workerDTO = new WorkerDTO(getUniqueName(), "surname", + getUniqueName()); workerDTO.criterionSatisfactions.add( new CriterionSatisfactionDTO(machineCt.getName() , "c1", getDate(2001, 1, 1), null)); // Incorrect type. @@ -746,7 +747,8 @@ public class ResourceServiceTest { m1.resourcesCostCategoryAssignments.add(m1a1); /* Create a worker DTO. */ - WorkerDTO w1 = new WorkerDTO(getUniqueName(), "surname", "nif"); + String nif = getUniqueName(); + WorkerDTO w1 = new WorkerDTO(getUniqueName(), "surname", nif); CriterionSatisfactionDTO w1s1 = new CriterionSatisfactionDTO(ct .getName(), "c1", getDate(2000, 1, 1), getDate(2000, 2, 1)); w1.criterionSatisfactions.add(w1s1);