Package com.apress.progwt.server.dao.hibernate

Source Code of com.apress.progwt.server.dao.hibernate.UserDAOHibernateImpl

/*
* Copyright 2008 Jeff Dwyer
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.apress.progwt.server.dao.hibernate;

import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.FetchMode;
import org.hibernate.Hibernate;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Expression;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.support.DataAccessUtils;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.security.userdetails.UserDetailsService;
import org.springframework.security.userdetails.UsernameNotFoundException;

import com.apress.progwt.client.domain.Application;
import com.apress.progwt.client.domain.User;
import com.apress.progwt.server.dao.UserDAO;
import com.apress.progwt.server.domain.ServerSideUser;

public class UserDAOHibernateImpl extends HibernateDaoSupport implements
        UserDAO, UserDetailsService {

    private static final Logger log = Logger
            .getLogger(UserDAOHibernateImpl.class);

    // private UserService userService;

    public void delete(User user) {
        getHibernateTemplate().delete(user);
    }

    public List<User> getAllUsers() {
        return getAllUsers(1000);
    }

    public List<User> getAllUsers(int max) {
        DetachedCriteria crit = DetachedCriteria.forClass(User.class);

        List<User> posts = getHibernateTemplate().findByCriteria(crit, 0,
                max);
        return posts;
    }

    /**
     * Uses username.toLowerCase()
     */
    public User getUserByUsername(String username)
            throws UsernameNotFoundException {

        log.debug("Inited");

        List<User> list = getHibernateTemplate().findByNamedParam(
                "from User where lower(username) = :name", "name",
                username.toLowerCase());
        log.debug("list " + list);
        log.debug("list " + list.size());

        if (list.size() != 1) {
            if (!username.equals("anonymousUser")) {
                log.debug("getUserByUsername UsernameNotFoundException "
                        + list.size() + " users for " + username);
            }
            throw new UsernameNotFoundException(
                    "Username not found or duplicate: " + username);
        } else {
            log.debug("load user success " + list.get(0));
            User u = (User) list.get(0);
            log.debug("user: " + u);
            return u;
        }

        // return (User)
        // DataAccessUtils.uniqueResult(getHibernateTemplate().findByNamedParam("from
        // User where username = :name", "name", username));
    }

    public User getUserForId(long id) {
        log.debug("DAOhere user for id " + id);
        return (User) DataAccessUtils.uniqueResult(getHibernateTemplate()
                .findByNamedParam("from User where id = :id", "id", id));
    }

    /**
     * Uses username.toLowerCase()
     */
    public ServerSideUser loadUserByUsername(String username)
            throws UsernameNotFoundException, DataAccessException {

        log.debug("here");
        if (username == null) {
            throw new UsernameNotFoundException("Username null not found");
        }
        List<User> users = getHibernateTemplate().findByNamedParam(
                "from User where username = :name", "name",
                username.toLowerCase());

        log.debug("Found " + users.size() + " users for username "
                + username);

        if (users.size() != 1) {
            if (users.size() != 0) {
                throw new UsernameNotFoundException(
                        "Duplicate Username Problem: " + username);
            } else {

                // if OpenID
                // consider returning a ROLE 'TRANSIENT_OpenID' user...

                throw new UsernameNotFoundException(
                        "Username not found: " + username);
            }
        } else {
            log.debug("load user success " + users.get(0));
            User u = users.get(0);
            return new ServerSideUser(u);
        }
    }

    /**
     * Save, ensuring that newly created users have the 'none'
     * subscription first. (non-Javadoc)
     *
     * @see com.aavu.server.dao.UserDAO#save(com.aavu.client.domain.User)
     */
    public User save(User user) {
        log.warn(user);

        getHibernateTemplate().saveOrUpdate(user);
        return user;
    }

    public User getForPaypalID(String paypalID) {
        return (User) DataAccessUtils.uniqueResult(getHibernateTemplate()
                .findByNamedParam("from User where paypalId = :id", "id",
                        paypalID));
    }

    /**
     * use iterate() to avoid returning rows. Hibernate ref "11.13. Tips &
     * Tricks"
     *
     * grrrrr... started throwing a classcastexception, but not
     * repeatable..
     */
    public long getUserCount() {
        try {
            return (Long) getHibernateTemplate().iterate(
                    "select count(*) from User").next();
        } catch (ClassCastException e) {
            log.error(e.getMessage());
            return 10000;
        }
    }

    /**
     * add all fetch mode concerns to the critera. without
     * DISTINCT_ROOT_ENTITY these fetches will create multiple rows
     *
     * If we join both schoolRankings & processTypes, we'll get duplicates
     * again. Fetch one of the collections with a SELECT and initialize
     * instead. Test in UserServiceImpl.testFetch()
     *
     * Same with the process of each schoolRanking. Note, this is N+1
     * selects.
     *
     * @param crit
     * @return
     */
    private User fetchAllUser(DetachedCriteria crit) {
        crit.setFetchMode("schoolRankings", FetchMode.JOIN).setFetchMode(
                "schoolRankings.school", FetchMode.JOIN).setFetchMode(
                "schoolRankings.process", FetchMode.SELECT).setFetchMode(
                "processTypes", FetchMode.SELECT).setResultTransformer(
                CriteriaSpecification.DISTINCT_ROOT_ENTITY);

        User rtn = (User) DataAccessUtils
                .uniqueResult(getHibernateTemplate().findByCriteria(crit));
        Hibernate.initialize(rtn.getProcessTypes());
        Hibernate.initialize(rtn.getRatingTypes());
        for (Application application : rtn.getSchoolRankings()) {
            Hibernate.initialize(application.getProcess());
            Hibernate.initialize(application.getRatings());
        }
       
        log.debug("fetched user: "+rtn.getNickname()+" ratings "+rtn.getRatingTypes().size());
       
        // Hibernate.initialize(rtn.getSchoolRankings());
        return rtn;

    }

    public User getUserByNicknameFetchAll(String nickname) {

        return fetchAllUser(DetachedCriteria.forClass(User.class).add(
                Expression.eq("nickname", nickname.toLowerCase())));
    }

    public User getUserByUsernameFetchAll(String username) {
        return fetchAllUser(DetachedCriteria.forClass(User.class).add(
                Expression.eq("username", username)));
    }

}
TOP

Related Classes of com.apress.progwt.server.dao.hibernate.UserDAOHibernateImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.