/*******************************************************************************
* Copyright (c) 2012 Dmitry Tikhomirov.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* Dmitry Tikhomirov - initial API and implementation
******************************************************************************/
package org.opensheet.server.dao.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.opensheet.server.dao.AssignmentDAO;
import org.opensheet.server.dao.AssignmentUserDAO;
import org.opensheet.server.dao.AuthDAO;
import org.opensheet.server.dao.UserDAO;
import org.opensheet.server.security.CustomUser;
import org.opensheet.server.utils.Comparators;
import org.opensheet.server.utils.Hash;
import org.opensheet.shared.model.Assignment;
import org.opensheet.shared.model.AssignmentUserDetail;
import org.opensheet.shared.model.Department;
import org.opensheet.shared.model.Permission;
import org.opensheet.shared.model.User;
import org.opensheet.shared.model.UserRate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository("UserDAO")
public class UserDAOImpl implements UserDAO{
@Autowired private SessionFactory sessionFactory;
@Autowired private AuthDAO authDAO;
@Autowired private AssignmentUserDAO assignmentUserDAO;
@Autowired private AssignmentDAO assignmentDAO;
@SuppressWarnings("unchecked")
@Override
@Transactional
public List<User> listUser(String s) {
List<User> users;
if(s.equalsIgnoreCase("any")){
users = new ArrayList<User>(sessionFactory.getCurrentSession().createQuery("from User").list());
}else{
users = new ArrayList<User>(sessionFactory.getCurrentSession().createQuery("from User u where u.status = ?").setString(0, s).list());
}
Collections.sort(users, Comparators.ComparatorUserName);
return users;
}
@Override
@Transactional
public void addUser(User user) {
Permission p = new Permission();
p.setAdmin(false);
p.setDm(false);
p.setFd(false);
p.setPm(false);
UserRate userRate = new UserRate();
userRate.setDate(new Date());
userRate.setInternalRate(0);
sessionFactory.getCurrentSession().save(userRate);
user.setLang("en");
user.setStatus(true);
user.setPermission(p);
user.setPassword(Hash.md5(user.getPassword()));
user.setStart(new Date());
user.setUpdated(new Date());
user.setUserRate(userRate);
sessionFactory.getCurrentSession().save(user);
p.setUser(user);
sessionFactory.getCurrentSession().save(p);
assignmentUserDAO.setAssignmentToUser(assignmentDAO.getDefaultAssignment(), user);
}
/** FIX AUTH
*
*/
@Override
@Transactional
public void updateUser(User u) {
User user = (User) sessionFactory.getCurrentSession().get(User.class, new Integer(u.getId()));
UserRate userrate = user.getUserRate();
user.setLogin(u.getLogin());
user.setFirstName(u.getFirstName());
user.setSecondName(u.getSecondName());
user.setEmail(u.getEmail());
user.setNote(u.getNote());
user.setStatus(u.getStatus());
user.setAuthmethod(u.getAuthmethod());
user.setBranch(u.getBranch());
if(u.getPassword() != null){
if(u.getAuthmethod() == 1 && u.getPassword().equals("********") != true){
user.setPassword(Hash.md5(u.getPassword()));
}
}
// Убрать мертвых пользователей из описания проектво в отделах
user.setDepartment(u.getDepartment());
user.setFinish(u.getFinish());
user.setUpdated(new Date());
userrate.setInternalRate(u.getUserRate().getInternalRate());
userrate.setDate(new Date());
if(user.getStatus() == false){
List<Assignment> fakeList = new ArrayList<Assignment>();
user.setAssignments(fakeList);
}
sessionFactory.getCurrentSession().saveOrUpdate(userrate);
sessionFactory.getCurrentSession().saveOrUpdate(user);
}
@Override
@Transactional
public void updateUserPermission(User u) {
User user = (User) sessionFactory.getCurrentSession().get(User.class, new Integer(u.getId()));
user.setPermission(u.getPermission());
sessionFactory.getCurrentSession().saveOrUpdate(user);
}
/**Save user internal rate
*
*
*/
@Override
@Transactional
public void setUserInternalRate(User u,Integer rate){
User user = this.getUser(u.getId());
user.getUserRate().setInternalRate(rate);
sessionFactory.getCurrentSession().saveOrUpdate(user);
}
/** Get List<User> by their role:
* Maybe better to use enum here?
* @param String:
* pm - project manager,
* dm - department manager,
* admin - administrator
* fd - financial department
* where all users active
* @return List<UserDTO
*/
@SuppressWarnings("unchecked")
@Override
@Transactional
public List<User> getUsersByRole(String s) {
List<User> users;
users = new ArrayList<User>(sessionFactory.getCurrentSession().createQuery("from User u join fetch u.permission as p where u.status=1 and p." + s +"=1 order by u.secondName").
list());
return users;
}
@Override
@Transactional
public List<Assignment> getUserAssignment(User user) {
// User user = (User) sessionFactory.getCurrentSession().get(User.class, new Integer(u.getId()));
List<Assignment> listAssignment = new ArrayList<Assignment>(user.getAssignments() != null ? user.getAssignments().size() : 0);
for(Assignment a: user.getAssignments()){
if(a.getLevel() == 0){
listAssignment.add(a);
}
}
return listAssignment;
}
@Override
@Transactional
public List<Assignment> getUserSubAssignment(User u, Assignment a) {
String hql = "SELECT a FROM Assignment a JOIN a.Users u where a.level=1 and u.id=" + u.getId() + "and a.first!=1 and a.parent.id=" + a.getId() + " GROUP BY a.name";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
@SuppressWarnings("unchecked")
List<Assignment> la = (List<Assignment>) query.list();
return la;
}
/** get User by Login
*
*
*/
@Override
public User getUser(String login) {
User user = (User) sessionFactory.getCurrentSession()
.createQuery("from User u " +
" join fetch u.permission as p " +
" where u.login=?")
.setString(0, login).setFirstResult(0).uniqueResult();
if(user!=null){
return user;
}else{
return null;
}
}
@Override
@Transactional
public User getUser(Integer id) {
User user = (User) sessionFactory.getCurrentSession().createQuery("from User u join " +
"fetch u.department as d " +
"join fetch u.branch as b " +
"join fetch u.userRate as ur " +
"join fetch u.permission as p " +
"where u.id=?").setInteger(0, id).uniqueResult();
return user;
}
/*Check if user is DM but have no departments!
* (non-Javadoc)
* @see org.opensheet.server.dao.UserDAO#getManagedDepartments(org.opensheet.shared.model.User)
*/
@SuppressWarnings("unchecked")
@Override
@Transactional
public List<Department> getManagedDepartments(User user) {
if(user.getPermission().getDm() == true){
List<Department> departments = (List<Department>) sessionFactory.getCurrentSession().createQuery("From Department d where d.status=1 and d.owner=?")
.setInteger(0,user.getId())
.list();
if(departments.size() != 0)
return departments;
}
return Collections.emptyList();
}
@Override
@Transactional
public AssignmentUserDetail getUserAssignmentDetail(User user,Assignment assignment) {
AssignmentUserDetail assignmentPersonDetail = (AssignmentUserDetail) sessionFactory.getCurrentSession().createQuery("from AssignmentUserDetail apd where apd.assignment=? and apd.user=?").
setInteger(0, assignment.getId()).setInteger(1, user.getId()).uniqueResult();
if(assignmentPersonDetail != null){
return assignmentPersonDetail;
}
return null;
}
@Override
@Transactional
public void setUserAssignmentDetail(AssignmentUserDetail a) {
AssignmentUserDetail assignmentUserDetail;
if(a.getId() == null){
assignmentUserDetail = new AssignmentUserDetail();
assignmentUserDetail.setStarted(new Date());
}else{
assignmentUserDetail = (AssignmentUserDetail) sessionFactory.getCurrentSession().get(AssignmentUserDetail.class,a.getId());
}
assignmentUserDetail.setAssignment(a.getAssignment());
assignmentUserDetail.setUser(a.getUser());
assignmentUserDetail.setRate(a.getRate());
assignmentUserDetail.setTimeline(a.getTimeline());
assignmentUserDetail.setUpdated(new Date());
sessionFactory.getCurrentSession().saveOrUpdate(assignmentUserDetail);
}
@SuppressWarnings("unchecked")
@Override
@Transactional
public List<User> getUsersByBranch(String s, Integer branch) {
List<User> users;
if(s.equalsIgnoreCase("any")){
if(branch == 9999999){
users = new ArrayList<User>(sessionFactory.getCurrentSession().createQuery("from User u join fetch u.department as d join fetch u.branch as b order by u.secondName").list());
}else{
users = new ArrayList<User>(sessionFactory.getCurrentSession().createQuery("from User u join fetch u.department as d join fetch u.branch as b where u.branch=? order by u.secondName").setInteger(0, branch).list());
}
}else{
if(branch == 9999999){
users = new ArrayList<User>(sessionFactory.getCurrentSession().createQuery("from User u join fetch u.department as d join fetch u.branch as b where u.status = ? order by u.secondName").setString(0, s).list());
}else{
users = new ArrayList<User>(sessionFactory.getCurrentSession().createQuery("from User u join fetch u.department as d join fetch u.branch as b where u.status = ? and u.branch=? order by u.secondName").setString(0, s).setInteger(1, branch).list());
}
}
if(users.isEmpty()){
return Collections.emptyList();
}
return users;
}
@Override
@Transactional
public User whoIam() {
SecurityContext securityContext = SecurityContextHolder.getContext();
Authentication authentication = securityContext.getAuthentication();
CustomUser customUser = (CustomUser) authentication.getPrincipal();
return getUser(customUser.getId());
}
@Override
@SuppressWarnings("unchecked")
@Transactional
public List<User> getUsersByBranchAndByDepartment(String s, Integer branch, Integer department) {
List<User> users;
if(s.equalsIgnoreCase("any")){
if(branch == 9999999){
users = new ArrayList<User>(sessionFactory.getCurrentSession().createQuery("from User u " +
"join fetch u.department as d join fetch u.branch as b where u.department=?" +
" order by u.secondName").setInteger(0, department).list());
}else{
users = new ArrayList<User>(sessionFactory.getCurrentSession().createQuery("from User u " +
"join fetch u.department as d join fetch u.branch as b where u.branch=? and u.department=?" +
" order by u.secondName").setInteger(0, branch).setInteger(1, department).list());
}
}else{
if(branch == 9999999){
users = new ArrayList<User>(sessionFactory.getCurrentSession().createQuery("from User u " +
"join fetch u.department as d join fetch u.branch as b where u.status = ? and u.department=? " +
" order by u.secondName").setString(0, s).setInteger(1, department).list());
}else{
users = new ArrayList<User>(sessionFactory.getCurrentSession().createQuery("from User u join" +
" fetch u.department as d join fetch u.branch as b where u.status = ? and u.branch=? and" +
" u.department=? order by u.secondName").setString(0, s).setInteger(1, branch).setInteger(2, department).list());
}
}
if(users.isEmpty()){
return Collections.emptyList();
}
return users;
}
@SuppressWarnings("unchecked")
@Override
@Transactional
public List<User> getUsersByDepartment(String s, Integer department) {
List<User> users;
if(s.equalsIgnoreCase("any")){
users = new ArrayList<User>(sessionFactory.getCurrentSession().createQuery("from User u " +
" join fetch u.department as d join fetch u.branch as b where u.department=?" +
" order by u.secondName").setInteger(0, department).list());
}else{
users = new ArrayList<User>(sessionFactory.getCurrentSession().createQuery("from User u " +
" join fetch u.department as d join fetch u.branch as b where u.status = ? and u.department=? " +
" order by u.secondName").setString(0, s).setInteger(1, department).list());
}
if(users.isEmpty()){
return Collections.emptyList();
}
return users;
}
@Override
@Transactional
public void setUsersByDepartmentAndByAssignment(List<User> users,Department department, Assignment assignment) {
List<User> usersAssignment = assignment.getUsers();
for(User u: department.getUsers()){
if(users.contains(u)){
if(!usersAssignment.contains(u)){
usersAssignment.add(u);
}
}else{
if(usersAssignment.contains(u)){
usersAssignment.remove(u);
}
}
}
assignment.setUsers(usersAssignment);
sessionFactory.getCurrentSession().save(assignment);
}
@Override
@Transactional
public void setLang(User u) {
User user = this.getUser(u.getId());
user.setLang(u.getLang());
}
}