/* vim: set ts=2 et sw=2 cindent fo=qroca: */ package com.globant.katari.user.domain; import java.util.LinkedList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.hibernate.Criteria; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.globant.katari.user.domain.filter.ContainsFilter; import com.globant.katari.user.domain.filter.Paging; import com.globant.katari.user.domain.filter.Sorting; /** This class is responsible for managing the persistence of users. */ public class UserRepository extends HibernateDaoSupport { /** The class logger. */ private static Logger log = LoggerFactory.getLogger(UserRepository.class); /** Removes the specified user from the database. * * @param user The user to remove. It cannot be null. */ public void remove(final User user) { Validate.notNull(user, "The user cannot be null"); getHibernateTemplate().delete(user); } /** Finds a user by email. * * @param email The email of the user to search for. * * @return Returns the user with the specified email or null if no such user * exists. */ @SuppressWarnings("unchecked") public User findUserByEmail(final String email) { List<User> users = getHibernateTemplate().find("from User where email = ?", email); if (users.isEmpty()) { return null; } else { return users.get(0); } } /** Finds the user with the specified user name. * * @param username The user name of the user to search for. It cannot be * null. * * @return Returns the user with the specified user name, or null if no such * user exists */ @SuppressWarnings("unchecked") public User findUserByName(final String username) { Validate.notNull(username, "The username cannot be null"); getHibernateTemplate().setCacheQueries(true); List<User> users = getHibernateTemplate().find( "from User user where user.name = ?", username); if (users.isEmpty()) { return null; } else { return users.get(0); } } /** Saves a new user or updates an existing user to the database. * * @param user The user to save. It cannot be null. */ public void save(final User user) { Validate.notNull(user, "The user cannot be null"); getHibernateTemplate().saveOrUpdate(user); } /** Gets all the users using a filter. * * @param userFilter Contain filter information. This parameter is passed by * reference to add aditional. It cannot be null. * * @return Returns a list with the user. If there are no users, it returns * the empty list. Never returns null. */ @SuppressWarnings(value = { "unchecked" }) public List<User> getUsers(final UserFilter userFilter) { log.trace("Entering getUsers"); Validate.notNull(userFilter, "The user filter cannot be null"); Criteria criteria = getSession().createCriteria(User.class); criteria.setCacheable(true); // Add the order criteria. Sorting sorting = userFilter.getSorting(); if (!StringUtils.isBlank(sorting.getColumnName())) { if (sorting.isAscendingOrder()) { criteria.addOrder(org.hibernate.criterion.Order.asc(sorting .getColumnName())); } else { criteria.addOrder(org.hibernate.criterion.Order.desc(sorting .getColumnName())); } } // Add the restriction like. ContainsFilter contains = userFilter.getContainsFilter(); if (!StringUtils.isBlank(contains.getColumnName())) { criteria.add(Restrictions.like(contains.getColumnName(), "%" + contains.getValue() + "%")); } // Set the paging configuration. Paging paging = userFilter.getPaging(); if (paging.getPageSize() > 0) { int pageSize = paging.getPageSize(); int totalResult = criteria.list().size(); int totalPageNumber = totalResult / pageSize; if (totalResult % pageSize != 0) { totalPageNumber++; } paging.setTotalPageNumber(totalPageNumber); criteria.setFirstResult(paging.getPageNumber() * pageSize); criteria.setMaxResults(pageSize); } // Obtains the ids of the users matching the conditions. criteria.setProjection(Projections.projectionList().add(Projections.id())); List<Long> ids = criteria.list(); List<User> result = new LinkedList<User>(); if (!ids.isEmpty()) { criteria.add(Restrictions.in("id", ids)); // Clean up from the last critiera run criteria.setProjection(null); criteria.setFirstResult(0); criteria.setMaxResults(Integer.MAX_VALUE); criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); result = criteria.list(); } log.trace("Leaving getUsers"); return result; } /** Finds the user with the specified id. * * @param id The id of the user to search for. * * @return Returns the user with the specified id, or null if no such user * exists. */ public User findUser(final long id) { getHibernateTemplate().setCacheQueries(true); return (User) getHibernateTemplate().get(User.class, id); } }