package org.multibit.mbm.db.dao.hibernate; import com.google.common.base.Optional; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.jasypt.util.password.StrongPasswordEncryptor; import org.multibit.mbm.db.dao.UserDao; import org.multibit.mbm.core.model.User; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.stereotype.Repository; import java.sql.SQLException; import java.util.List; @Repository("hibernateUserDao") public class HibernateUserDao extends BaseHibernateDao<User> implements UserDao { @SuppressWarnings("unchecked") @Override public Optional<User> getById(Long id) { return getById(User.class, id); } @SuppressWarnings("unchecked") @Override public Optional<User> getByApiKey(String uuid) { List users = hibernateTemplate.find("from User u where u.apiKey = ?", uuid); return first(users); } @Override @SuppressWarnings("unchecked") public Optional<User> getByCredentials(String username, String passwordDigest) { List<User> users = hibernateTemplate.find("from User u where u.username = ? ", username); if (isNotFound(users)) return Optional.absent(); StrongPasswordEncryptor passwordEncryptor = new StrongPasswordEncryptor(); // Check the password against all matching Users for (User user : users) { if (passwordEncryptor.checkPassword(passwordDigest, user.getPasswordDigest())) { return Optional.of(initialized(user)); } } // Must have failed to be here return Optional.absent(); } /** * Initialize various collections since we are targeting the individual entity (perhaps for display) * * @param entity The entity * * @return The entity with all collections initialized */ @Override protected User initialized(User entity) { hibernateTemplate.initialize(entity.getContactMethodMap()); if (entity.getCustomer() != null) { hibernateTemplate.initialize(entity.getCustomer()); } if (entity.getSupplier() != null) { hibernateTemplate.initialize(entity.getSupplier()); } return entity; } @SuppressWarnings("unchecked") public List<User> getAllByPage(final int pageSize, final int pageNumber) { return (List<User>) hibernateTemplate.executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery("from User"); query.setMaxResults(pageSize); query.setFirstResult(pageSize * pageNumber); return query.list(); } }); } @Override public User saveOrUpdate(User user) { hibernateTemplate.saveOrUpdate(user); return user; } /** * Force an immediate in-transaction flush (normally only used in test code) */ public void flush() { hibernateTemplate.flush(); } public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } }