diff --git a/libreplan-business/src/main/java/org/libreplan/business/resources/entities/Worker.java b/libreplan-business/src/main/java/org/libreplan/business/resources/entities/Worker.java index 23ea4aee8..0a9a4b9af 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/resources/entities/Worker.java +++ b/libreplan-business/src/main/java/org/libreplan/business/resources/entities/Worker.java @@ -27,6 +27,7 @@ import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotEmpty; import org.libreplan.business.common.Registry; import org.libreplan.business.common.exceptions.InstanceNotFoundException; +import org.libreplan.business.users.daos.IUserDAO; import org.libreplan.business.users.entities.User; /** @@ -214,4 +215,28 @@ public class Worker extends Resource { this.user = user; } + @AssertTrue(message = "User already bound to other worker") + public boolean checkUserNotBoundToOtherWorker() { + if (user == null || user.isNewObject()) { + return true; + } + + IUserDAO userDAO = Registry.getUserDAO(); + User foundUser = userDAO.findOnAnotherTransaction(user.getId()); + if (foundUser == null) { + return true; + } + + Worker worker = foundUser.getWorker(); + if (worker == null) { + return true; + } + + if (getId() == null) { + return false; + } + + return getId().equals(worker.getId()); + } + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/users/daos/IUserDAO.java b/libreplan-business/src/main/java/org/libreplan/business/users/daos/IUserDAO.java index 5a555f502..d9b6aefa2 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/users/daos/IUserDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/users/daos/IUserDAO.java @@ -92,4 +92,6 @@ public interface IUserDAO extends IGenericDAO{ */ List getUnboundUsers(Worker worker); + User findOnAnotherTransaction(Long id); + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/users/daos/UserDAO.java b/libreplan-business/src/main/java/org/libreplan/business/users/daos/UserDAO.java index ed11bff4f..680b38d12 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/users/daos/UserDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/users/daos/UserDAO.java @@ -149,4 +149,14 @@ public class UserDAO extends GenericDAOHibernate org.hibernate.criterion.Order.asc("loginName")).list(); } + @Override + @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW) + public User findOnAnotherTransaction(Long id) { + try { + return find(id); + } catch (InstanceNotFoundException e) { + return null; + } + } + } diff --git a/libreplan-business/src/test/java/org/libreplan/business/test/resources/daos/ResourceDAOTest.java b/libreplan-business/src/test/java/org/libreplan/business/test/resources/daos/ResourceDAOTest.java index e52d4aed1..35ad7b0fe 100644 --- a/libreplan-business/src/test/java/org/libreplan/business/test/resources/daos/ResourceDAOTest.java +++ b/libreplan-business/src/test/java/org/libreplan/business/test/resources/daos/ResourceDAOTest.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -46,6 +46,7 @@ import org.libreplan.business.calendars.entities.ResourceCalendar; import org.libreplan.business.common.IAdHocTransactionService; import org.libreplan.business.common.IOnTransaction; import org.libreplan.business.common.exceptions.InstanceNotFoundException; +import org.libreplan.business.common.exceptions.ValidationException; import org.libreplan.business.resources.daos.ICriterionDAO; import org.libreplan.business.resources.daos.ICriterionTypeDAO; import org.libreplan.business.resources.daos.IResourceDAO; @@ -56,6 +57,8 @@ import org.libreplan.business.resources.entities.CriterionType; import org.libreplan.business.resources.entities.Interval; import org.libreplan.business.resources.entities.Resource; import org.libreplan.business.resources.entities.Worker; +import org.libreplan.business.users.daos.IUserDAO; +import org.libreplan.business.users.entities.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.NotTransactional; import org.springframework.test.context.ContextConfiguration; @@ -91,6 +94,9 @@ public class ResourceDAOTest { @Autowired private ICriterionTypeDAO criterionTypeDAO; + @Autowired + private IUserDAO userDAO; + @Test public void saveResourceWithCalendar() throws InstanceNotFoundException { Resource resource = givenValidWorker(); @@ -233,4 +239,44 @@ public class ResourceDAOTest { assertThat(result.size(), not(equalTo(1))); } + private User givenStoredUser() { + return transactionService + .runOnAnotherTransaction(new IOnTransaction() { + + @Override + public User execute() { + User user = User.create("login" + UUID.randomUUID(), + "password", null); + userDAO.save(user); + user.dontPoseAsTransientObjectAnymore(); + return user; + } + }); + } + + @Test(expected = ValidationException.class) + public void testWorkerBoundToUserAlreadyBound() { + final User user = givenStoredUser(); + + transactionService.runOnAnotherTransaction(new IOnTransaction() { + @Override + public Void execute() { + Worker worker1 = givenValidWorker(); + worker1.setUser(user); + resourceDAO.save(worker1); + return null; + } + }); + + transactionService.runOnAnotherTransaction(new IOnTransaction() { + @Override + public Void execute() { + Worker worker2 = givenValidWorker(); + worker2.setUser(user); + resourceDAO.save(worker2); + return null; + } + }); + } + }