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());
}
}