blob: d341d79a89d8d940e40de5096a9b29ad782a1a77 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.openmeetings.data.user.dao;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import org.apache.commons.lang3.StringUtils;
import org.apache.openjpa.persistence.OpenJPAPersistence;
import org.apache.openjpa.persistence.OpenJPAQuery;
import org.apache.openmeetings.OpenmeetingsVariables;
import org.apache.openmeetings.data.IDataProviderDao;
import org.apache.openmeetings.data.basic.dao.ConfigurationDao;
import org.apache.openmeetings.data.basic.dao.OmTimeZoneDao;
import org.apache.openmeetings.persistence.beans.user.Address;
import org.apache.openmeetings.persistence.beans.user.User;
import org.apache.openmeetings.utils.DaoHelper;
import org.apache.openmeetings.utils.crypt.ManageCryptStyle;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
/**
* CRUD operations for {@link User}
*
* @author swagner, solomax
*
*/
@Transactional
public class UsersDao implements IDataProviderDao<User> {
private static final Logger log = Red5LoggerFactory.getLogger(
UsersDao.class, OpenmeetingsVariables.webAppRootKey);
public final static String[] searchFields = {"lastname", "firstname", "login", "adresses.email"};
@PersistenceContext
private EntityManager em;
@Autowired
private ManageCryptStyle cryptManager;
@Autowired
private ConfigurationDao configurationDao;
@Autowired
private OmTimeZoneDao omTimeZoneDaoImpl;
@Autowired
private StateDao stateDaoImpl;
/**
* Get a new instance of the {@link User} entity, with all default values
* set
*
* @param currentUser
* the timezone of the current user is copied to the new default
* one (if the current user has one)
* @return
*/
public User getNewUserInstance(User currentUser) {
User user = new User();
user.setSalutations_id(1L); // TODO: Fix default selection to be
// configurable
user.setLevel_id(1L);
user.setLanguage_id(configurationDao.getConfValue(
"default_lang_id", Long.class, "1"));
user.setOmTimeZone(omTimeZoneDaoImpl.getDefaultOmTimeZone(currentUser));
user.setForceTimeZoneCheck(false);
user.setSendSMS(false);
user.setAge(new Date());
Address adresses = new Address();
adresses.setStates(stateDaoImpl.getStateById(1L));
user.setAdresses(adresses);
user.setStatus(1);
user.setShowContactData(false);
user.setShowContactDataToContacts(false);
return user;
}
public List<User> get(int first, int count) {
TypedQuery<User> q = em.createNamedQuery("getNondeletedUsers", User.class);
q.setFirstResult(first);
q.setMaxResults(count);
return q.getResultList();
}
public List<User> get(String search, int start, int count, String sort) {
TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", search, true, false, sort, searchFields), User.class);
q.setFirstResult(start);
q.setMaxResults(count);
return q.getResultList();
}
public long count() {
// get all users
TypedQuery<Long> q = em.createNamedQuery("countNondeletedUsers", Long.class);
return q.getSingleResult();
}
public long count(String search) {
TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", search, true, true, null, searchFields), Long.class);
return q.getSingleResult();
}
public List<User> get(String search) {
TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", search, true, false, null, searchFields), User.class);
return q.getResultList();
}
public User update(User u, Long userId) {
if (u.getUser_id() == null) {
u.setStarttime(new Date());
em.persist(u);
} else {
u.setUpdatetime(new Date());
u = em.merge(u);
}
return u;
}
public void delete(User u, Long userId) {
deleteUserID(u.getUser_id());
}
public User get(long user_id) {
if (user_id > 0) {
try {
TypedQuery<User> query = em.createNamedQuery("getUserById",
User.class);
query.setParameter("user_id", user_id);
User users = null;
try {
users = query.getSingleResult();
} catch (NoResultException ex) {
}
return users;
} catch (Exception ex2) {
log.error("getUser", ex2);
}
} else {
log.info("[getUser] " + "Info: No USER_ID given");
}
return null;
}
public Long deleteUserID(long userId) {
try {
if (userId != 0) {
User us = get(userId);
us.setDeleted(true);
us.setUpdatetime(new Date());
us.setSipUser(null);
Address adr = us.getAdresses();
if (adr != null) {
adr.setDeleted(true);
}
if (us.getUser_id() == null) {
em.persist(us);
} else {
if (!em.contains(us)) {
em.merge(us);
}
}
return us.getUser_id();
}
} catch (Exception ex2) {
log.error("[deleteUserID]", ex2);
}
return null;
}
public List<User> getAllUsers() {
try {
TypedQuery<User> q = em.createNamedQuery("getNondeletedUsers", User.class);
return q.getResultList();
} catch (Exception ex2) {
log.error("[getAllUsers] ", ex2);
}
return null;
}
public List<User> getAllUsersDeleted() {
try {
TypedQuery<User> q = em.createNamedQuery("getAllUsers",
User.class);
@SuppressWarnings("unchecked")
OpenJPAQuery<User> kq = OpenJPAPersistence.cast(q);
kq.getFetchPlan().addFetchGroup("backupexport");
return kq.getResultList();
} catch (Exception ex2) {
log.error("[getAllUsersDeleted] ", ex2);
}
return null;
}
/**
* check for duplicates
*
* @param DataValue
* @return
*/
public boolean checkUserLogin(String DataValue) {
try {
TypedQuery<User> query = em
.createNamedQuery("checkUserLogin", User.class);
query.setParameter("DataValue", DataValue);
query.setParameter("deleted", true);
int count = query.getResultList().size();
if (count != 0) {
return false;
}
} catch (Exception ex2) {
log.error("[checkUserData]", ex2);
}
return true;
}
public User getUserByName(String login) {
try {
TypedQuery<User> query = em.createNamedQuery("getUserByName", User.class);
query.setParameter("login", login);
query.setParameter("deleted", true);
User us = null;
try {
us = query.getSingleResult();
} catch (NoResultException ex) {
}
return us;
} catch (Exception e) {
log.error("[getUserByAdressesId]", e);
}
return null;
}
public User getUserByEmail(String email) {
try {
TypedQuery<User> query = em.createNamedQuery("getUserByEmail", User.class);
query.setParameter("email", email);
query.setParameter("deleted", true);
User us = null;
try {
us = query.getSingleResult();
} catch (NoResultException ex) {
}
return us;
} catch (Exception e) {
log.error("[getUserByAdressesId]", e);
}
return null;
}
public Object getUserByHash(String hash) {
try {
if (hash.length() == 0)
return new Long(-5);
TypedQuery<User> query = em.createNamedQuery("getUserByHash", User.class);
query.setParameter("resethash", hash);
query.setParameter("deleted", true);
User us = null;
try {
us = query.getSingleResult();
} catch (NoResultException ex) {
}
if (us != null) {
return us;
} else {
return new Long(-5);
}
} catch (Exception e) {
log.error("[getUserByAdressesId]", e);
}
return new Long(-1);
}
public Object resetPassByHash(String hash, String pass) {
try {
Object u = this.getUserByHash(hash);
if (u instanceof User) {
User us = (User) u;
us.updatePassword(cryptManager, configurationDao, pass);
us.setResethash("");
update(us, -1L);
return new Long(-8);
} else {
return u;
}
} catch (Exception e) {
log.error("[getUserByAdressesId]", e);
}
return new Long(-1);
}
/**
* @param search
* @return
*/
public Long selectMaxFromUsersWithSearch(String search) {
try {
// get all users
TypedQuery<Long> query = em.createNamedQuery("selectMaxFromUsersWithSearch", Long.class);
query.setParameter("search", StringUtils.lowerCase(search));
List<Long> ll = query.getResultList();
log.info("selectMaxFromUsers" + ll.get(0));
return ll.get(0);
} catch (Exception ex2) {
log.error("[selectMaxFromUsers] ", ex2);
}
return null;
}
/**
* Returns true if the password is correct
*
* @param userId
* @param password
* @return
*/
public boolean verifyPassword(Long userId, String password) {
TypedQuery<Long> query = em.createNamedQuery("checkPassword",
Long.class);
query.setParameter("userId", userId);
query.setParameter("password", cryptManager.getInstanceOfCrypt()
.createPassPhrase(password));
return query.getResultList().get(0) == 1;
}
}