package edu.lmu.cs.headmaster.ws.dao;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import edu.lmu.cs.headmaster.ws.domain.User;
/**
* Hibernate-based implementation of the user dao.
*/
public class UserDaoHibernateImpl extends HibernateDaoSupport implements UserDao {
@Override
@SuppressWarnings("unchecked")
public User getUserByLogin(String login) {
List<User> result = getHibernateTemplate().find(
"from User u left join fetch u.roles where u.login = ?", login
);
return ((result == null) || (result.size() == 0)) ? null : result.get(0);
}
@Override
public User getUserById(Long id) {
return getHibernateTemplate().get(User.class, id);
}
@Override
public User createUser(User user) {
// If a challengeRequest exists, change the user's challenge to it. Otherwise,
// we let the problem bubble up as an exception (because the challenge property
// cannot be null).
user.setChallenge(user.getChallengeRequest());
getHibernateTemplate().save(user);
return user;
}
@Override
public User createOrUpdateUser(User user) {
// If a challengeRequest exists, change the user's password to it. Otherwise
// keep the challenge the same.
String currentChallenge = (String)(getHibernateTemplate()
.find("select challenge from User where id = ?", user.getId()).get(0));
user.setChallenge(user.getChallengeRequest() != null ?
user.getChallengeRequest() : currentChallenge);
// We must perform a merge instead of saveOrUpdate so that child collections will
// "sync" correctly, including deletions.
//
// This is particularly important if the incoming User object is detached,
// or created outside of Hibernate (e.g., delivered over the network).
//
// A useful blog entry for using saveOrUpdate vs. merge:
// http://www.stevideter.com/2008/12/07/saveorupdate-versus-merge-in-hibernate/
//
// In particular, look at Comment 10 for some discussion of why we should generally
// default to saveOrUpdate until we realize that we need the extra work done by merge.
return getHibernateTemplate().merge(user);
}
}