package org.appfuse.dao.hibernate; import org.appfuse.dao.UserDao; import org.appfuse.model.User; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; import org.springframework.orm.hibernate3.SessionFactoryUtils; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Repository; import javax.persistence.Table; import java.util.List; /** * This class interacts with Spring's HibernateTemplate to save/delete and * retrieve User objects. * * @author Matt Raible * Modified by Dan Kibler * Extended to implement Acegi UserDetailsService interface by David Carter david@carter.net * Modified by Bryan Noll to work with * the new BaseDaoHibernate implementation that uses generics. */ @Repository("userDao") public class UserDaoHibernate extends GenericDaoHibernate implements UserDao, UserDetailsService { /** * Constructor that sets the entity to User.class. */ public UserDaoHibernate() { super(User.class); } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") public List getUsers() { return getHibernateTemplate().find("from User u order by upper(u.username)"); } /** * {@inheritDoc} */ public User saveUser(User user) { if (log.isDebugEnabled()) log.debug("user's id: " + user.getId()); getHibernateTemplate().saveOrUpdate(user); // necessary to throw a DataIntegrityViolation and catch it in UserManager getHibernateTemplate().flush(); return user; } /** * Overridden simply to call the saveUser method. This is happenening * because saveUser flushes the session and saveObject of BaseDaoHibernate * does not. * * @param user the user to save * @return the modified user (with a primary key set if they're new) */ @Override public User save(User user) { return this.saveUser(user); } /** * {@inheritDoc} */ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { List users = getHibernateTemplate().find("from User where username=?", username); if (users == null || users.isEmpty()) { throw new UsernameNotFoundException("user '" + username + "' not found..."); } else { return (UserDetails) users.get(0); } } /** * {@inheritDoc} */ public String getUserPassword(String username) { SimpleJdbcTemplate jdbcTemplate = new SimpleJdbcTemplate(SessionFactoryUtils.getDataSource(getSessionFactory())); Table table = AnnotationUtils.findAnnotation(User.class, Table.class); return jdbcTemplate.queryForObject( "select password from " + table.name() + " where username=?", String.class, username); } }