/*
* 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.jdbc;
import java.util.Calendar;
import java.util.List;
import org.etk.common.logging.Logger;
import org.etk.common.utils.LazyPageList;
import org.etk.common.utils.ListAccess;
import org.etk.component.base.event.ListenerService;
import org.etk.component.database.DBObjectMapper;
import org.etk.component.database.DBObjectQuery;
import org.etk.component.database.ExoDatasource;
import org.etk.component.database.StandardSQLDAO;
import org.etk.core.membership.ExtendedUserHandler;
import org.etk.core.membership.Group;
import org.etk.core.membership.GroupHandler;
import org.etk.core.membership.Membership;
import org.etk.core.membership.MembershipHandler;
import org.etk.core.membership.OrganizationService;
import org.etk.core.membership.Query;
import org.etk.core.membership.User;
import org.etk.core.membership.UserEventListener;
import org.etk.core.membership.UserHandler;
import org.etk.core.security.PasswordEncrypter;
import org.etk.kernel.container.ApplicationContainer;
/**
* Created by The eXo Platform SAS Apr 7, 2007
*/
public class UserDAOImpl extends StandardSQLDAO<UserImpl> implements UserHandler, ExtendedUserHandler
{
protected static Logger log = Logger.getLogger(UserDAOImpl.class);
protected ListenerService listenerService_;
public UserDAOImpl(ListenerService lService, ExoDatasource datasource, DBObjectMapper<UserImpl> mapper)
{
super(datasource, mapper, UserImpl.class);
listenerService_ = lService;
}
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 (log.isDebugEnabled())
log.debug("----------- CREATE USER " + user.getUserName());
UserImpl userImpl = (UserImpl)user;
if (broadcast)
listenerService_.broadcast(UserHandler.PRE_CREATE_USER_EVENT, this, userImpl);
super.save(userImpl);
if (broadcast)
listenerService_.broadcast(UserHandler.POST_CREATE_USER_EVENT, this, userImpl);
}
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 (log.isDebugEnabled())
{
log.debug("+++++++++++AUTHENTICATE USERNAME " + username + " AND PASS " + password + " - " + authenticated);
}
if (authenticated)
{
UserImpl userImpl = (UserImpl)user;
userImpl.setLastLoginTime(Calendar.getInstance().getTime());
saveUser(userImpl, false);
}
return authenticated;
}
public User findUserByName(String userName) throws Exception
{
DBObjectQuery<UserImpl> query = new DBObjectQuery<UserImpl>(UserImpl.class);
query.addLIKE("USER_NAME", userName);
User user = loadUnique(query.toQuery());;
if (log.isDebugEnabled())
log.debug("+++++++++++FIND USER BY USER NAME " + userName + " - " + (user != null));
return user;
}
public LazyPageList<User> findUsers(Query orgQuery) throws Exception
{
return new LazyPageList<User>(findUsersByQuery(orgQuery), 20);
}
/**
* Query( name = "" , standardSQL = "..." oracleSQL = "..." )
*/
public ListAccess<User> findUsersByQuery(Query orgQuery) throws Exception
{
DBObjectQuery dbQuery = new DBObjectQuery<UserImpl>(UserImpl.class);
if (orgQuery.getUserName() != null)
{
dbQuery.addLIKE("UPPER(USER_NAME)", orgQuery.getUserName().toUpperCase());
}
if (orgQuery.getFirstName() != null)
{
dbQuery.addLIKE("UPPER(FIRST_NAME)", orgQuery.getFirstName().toUpperCase());
}
if (orgQuery.getLastName() != null)
{
dbQuery.addLIKE("UPPER(LAST_NAME)", orgQuery.getLastName().toUpperCase());
}
dbQuery.addLIKE("EMAIL", orgQuery.getEmail());
dbQuery.addGT("LAST_LOGIN_TIME", orgQuery.getFromLoginDate());
dbQuery.addLT("LAST_LOGIN_TIME", orgQuery.getToLoginDate());
return new SimpleJDBCUserListAccess(this, dbQuery.toQuery(), dbQuery.toCountQuery());
}
public LazyPageList<User> findUsersByGroup(String groupId) throws Exception
{
return new LazyPageList<User>(findUsersByGroupId(groupId), 20);
}
public ListAccess<User> findUsersByGroupId(String groupId) throws Exception
{
if (log.isDebugEnabled())
log.debug("+++++++++++FIND USER BY GROUP_ID " + groupId);
ApplicationContainer manager = ApplicationContainer.getInstance();
OrganizationService service = (OrganizationService)manager.getComponentInstanceOfType(OrganizationService.class);
MembershipHandler membershipHandler = service.getMembershipHandler();
GroupHandler groupHandler = service.getGroupHandler();
Group group = groupHandler.findGroupById(groupId);
@SuppressWarnings("unchecked")
List<Membership> members = (List<Membership>)membershipHandler.findMembershipsByGroup(group);
DBObjectQuery dbQuery = new DBObjectQuery<UserImpl>(UserImpl.class);
for (Membership member : members)
{
dbQuery.addLIKE("USER_NAME", member.getUserName());
/*
User g = findUserByName(member.getUserName());
if (g != null)
users.add(g);
*/
}
return new SimpleJDBCUserListAccess(this, dbQuery.toQueryUseOR(), dbQuery.toCountQueryUseOR());
}
public LazyPageList<User> getUserPageList(int pageSize) throws Exception
{
return new LazyPageList<User>(findAllUsers(), pageSize);
}
public ListAccess<User> findAllUsers() throws Exception
{
DBObjectQuery dbQuery = new DBObjectQuery<UserImpl>(UserImpl.class);
return new SimpleJDBCUserListAccess(this, dbQuery.toQuery(), dbQuery.toCountQuery());
}
public User removeUser(String userName, boolean broadcast) throws Exception
{
UserImpl userImpl = (UserImpl)findUserByName(userName);
if (userImpl == null)
return null;
if (broadcast)
listenerService_.broadcast(UserHandler.PRE_DELETE_USER_EVENT, this, userImpl);
super.remove(userImpl);
if (broadcast)
listenerService_.broadcast(UserHandler.POST_DELETE_USER_EVENT, this, userImpl);
return userImpl;
}
public void saveUser(User user, boolean broadcast) throws Exception
{
UserImpl userImpl = (UserImpl)user;
if (broadcast)
listenerService_.broadcast(UserHandler.PRE_UPDATE_USER_EVENT, this, userImpl);
super.update(userImpl);
if (broadcast)
listenerService_.broadcast(UserHandler.POST_UPDATE_USER_EVENT, this, userImpl);
}
@SuppressWarnings("unused")
public void addUserEventListener(UserEventListener listener)
{
}
}