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 db65c558b..7a9bb9bde 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 @@ -22,6 +22,7 @@ package org.navalplanner.business.common; import org.navalplanner.business.advance.daos.IAdvanceTypeDAO; import org.navalplanner.business.resources.daos.ICriterionTypeDAO; +import org.navalplanner.business.users.daos.IUserDAO; import org.springframework.beans.factory.annotation.Autowired; /** @@ -43,6 +44,9 @@ public class Registry { @Autowired private ICriterionTypeDAO criterionTypeDAO; + @Autowired + private IUserDAO userDAO; + private Registry() { } @@ -58,4 +62,8 @@ public class Registry { return getInstance().criterionTypeDAO; } + public static IUserDAO getUserDAO() { + return getInstance().userDAO; + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/users/daos/IUserDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/users/daos/IUserDAO.java new file mode 100644 index 000000000..5753d9d1b --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/users/daos/IUserDAO.java @@ -0,0 +1,39 @@ +/* + * This file is part of ###PROJECT_NAME### + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.navalplanner.business.users.daos; + +import org.navalplanner.business.common.daos.IGenericDAO; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.users.entities.User; + +/** + * DAO interface for the User entity. + * + * @author Fernando Bellas Permuy + */ +public interface IUserDAO extends IGenericDAO{ + + public User findByLoginName(String loginName) + throws InstanceNotFoundException; + + public boolean exists(String loginName); + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/users/daos/UserDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/users/daos/UserDAO.java new file mode 100644 index 000000000..839dead00 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/users/daos/UserDAO.java @@ -0,0 +1,69 @@ +/* + * This file is part of ###PROJECT_NAME### + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.navalplanner.business.users.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.users.entities.User; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * Hibernate DAO for the User entity. + * + * @author Fernando Bellas Permuy + */ +@Repository +public class UserDAO extends GenericDAOHibernate + implements IUserDAO { + + @Override + public User findByLoginName(String loginName) + throws InstanceNotFoundException { + + Criteria c = getSession().createCriteria(User.class); + c.add(Restrictions.eq("loginName", loginName)); + User user = (User) c.uniqueResult(); + + if (user == null) { + throw new InstanceNotFoundException(loginName, + User.class.getName()); + } else { + return user; + } + + } + + @Override + @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW) + public boolean exists(String loginName) { + try { + findByLoginName(loginName); + return true; + } catch (InstanceNotFoundException e) { + return false; + } + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/users/entities/User.java b/navalplanner-business/src/main/java/org/navalplanner/business/users/entities/User.java new file mode 100644 index 000000000..41586a93e --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/users/entities/User.java @@ -0,0 +1,110 @@ +/* + * This file is part of ###PROJECT_NAME### + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.navalplanner.business.users.entities; + +import java.util.HashSet; +import java.util.Set; + +import org.hibernate.validator.AssertTrue; +import org.hibernate.validator.NotEmpty; +import org.navalplanner.business.common.BaseEntity; +import org.navalplanner.business.common.Registry; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.users.daos.IUserDAO; + +/** + * Entity for modeling a user. + * + * @author Fernando Bellas Permuy + */ +public class User extends BaseEntity { + + @NotEmpty(message="login name not specified") + private String loginName; + + @NotEmpty(message="password not specified") + private String password; + + @NotEmpty(message="user roles not specified") + private Set roles = new HashSet(); + + /** + * Necessary for Hibernate. Please, do not call it. + */ + public User() {} + + private User(String loginName, String password, Set roles) { + this.loginName = loginName; + this.password = password; + this.roles = roles; + } + + public static User create(String loginName, String password, + Set roles) { + + return create(new User(loginName, password, roles)); + + } + + public String getLoginName() { + return loginName; + } + + public void setLoginName(String loginName) { + this.loginName = loginName; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Set getRoles() { + return roles; + } + + public void setRoles(Set roles) { + this.roles = roles; + } + + @AssertTrue(message="login name is already being used by another user") + public boolean checkConstraintUniqueLoginName() { + + IUserDAO userDAO = Registry.getUserDAO(); + + if (isNewObject()) { + return !userDAO.exists(loginName); + } else { + try { + User u = userDAO.findByLoginName(loginName); + return u.getId().equals(getId()); + } catch (InstanceNotFoundException e) { + return true; + } + + } + + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/users/entities/UserRole.java b/navalplanner-business/src/main/java/org/navalplanner/business/users/entities/UserRole.java index 9ed363e35..d98941b3c 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/users/entities/UserRole.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/users/entities/UserRole.java @@ -29,21 +29,15 @@ import static org.navalplanner.business.i18n.I18nHelper._; */ public enum UserRole { - ROLE_ADMINISTRATION("ROLE_ADMINISTRATION", _("Administration")), - ROLE_BASIC_USER("ROLE_BASIC_USER", _("Basic user")); + ROLE_BASIC_USER(_("Basic user")), + ROLE_ADMINISTRATION(_("Administration")); - private final String name; private final String displayName; - private UserRole(String name, String displayName) { - this.name = name; + private UserRole(String displayName) { this.displayName = displayName; } - public String getName() { - return name; - } - public String getDisplayName() { return displayName; } diff --git a/navalplanner-business/src/main/resources/navalplanner-business-spring-config.xml b/navalplanner-business/src/main/resources/navalplanner-business-spring-config.xml index 17927bdac..568e70388 100644 --- a/navalplanner-business/src/main/resources/navalplanner-business-spring-config.xml +++ b/navalplanner-business/src/main/resources/navalplanner-business-spring-config.xml @@ -55,6 +55,9 @@ org/navalplanner/business/materials/entities/Materials.hbm.xml + + org/navalplanner/business/users/entities/Users.hbm.xml + diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/users/entities/Users.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/users/entities/Users.hbm.xml new file mode 100644 index 000000000..2129d2fb4 --- /dev/null +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/users/entities/Users.hbm.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + 100 + + + + + + + + + + org.navalplanner.business.users.entities.UserRole + + 12 + + + + + + diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/users/daos/UserDAOTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/users/daos/UserDAOTest.java new file mode 100644 index 000000000..548364c7f --- /dev/null +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/users/daos/UserDAOTest.java @@ -0,0 +1,114 @@ +/* + * This file is part of ###PROJECT_NAME### + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.navalplanner.business.test.users.daos; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; +import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; +import static org.navalplanner.business.test.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_TEST_FILE; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.navalplanner.business.common.IAdHocTransactionService; +import org.navalplanner.business.common.IOnTransaction; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.common.exceptions.ValidationException; +import org.navalplanner.business.users.daos.IUserDAO; +import org.navalplanner.business.users.entities.User; +import org.navalplanner.business.users.entities.UserRole; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.NotTransactional; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +/** + * Tests for IUserDAO. + * + * @author Fernando Bellas Permuy + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE, + BUSINESS_SPRING_CONFIG_TEST_FILE }) +@Transactional +public class UserDAOTest { + + @Autowired + private IAdHocTransactionService transactionService; + + @Autowired + private IUserDAO userDAO; + + @Test + public void testBasicSave() throws InstanceNotFoundException { + + User user = createUser(getUniqueName()); + + userDAO.save(user); + + User user2 = userDAO.find(user.getId()); + assertEquals(user, user2); + + } + + @Test + @NotTransactional + public void testSaveWithExistingLoginName() { + + final String loginName = getUniqueName(); + + IOnTransaction createUser = new IOnTransaction() { + @Override + public Void execute() { + userDAO.save(createUser(loginName)); + return null; + } + }; + + transactionService.runOnTransaction(createUser); + + try { + transactionService.runOnTransaction(createUser); + fail("ValidationException expected"); + } catch (ValidationException e) { + } + + } + + private String getUniqueName() { + return UUID.randomUUID().toString(); + } + + private User createUser(String loginName) { + + Set roles = new HashSet(); + roles.add(UserRole.ROLE_BASIC_USER); + roles.add(UserRole.ROLE_ADMINISTRATION); + + return User.create(loginName, "XXX", roles); + + } + +} diff --git a/navalplanner-business/src/test/resources/navalplanner-business-spring-config-test.xml b/navalplanner-business/src/test/resources/navalplanner-business-spring-config-test.xml index e6f947c0a..522a2ced4 100644 --- a/navalplanner-business/src/test/resources/navalplanner-business-spring-config-test.xml +++ b/navalplanner-business/src/test/resources/navalplanner-business-spring-config-test.xml @@ -63,6 +63,9 @@ org/navalplanner/business/materials/entities/Materials.hbm.xml + + org/navalplanner/business/users/entities/Users.hbm.xml + TestEntities.hbm.xml diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/security/SecurityUtils.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/security/SecurityUtils.java index 604bec99e..084cca713 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/security/SecurityUtils.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/security/SecurityUtils.java @@ -33,7 +33,7 @@ public final class SecurityUtils { private SecurityUtils() {} public final static boolean isUserInRole(UserRole role) { - return Executions.getCurrent().isUserInRole(role.getName()); + return Executions.getCurrent().isUserInRole(role.name()); } }