package org.appfuse.persistence.hibernate;
import java.util.Iterator;
import java.util.List;
import net.sf.hibernate.Hibernate;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.appfuse.model.User;
import org.appfuse.model.UserCookie;
import org.appfuse.model.UserRole;
import org.appfuse.persistence.DAOException;
import org.appfuse.persistence.UserDAO;
import org.springframework.orm.hibernate.HibernateCallback;
import org.springframework.orm.hibernate.support.HibernateDaoSupport;
public class UserDAOHibernate extends HibernateDaoSupport implements UserDAO {
private Log log = LogFactory.getLog(UserDAOHibernate.class);
public User getUser(String username) throws DAOException {
User user = null;
long userId = 0;
try {
userId = Long.parseLong(username);
} catch (NumberFormatException npe) {
}
if (userId != 0) {
return (User) getHibernateTemplate().get(User.class, new Long(userId));
}
List users =
getHibernateTemplate().find("from User u where u.username=?",
username);
if ((users != null) && (users.size() > 0)) {
user = (User) users.get(0);
}
if (user == null) {
log.warn("uh oh, user not found...");
throw new DAOException("User '" + username +
"' not found in database!");
}
return user;
}
public List getUsers(User user) throws DAOException {
return getHibernateTemplate().find("from User u order by upper(u.username)");
}
private void deleteUserRoles(final User user) {
getHibernateTemplate().execute(new HibernateCallback() {
String deleteRolesQuery = "from UserRole r where r.username=?";
public Object doInHibernate(Session ses)
throws HibernateException {
ses.delete(deleteRolesQuery, user.getUsername(),
Hibernate.STRING);
return null;
}
});
}
public User saveUser(final User user) throws DAOException {
if (log.isDebugEnabled()) {
log.debug("user's id: " + user.getId());
}
String countUserQuery =
"select count(*) from User u where u.username=?";
int count =
((Integer) getHibernateTemplate()
.find(countUserQuery, user.getUsername()).iterator()
.next()).intValue();
if (count == 0) {
user.setId(null);
getHibernateTemplate().save(user);
} else {
getHibernateTemplate().saveOrUpdate(user);
deleteUserRoles(user);
}
if (user.getRoles() != null) {
UserRole userRole = null;
for (Iterator it = user.getRoles().iterator(); it.hasNext();) {
userRole = (UserRole) it.next();
userRole.setUserId(user.getId());
userRole.setUsername(user.getUsername());
getHibernateTemplate().save(userRole);
}
}
return getUser(user.getUsername());
}
public void removeUser(User user) throws DAOException {
removeUserCookies(user.getUsername());
user = getUser(user.getUsername());
getHibernateTemplate().delete(user);
}
public UserCookie getUserCookie(String cookieId) throws DAOException {
List cookies =
getHibernateTemplate().find("from UserCookie c where c.cookieId=?",
cookieId);
if (cookies.size() == 0) {
return null;
}
return (UserCookie) cookies.get(0);
}
public void removeUserCookies(String username) {
List cookies =
getHibernateTemplate().find("from UserCookie c where c.username=?",
username);
if ((cookies.size() > 0) && log.isDebugEnabled()) {
log.debug("deleting " + cookies.size() + " cookies for user '" +
username + "'");
}
getHibernateTemplate().deleteAll(cookies);
}
public void saveUserCookie(UserCookie cookie) throws DAOException {
getHibernateTemplate().saveOrUpdate(cookie);
}
}