net.jforum.repository.UserDao.java Source code

Java tutorial

Introduction

Here is the source code for net.jforum.repository.UserDao.java

Source

/*
 * Copyright (c) JForum Team. All rights reserved.
 *
 * The software in this package is published under the terms of the LGPL
 * license a copy of which has been included with this distribution in the
 * license.txt file.
 *
 * The JForum Project
 * http://www.jforum.net
 */
package net.jforum.repository;

import net.jforum.entities.*;
import org.hibernate.Session;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author Guilherme Moreira
 * @author Rafael Steil
 */
@Repository
public class UserDao extends HibernateGenericDAO<User> implements Dao<User> {
    public UserDao(Session session) {
        super(session);
    }

    /**
     * Finds an user by his email
     *
     * @param email the email address to search for
     * @return the user
     */
    public User getByEmail(String email) {
        return (User) session.createCriteria(this.persistClass).add(Restrictions.eq("email", email)).uniqueResult();
    }

    /**
     * Checks if the given username is available for registering
     *
     * @param username the username to check
     * @param email    the email of the given username.
     * @return true if the username is available, of false if either
     *         the username or the email address is already taken
     */
    public boolean isUsernameAvailable(String username, String email) {
        return (Integer) session.createCriteria(User.class).setProjection(Projections.rowCount())
                .add(Restrictions.or(Restrictions.eq("username", username).ignoreCase(),
                        Restrictions.eq("email", email).ignoreCase()))
                .uniqueResult() == 0;
    }

    /**
     * @see UserDao#getTotalUnreadPrivateMessages(net.jforum.entities.User)
     */
    public int getTotalUnreadPrivateMessages(User user) {
        return (Integer) session.createCriteria(PrivateMessage.class).setProjection(Projections.rowCount())
                .add(Restrictions.eq("toUser", user)).add(Restrictions.eq("type", PrivateMessageType.NEW))
                .uniqueResult();
    }

    /**
     * Get the number of posts sent by an user
     *
     * @param user the user
     * @return the number of posts
     */
    public int getTotalPosts(User user) {
        return (Integer) session.createCriteria(Post.class).setProjection(Projections.rowCount())
                .add(Restrictions.eq("user", user)).uniqueResult();
    }

    /**
     * Gets a specific <code>User</code>.
     *
     * @param username The User name to search
     * @return <code>User</code> object containing all the information
     *         or <code>null</code> if no data was found.
     */
    public User getByUsername(String username) {
        return (User) session.createCriteria(this.persistClass).add(Restrictions.eq("username", username))
                .setComment("userDAO.getByUsername").uniqueResult();
    }

    /**
     * Change the state of the "allow avatar" field, by group
     *
     * @param allowAvatar the new state
     * @param group       the group the users belong to
     */
    public void changeAllowAvatarState(boolean allowAvatar, Group group) {
        session.createQuery("update User u set avatarEnabled = :allow where :group in elements(u.groups)")
                .setParameter("allow", allowAvatar).setParameter("group", group).executeUpdate();
    }

    /**
     * Find a set of users who match an input
     *
     * @param username the search input
     * @return the list of users matching the search input
     */
    @SuppressWarnings("unchecked")
    public List<User> findByUserName(String username) {
        return session.createCriteria(this.persistClass)
                .add(Restrictions.ilike("username", username, MatchMode.ANYWHERE)).addOrder(Order.asc("username"))
                .setComment("userDAO.findByUsername").list();
    }

    /**
     * @see UserDao#findByUserName(java.lang.String, java.util.List)
     */
    @SuppressWarnings("unchecked")
    public List<User> findByUserName(String username, List<Group> filterGroups) {
        return session.createQuery("select distinct u from User u left join fetch u.groups g "
                + "where lower(u.username) like lower(:username) " + "and g in (:groups) " + "order by u.username")
                .setParameter("username", "%" + username + "%").setParameterList("groups", filterGroups).list();
    }

    /**
     * Return all registered users
     *
     * @param start the first record to start fetching
     * @param count how many records to fetch
     * @return all registered users
     */
    @SuppressWarnings("unchecked")
    public List<User> getAllUsers(int start, int count) {
        return session.createCriteria(this.persistClass).addOrder(Order.asc("username")).setFirstResult(start)
                .setMaxResults(count).setComment("userDAO.getAllUsers").list();
    }

    /**
     * Return the registered users, filtering by group.
     * This return all users that are associated with at least one of the
     * groups passed as parameter
     *
     * @param start        the first record to start fetching
     * @param count        how many records to fetch
     * @param filterGroups the groups to filter
     * @return all registered users found
     */
    @SuppressWarnings("unchecked")
    public List<User> getAllUsers(int start, int count, List<Group> filterGroups) {
        return session.createQuery("select distinct u from User u join fetch u.groups g where g in(:groups)")
                .setParameterList("groups", filterGroups).list();
    }

    /**
     * Gets the last registered user in the forum
     *
     * @return the user
     */
    public User getLastRegisteredUser() {
        return (User) session.createCriteria(this.persistClass).addOrder(Order.desc("registrationDate"))
                .setMaxResults(1).setCacheable(true).setCacheRegion("userDAO.getLastRegisteredUser")
                .setComment("userDAO.getLastRegisteredUser").list().get(0);
    }

    /**
     * Get the number of users registered in the forum
     *
     * @return
     */
    public int getTotalUsers() {
        return (Integer) session.createCriteria(this.persistClass).setProjection(Projections.rowCount())
                .setCacheable(true).setCacheRegion("userDAO.getTotalUsers").setComment("userDAO.getTotalUsers")
                .uniqueResult();
    }

    /**
     * Autheticates an user
     *
     * @param username the username
     * @param password the password
     * @return an {@link User} instance if sucess, or null otherwise
     */
    public User validateLogin(String username, String password) {
        return (User) session.createCriteria(this.persistClass).add(Restrictions.eq("username", username))
                .add(Restrictions.eq("password", password)).setComment("userDAO.validateLogin").uniqueResult();
    }

    /**
     * Validates the lost password hash
     *
     * @param username the username associated with the hash
     * @param hash     the hash to validate
     * @return the user instance if the provided infromation matches, or null if not.
     */
    public User validateLostPasswordHash(String username, String hash) {
        return (User) session.createCriteria(this.persistClass).add(Restrictions.eq("activationKey", hash))
                .add(Restrictions.eq("username", username)).uniqueResult();
    }

    /**
     * Get the number of topics sent by an user
     *
     * @param userId the user
     * @return the number of posts
     */
    public int getTotalTopics(int userId) {
        return (Integer) session.createCriteria(Topic.class).setProjection(Projections.rowCount())
                .add(Restrictions.eq("user.id", userId)).uniqueResult();
    }

    @SuppressWarnings("unchecked")
    public List<Post> getPosts(User user, int start, int recordsPerPage) {
        return session.createCriteria(Post.class).add(Restrictions.eq("user", user))
                .add(Restrictions.eq("moderate", false)).addOrder(Order.desc("id")).setFirstResult(start)
                .setMaxResults(recordsPerPage).list();
    }

    @SuppressWarnings("unchecked")
    public List<Topic> getTopics(User user, int start, int recordsPerPage) {
        return session.createCriteria(Topic.class).add(Restrictions.eq("user", user))
                .add(Restrictions.eq("pendingModeration", false)).addOrder(Order.desc("id")).setFirstResult(start)
                .setMaxResults(recordsPerPage).list();
    }
}