/*
* Copyright 2008-2010 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package es.alvsanand.webpage.db.dao.admin;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import es.alvsanand.webpage.db.QueryBean;
import es.alvsanand.webpage.db.dao.DAOException;
import es.alvsanand.webpage.db.dao.DAOHelper;
import es.alvsanand.webpage.model.ArticleVersion;
import es.alvsanand.webpage.model.Avatar;
import es.alvsanand.webpage.model.Role;
import es.alvsanand.webpage.model.User;
/**
* Implementation of the <code>es.alvsanand.webpage.db.dao.security.UserDAO</code>
*
* @author alvaro.santos
* @date 28/07/2010
*
*/
public class UserDAOImpl extends DAOHelper implements UserDAO{
/**
* Name of the query for delete an user
*/
private final static String DELETE_USER_NQ = "DELETE from User user WHERE user.idUser = :idUser";
/**
* Name of the query for delete the roles of a user
*/
private final static String DELETE_ROLES_USER_NQ = "DELETE from Role role WHERE role.idUser = :idUser";
/**
* Name of the query for delete the avatars of a user
*/
private final static String DELETE_AVATARS_USER_NQ = "DELETE from Avatar avatar WHERE avatar.idUser = :idUser";
/**
* Name of the query for obtaining an user by idUser
*/
private final static String FIND_USER_NQ = "SELECT user FROM User user WHERE user.idUser = :idUser";
/**
* Name of the query for obtaining an user by name and password
*/
private final static String FIND_USER_BYLOGINNAMEANDPASSWORD_NQ = "SELECT user FROM User user WHERE user.loginName = :name and user.password = :password";
/**
* Name of the query for obtaining an user by name
*/
private final static String FIND_USER_BYLOGINNAME_NQ = "SELECT user FROM User user WHERE user.loginName = :loginName";
/**
* Name of the query for obtaining an user by name
*/
private final static String FIND_USER_BYREGISTRATIONHASH_NQ = "SELECT user FROM User user WHERE user.registrationHash = :registrationHash";
/**
* Name of the query for selecting all users
*/
private final static String FIND_ALL_USER_NQ = "SELECT user FROM User user";
/**
* Name of the query for selecting all users except actual
*/
private final static String FIND_ALL_USER_EXCEPT_ACTUAL_NQ = "SELECT user FROM User user where user.loginName <> :loginName";
/**
* Name of the query for selecting all users by the name
*/
private final static String FIND_ALL_BYLOGINNAME_USER_NQ = "SELECT user FROM User user WHERE user.loginName = :loginName";
/**
* Name of the query for obtaining the count of users
*/
private final static String COUNT_USER_NQ = "SELECT count(user) FROM User user";
/**
* Name of the query for obtaining the count of users by the name
*/
private final static String COUNT_BYLOGINNAME_USER_NQ = "SELECT count(user) FROM User user WHERE user.loginName = :loginName";
/**
* Name of the query for obtaining the roles of a user
*/
private final static String FIND_ROLES_USER_NQ = "SELECT role FROM Role role WHERE role.idUser = :idUser";
/**
* Name of the query for obtaining the articleVersions of a user
*/
private final static String FIND_ARTICLE_VERSIONS_USER_NQ = "SELECT articleVersion FROM ArticleVersion articleVersion WHERE articleVersion.idUser = :idUser";
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.UserDAO#getUsers(es.alvsanand.webpage.db.QueryBean)
*/
public List<User> getUsers(QueryBean queryBean) throws DAOException{
try{
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, FIND_ALL_USER_NQ, queryBean);
Object resultObj = q.getResultList();
List<User> result = new java.util.ArrayList<User>((List<User>)resultObj);
entityManager.close();
return result;
}
catch(NoResultException noResultException){
return null;
}
catch(Throwable e){
throw new DAOException("Error getting User beans: " + e.getMessage(), e);
}
}
public List<User> getUsersExceptActual(String actualUser, QueryBean queryBean) throws DAOException{
try{
if(actualUser==null){
throw new IllegalArgumentException();
}
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, FIND_ALL_USER_EXCEPT_ACTUAL_NQ, queryBean);
q.setParameter("loginName", actualUser);
Object resultObj = q.getResultList();
List<User> result = new java.util.ArrayList<User>((List<User>)resultObj);
entityManager.close();
return result;
}
catch(NoResultException noResultException){
return null;
}
catch(Throwable e){
throw new DAOException("Error getting User beans: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.UserDAO#getUser(es.alvsanand.webpage.model.User)
*/
public User getUser(User user) throws DAOException{
try{
if(user==null || user.getIdUser()==null){
throw new IllegalArgumentException();
}
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, FIND_USER_NQ, null);
q.setParameter("idUser", user.getIdUser());
Object resultObj = q.getSingleResult();
User result = (User)resultObj;
if(result!=null){
result.setRole(getRole(result, entityManager));
}
entityManager.close();
return result;
}
catch(NoResultException noResultException){
return null;
}
catch(Throwable e){
throw new DAOException("Error getting User bean by Key: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.UserDAO#getUserCount()
*/
public int getUserCount() throws DAOException{
try{
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, COUNT_USER_NQ, null);
Object resultObj = q.getSingleResult();
entityManager.close();
return ((Integer)resultObj).intValue();
}
catch(NoResultException noResultException){
return 0;
}
catch(Throwable e){
throw new DAOException("Error getting count of User beans: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.security.UserDAO#getUserCountByLoginName(java.lang.String)
*/
public int getUserCountByLoginName(String name) throws DAOException{
try{
if(name==null){
throw new IllegalArgumentException();
}
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, COUNT_BYLOGINNAME_USER_NQ, null);
q.setParameter("loginName", name);
Object resultObj = q.getSingleResult();
entityManager.close();
return ((Integer)resultObj).intValue();
}
catch(NoResultException noResultException){
return 0;
}
catch(Throwable e){
throw new DAOException("Error getting count of User beans by loginName: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.security.UserDAO#getUsersByLoginName(java.lang.String)
*/
public List<User> getUsersByLoginName(String loginName) throws DAOException{
try{
if(loginName==null){
throw new IllegalArgumentException();
}
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, FIND_ALL_BYLOGINNAME_USER_NQ, null);
q.setParameter("loginName", loginName);
Object resultObj = q.getResultList();
List<User> result = new java.util.ArrayList<User>((List<User>)resultObj);
entityManager.close();
return result;
}
catch(NoResultException noResultException){
return null;
}
catch(Throwable e){
throw new DAOException("Error getting User bean by loginName: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.security.UserDAO#getUserByLoginName(java.lang.String)
*/
public User getUserByLoginName(String loginName) throws DAOException{
try{
if(loginName==null){
throw new IllegalArgumentException();
}
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, FIND_USER_BYLOGINNAME_NQ, null);
q.setParameter("loginName", loginName);
Object resultObj = q.getSingleResult();
User result = (User)resultObj;
if(result!=null){
result.setRole(getRole(result, entityManager));
}
entityManager.close();
return result;
}
catch(NoResultException noResultException){
return null;
}
catch(Throwable e){
throw new DAOException("Error getting User bean by loginName: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.security.UserDAO#getUserByLoginNameAndPassword(java.lang.String, java.lang.String)
*/
public User getUserByLoginNameAndPassword(String loginName, String password) throws DAOException{
try{
if(loginName==null || password==null){
throw new IllegalArgumentException();
}
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, FIND_USER_BYLOGINNAMEANDPASSWORD_NQ, null);
q.setParameter("loginName", loginName);
q.setParameter("password", password);
Object resultObj = q.getSingleResult();
User result = (User)resultObj;
if(result!=null){
result.setRole(getRole(result, entityManager));
}
entityManager.close();
return result;
}
catch(NoResultException noResultException){
return null;
}
catch(Throwable e){
throw new DAOException("Error getting User bean by loginName and password: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.security.UserDAO#getUserByRegistrationHash(java.lang.String)
*/
public User getUserByRegistrationHash(String registrationHash) throws DAOException {
try {
if (registrationHash == null) {
throw new IllegalArgumentException();
}
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, FIND_USER_BYREGISTRATIONHASH_NQ, null);
q.setParameter("registrationHash", registrationHash);
Object resultObj = q.getSingleResult();
User result = (User) resultObj;
if (result != null) {
result.setRole(getRole(result, entityManager));
}
entityManager.close();
return result;
} catch (NoResultException noResultException) {
return null;
} catch (Throwable e) {
throw new DAOException("Error getting User bean by registrationHash: " + e.getMessage(), e);
}
}
private Role getRole(User user, EntityManager entityManager) throws DAOException{
try{
if(user==null || user.getIdUser()==null){
throw new IllegalArgumentException();
}
Query q = getQuery(entityManager, FIND_ROLES_USER_NQ, null);
q.setParameter("idUser", user.getIdUser());
Object resultObj = q.getSingleResult();
return (Role)resultObj;
}
catch(NoResultException noResultException){
return null;
}
catch(Throwable e){
throw new DAOException("Error getting User bean by Key: " + e.getMessage(), e);
}
}
private List<ArticleVersion> getArticleVersions(User user, EntityManager entityManager) throws DAOException{
try{
if(user==null || user.getIdUser()==null){
throw new IllegalArgumentException();
}
Query q = getQuery(entityManager, FIND_ARTICLE_VERSIONS_USER_NQ, null);
q.setParameter("idUser", user.getIdUser());
Object resultObj = q.getResultList();
List<ArticleVersion> result = new java.util.ArrayList<ArticleVersion>((List<ArticleVersion>)resultObj);
return result;
}
catch(NoResultException noResultException){
return null;
}
catch(Throwable e){
throw new DAOException("Error getting User bean by Key: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.UserDAO#deleteUser(es.alvsanand.webpage.model.User)
*/
public void deleteUser(User user) throws DAOException {
if(user!=null && user.getIdUser()!=null){
EntityManager entityManager = getEntityManager();
try{
//Modifying dependencies
{
List<ArticleVersion> articleVersionsList = getArticleVersions(user, entityManager);
if(articleVersionsList!=null){
for (ArticleVersion articleVersion : articleVersionsList) {
articleVersion.setUser(null);
articleVersion = entityManager.merge(articleVersion);
entityManager.persist(articleVersion);
}
}
}
//Deleting dependencies
{
Query q = getQuery(entityManager, DELETE_ROLES_USER_NQ, null);
q.setParameter("idUser", user.getIdUser());
q.executeUpdate();
}
{
Query q = getQuery(entityManager, DELETE_AVATARS_USER_NQ, null);
q.setParameter("idUser", user.getIdUser());
q.executeUpdate();
}
//Deleting User
{
Query q = getQuery(entityManager, DELETE_USER_NQ, null);
q.setParameter("idUser", user.getIdUser());
q.executeUpdate();
}
}
catch(Throwable e){
throw new DAOException("Error deleting User bean: " + e.getMessage(), e);
}
finally{
entityManager.close();
}
}
else{
throw new DAOException("Error deleting User bean: the user is null or empty");
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.UserDAO#saveOrUpdateUser(es.alvsanand.webpage.model.User)
*/
public void saveOrUpdateUser(User user) throws DAOException {
if(user!=null){
EntityManager entityManager = getEntityManager();
try{
user = entityManager.merge(user);
entityManager.persist(user);
//Saving or updating dependencies
if(user.getArticleVersions()!=null){
for(ArticleVersion articleVersion: user.getArticleVersions()){
articleVersion.setUser(user);
articleVersion = entityManager.merge(articleVersion);
entityManager.persist(articleVersion);
}
}
if(user.getRole()!=null){
//Deleting old roles
{
Query q = getQuery(entityManager, DELETE_ROLES_USER_NQ, null);
q.setParameter("idUser", user.getIdUser());
q.executeUpdate();
}
Role role = user.getRole();
role.setUser(user);
role = entityManager.merge(role);
entityManager.persist(role);
}
if(user.getAvatar()!=null){
//Deleting old avatars
{
Query q = getQuery(entityManager, DELETE_AVATARS_USER_NQ, null);
q.setParameter("idUser", user.getIdUser());
q.executeUpdate();
}
Avatar avatar = user.getAvatar();
avatar.setUser(user);
avatar = entityManager.merge(avatar);
entityManager.persist(avatar);
}
}
catch(Throwable e){
throw new DAOException("Error saving or updating User bean: " + e.getMessage(), e);
}
finally{
entityManager.close();
}
}
else{
throw new DAOException("Error saving or updating User bean: the user is null or empty");
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.security.UserDAO#saveOrUpdateUsers(java.util.List)
*/
public void saveOrUpdateUsers(List<User> userList) throws DAOException {
//Transactions are not permitted for multiple saves
if(userList!=null){
EntityManager entityManager = getEntityManager();
try{
for(User user: userList){
user = entityManager.merge(user);
entityManager.persist(user);
//Saving or updating dependencies
if(user.getArticleVersions()!=null){
for(ArticleVersion articleVersion: user.getArticleVersions()){
articleVersion.setUser(user);
articleVersion = entityManager.merge(articleVersion);
entityManager.persist(articleVersion);
}
}
if(user.getRole()!=null){
Role role = user.getRole();
role.setUser(user);
role = entityManager.merge(role);
entityManager.persist(role);
}
}
}
catch(Throwable e){
throw new DAOException("Error saving or updating User bean: " + e.getMessage(), e);
}
finally{
entityManager.close();
}
}
else{
throw new DAOException("Error saving or updating User bean: the user is null or empty");
}
}
}