/** * Copyright (C) 2011 JTalks.org Team * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ package org.jtalks.poulpe.model.dao.hibernate; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import org.hibernate.criterion.SimpleExpression; import org.hibernate.type.StandardBasicTypes; import org.jtalks.common.model.dao.hibernate.GenericDao; import org.jtalks.common.model.entity.Group; import org.jtalks.common.model.entity.User; import org.jtalks.poulpe.model.dao.UserDao; import org.jtalks.poulpe.model.dao.utils.SqlLikeEscaper; import org.jtalks.poulpe.model.entity.PoulpeUser; import org.jtalks.poulpe.model.pages.Pagination; import org.jtalks.poulpe.model.sorting.UserSearchRequest; import java.math.BigInteger; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; /** * Hibernate implementation of UserDao. * * @author Vyacheslav Zhivaev * @author Alexey Grigorev * @author Mikhail Zaitsev */ public class UserHibernateDao extends GenericDao<PoulpeUser> implements UserDao { private static final String FORMAT = "%{0}%"; /** * @param sessionFactory The SessionFactory. */ public UserHibernateDao(SessionFactory sessionFactory) { super(sessionFactory, PoulpeUser.class); } /** * {@inheritDoc} */ @Override public List<PoulpeUser> findPoulpeUsersPaginated(String searchString, Pagination paginate) { searchString = SqlLikeEscaper.escapeControlCharacters(searchString); Query query = session().getNamedQuery("findUsersByLikeUsername"); query.setString("username", MessageFormat.format(FORMAT, searchString)); paginate.addPagination(query); return query.list(); } /** * {@inheritDoc} */ @Override public List<PoulpeUser> findPoulpeUsersBySearchRequest(UserSearchRequest searchRequest) { String searchString = SqlLikeEscaper.escapeControlCharacters(searchRequest.getSearchString()); SimpleExpression expression = Restrictions.like("username", MessageFormat.format(FORMAT, searchString)).ignoreCase(); Criteria criteria = session().createCriteria(PoulpeUser.class) .add((searchRequest.isCaseSensitise()) ? expression : expression.ignoreCase()) .addOrder(getOrder(searchRequest)); searchRequest.getPagination().addPagination(criteria); return criteria.list(); } /** * {@inheritDoc} */ @Override public int countUsernameMatches(String searchString) { searchString = SqlLikeEscaper.escapeControlCharacters(searchString); Query query = session().getNamedQuery("countUsersByLikeUsername"); query.setString("username", MessageFormat.format(FORMAT, searchString)); Number result = (Number) query.uniqueResult(); return result.intValue(); } /** * {@inheritDoc} */ @Override public PoulpeUser getByUsername(String username) { Query query = session().getNamedQuery("findUsersByUsername"); query.setString("username", username); return (PoulpeUser) query.uniqueResult(); } /** * {@inheritDoc} */ @Override public PoulpeUser getByEmail(String email) { Query query = session().getNamedQuery("findUsersByEmail"); query.setString("email", email); return (PoulpeUser) query.uniqueResult(); } /** * {@inheritDoc} */ @Override public PoulpeUser getByUUID(String uuid) { Query query = session().getNamedQuery("findUsersByUUID"); query.setString("uuid", uuid); return (PoulpeUser) query.uniqueResult(); } /** * {@inheritDoc} */ @Override public List<PoulpeUser> getUsersInGroups(List<Group> groups) { Query query = session().getNamedQuery("findBannedUsers"); ArrayList groupsIds = new ArrayList(); for (Group group : groups) { groupsIds.add(new BigInteger(group.getId() + "")); } query.setParameterList("bannedGroups", groupsIds, StandardBasicTypes.BIG_INTEGER); //noinspection unchecked return query.list(); } @Override public List<PoulpeUser> findUsersByUsernameAndPasswordHash(String username, String passwordHash) { Query query = session().getNamedQuery("findUsersByUsernameAndPasswordHash"); query.setString("username", username); query.setString("password", passwordHash); return query.list(); } /** * {@inheritDoc} */ @Override public List<PoulpeUser> findUsersNotInGroups(String availableFilterText, List<Group> groups, Pagination paginate) { availableFilterText = SqlLikeEscaper.escapeControlCharacters(availableFilterText); Query query = session().getNamedQuery("findUnbannedUsersByLikeUsername"); query.setString("username", MessageFormat.format(FORMAT, availableFilterText)); ArrayList groupsIds = new ArrayList(); for (Group group : groups) { groupsIds.add(new BigInteger(group.getId() + "")); } query.setParameterList("bannedGroups", groupsIds, StandardBasicTypes.BIG_INTEGER); paginate.addPagination(query); //noinspection unchecked return query.list(); } /** * {@inheritDoc} */ @Override public List<PoulpeUser> findUsersNotInList(String availableFilterText, List<PoulpeUser> listUsers, Pagination paginate) { availableFilterText = SqlLikeEscaper.escapeControlCharacters(availableFilterText); ArrayList<Long> ids = new ArrayList<Long>(); for (PoulpeUser b : listUsers) { ids.add(b.getId()); } Query query = null; if (ids.size() == 0) { query = session().getNamedQuery("findEnabledUsersByLikeUsername"); } else { query = session().getNamedQuery("findEnabledUsersByLikeUsernameNotInList"); query.setParameterList("listUsers", ids); } query.setString("username", MessageFormat.format(FORMAT, availableFilterText)); paginate.addPagination(query); return query.list(); } /** * {@inheritDoc} */ @Override public void save(User user) { session().save(user); session().flush(); } /** * Returns order of sorting by sorting request * * @param request sorting request * @return order */ private Order getOrder(UserSearchRequest request) { if (request.isAscending()) { return Order.asc(request.getColumn()).ignoreCase(); } else { return Order.desc(request.getColumn()).ignoreCase(); } } }