org.etk.core.membership.hibernate.UserDAOImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.etk.core.membership.hibernate.UserDAOImpl.java

Source

/*
 * Copyright (C) 2009 eXo Platform SAS.
 *
 * This 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 software 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 software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.etk.core.membership.hibernate;

import org.etk.common.utils.LazyPageList;
import org.etk.common.utils.ListAccess;
import org.etk.common.utils.SecurityHelper;
import org.etk.component.database.HibernateService;
import org.etk.component.database.ObjectQuery;
import org.etk.core.membership.ExtendedUserHandler;
import org.etk.core.membership.Query;
import org.etk.core.membership.User;
import org.etk.core.membership.UserEventListener;
import org.etk.core.membership.UserEventListenerHandler;
import org.etk.core.membership.UserHandler;
import org.etk.core.membership.impl.UserImpl;
import org.etk.core.security.PasswordEncrypter;
import org.etk.kernel.cache.CacheService;
import org.etk.kernel.cache.ExoCache;
import org.hibernate.Session;
import org.hibernate.Transaction;

import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * Created by The eXo Platform SAS Author : Mestrallet Benjamin benjmestrallet@users.sourceforge.net
 * Author : Tuan Nguyen tuan08@users.sourceforge.net Date: Aug 22, 2003 Time: 4:51:21 PM
 */
public class UserDAOImpl implements UserHandler, UserEventListenerHandler, ExtendedUserHandler {
    public static final String queryFindUserByName = "from u in class org.etk.core.membership.impl.UserImpl "
            + "where u.userName = ?";

    private HibernateService service_;

    private ExoCache cache_;

    private List<UserEventListener> listeners_ = new ArrayList<UserEventListener>(3);

    public UserDAOImpl(HibernateService service, CacheService cservice) throws Exception {
        service_ = service;
        cache_ = cservice.getCacheInstance(UserImpl.class.getName());
    }

    final public List getUserEventListeners() {
        return listeners_;
    }

    public void addUserEventListener(UserEventListener listener) {
        listeners_.add(listener);
    }

    public User createUserInstance() {
        return new UserImpl();
    }

    public User createUserInstance(String username) {
        return new UserImpl(username);
    }

    public void createUser(User user, boolean broadcast) throws Exception {
        if (broadcast)
            preSave(user, true);

        final Session session = service_.openSession();
        Transaction transaction = SecurityHelper.doPrivilegedAction(new PrivilegedAction<Transaction>() {
            public Transaction run() {
                return session.beginTransaction();
            }
        });

        UserImpl userImpl = (UserImpl) user;
        userImpl.setId(user.getUserName());
        session.save(user);
        if (broadcast)
            postSave(user, true);
        transaction.commit();
    }

    public void saveUser(User user, boolean broadcast) throws Exception {
        if (broadcast)
            preSave(user, false);
        Session session = service_.openSession();
        session.merge(user);
        // session.update(user);
        if (broadcast)
            postSave(user, false);
        session.flush();
        cache_.put(user.getUserName(), user);
    }

    void createUserEntry(User user, Session session) throws Exception {
        session.save(user);
    }

    public User removeUser(String userName, boolean broadcast) throws Exception {
        Session session = service_.openSession();
        User foundUser = findUserByName(userName, session);
        if (foundUser == null)
            return null;

        if (broadcast)
            preDelete(foundUser);
        session = service_.openSession();
        session.delete(foundUser);
        if (broadcast)
            postDelete(foundUser);
        session.flush();
        cache_.remove(userName);
        return foundUser;
    }

    public User findUserByName(String userName) throws Exception {
        User user = (User) cache_.get(userName);
        if (user != null)
            return user;
        Session session = service_.openSession();
        user = findUserByName(userName, session);
        if (user != null)
            cache_.put(userName, user);
        return user;
    }

    public User findUserByName(String userName, Session session) throws Exception {
        User user = (User) service_.findOne(session, queryFindUserByName, userName);
        return user;
    }

    public LazyPageList<User> getUserPageList(int pageSize) throws Exception {
        return new LazyPageList<User>(findAllUsers(), 20);
    }

    public ListAccess<User> findAllUsers() throws Exception {
        String findQuery = "from o in class " + UserImpl.class.getName();
        String countQuery = "select count(o) from " + UserImpl.class.getName() + " o";

        return new SimpleHibernateUserListAccess(service_, findQuery, countQuery);
    }

    public boolean authenticate(String username, String password) throws Exception {
        return authenticate(username, password, null);
    }

    public boolean authenticate(String username, String password, PasswordEncrypter pe) throws Exception {
        User user = findUserByName(username);
        if (user == null) {
            return false;
        }

        boolean authenticated;
        if (pe == null) {
            authenticated = user.getPassword().equals(password);
        } else {
            String encryptedPassword = new String(pe.encrypt(user.getPassword().getBytes()));
            authenticated = encryptedPassword.equals(password);
        }
        if (authenticated) {
            UserImpl userImpl = (UserImpl) user;
            userImpl.setLastLoginTime(Calendar.getInstance().getTime());
            saveUser(userImpl, false);
        }
        return authenticated;
    }

    public LazyPageList<User> findUsers(Query q) throws Exception {
        return new LazyPageList<User>(findUsersByQuery(q), 20);
    }

    public ListAccess<User> findUsersByQuery(Query q) throws Exception {
        ObjectQuery oq = new ObjectQuery(UserImpl.class);
        if (q.getUserName() != null) {
            oq.addLIKE("UPPER(userName)", q.getUserName().toUpperCase());
        }
        if (q.getFirstName() != null) {
            oq.addLIKE("UPPER(firstName)", q.getFirstName().toUpperCase());
        }
        if (q.getLastName() != null) {
            oq.addLIKE("UPPER(lastName)", q.getLastName().toUpperCase());
        }
        oq.addLIKE("email", q.getEmail());
        oq.addGT("lastLoginTime", q.getFromLoginDate());
        oq.addLT("lastLoginTime", q.getToLoginDate());

        return new SimpleHibernateUserListAccess(service_, oq.getHibernateQueryWithBinding(),
                oq.getHibernateCountQueryWithBinding(), oq.getBindingFields());
    }

    public LazyPageList<User> findUsersByGroup(String groupId) throws Exception {
        return new LazyPageList<User>(findUsersByGroupId(groupId), 20);
    }

    public ListAccess<User> findUsersByGroupId(String groupId) throws Exception {
        String queryFindUsersInGroup = "select u " + "from u in class org.etk.core.membership.impl.UserImpl, "
                + "     m in class org.etk.core.membership.impl.MembershipImpl " + "where m.userName = u.userName "
                + "     and m.groupId =  '" + groupId + "'";
        String countUsersInGroup = "select count(u) " + "from u in class org.etk.core.membership.impl.UserImpl, "
                + "     m in class org.etk.core.membership.impl.MembershipImpl " + "where m.userName = u.userName "
                + "  and m.groupId =  '" + groupId + "'";

        return new SimpleHibernateUserListAccess(service_, queryFindUsersInGroup, countUsersInGroup);
    }

    public Collection findUsersByGroupAndRole(String groupName, String role) throws Exception {
        String queryFindUsersByGroupAndRole = "select u "
                + "from u in class org.etk.core.membership.impl.UserImpl, "
                + "     m in class org.etk.core.membership.impl.MembershipImpl, "
                + "     g in class org.etk.core.membership.impl.GroupImpl " + "where m.user = u "
                + "  and m.group = g " + "  and g.groupName = ? " + "  and m.role = ? ";
        Session session = service_.openSession();
        org.hibernate.Query q = session.createQuery(queryFindUsersByGroupAndRole).setString(0, groupName)
                .setString(1, role);
        List users = q.list();
        return users;
    }

    private void preSave(User user, boolean isNew) throws Exception {
        for (UserEventListener listener : listeners_)
            listener.preSave(user, isNew);
    }

    private void postSave(User user, boolean isNew) throws Exception {
        for (UserEventListener listener : listeners_)
            listener.postSave(user, isNew);
    }

    private void preDelete(User user) throws Exception {
        for (UserEventListener listener : listeners_)
            listener.preDelete(user);
    }

    private void postDelete(User user) throws Exception {
        for (UserEventListener listener : listeners_)
            listener.postDelete(user);
    }

    /**
     * {@inheritDoc}
     */
    public List<UserEventListener> getUserListeners() {
        return Collections.unmodifiableList(listeners_);
    }
}