UserDAOImpl.java

  1. package org.itracker.persistence.dao;

  2. import org.hibernate.Criteria;
  3. import org.hibernate.HibernateException;
  4. import org.hibernate.Query;
  5. import org.hibernate.criterion.DetachedCriteria;
  6. import org.hibernate.criterion.Expression;
  7. import org.hibernate.criterion.Order;
  8. import org.hibernate.criterion.Restrictions;
  9. import org.itracker.model.Permission;
  10. import org.itracker.model.PermissionType;
  11. import org.itracker.model.User;

  12. import java.util.*;

  13. /**
  14.  *
  15.  */
  16. public class UserDAOImpl extends BaseHibernateDAOImpl<User> implements UserDAO {

  17.     public User findByPrimaryKey(Integer userId) {
  18.         User user;

  19.         try {
  20.             user = (User) getSession().get(User.class, userId);
  21.         } catch (HibernateException ex) {
  22.             throw convertHibernateAccessException(ex);
  23.         }
  24.         return user;
  25.     }

  26.     public User findByLogin(String login) {
  27.         User user;

  28.         try {
  29.             Query query = getSession().getNamedQuery("UserByLoginQuery");
  30.             query.setString("login", login);
  31.             user = (User) query.uniqueResult();
  32.         } catch (HibernateException ex) {
  33.             throw convertHibernateAccessException(ex);
  34.         }
  35.         return user;
  36.     }

  37.     @SuppressWarnings("unchecked")
  38.     public List<User> findAll() {
  39.         List<User> users;

  40.         try {
  41.             Query query = getSession().getNamedQuery("UsersAllQuery");
  42.             users = query.list();
  43.         } catch (HibernateException ex) {
  44.             throw convertHibernateAccessException(ex);
  45.         }
  46.         return users;
  47.     }

  48.     @SuppressWarnings("unchecked")
  49.     public List<User> findActive() {
  50.         List<User> users;

  51.         try {
  52.             Query query = getSession().getNamedQuery("UsersActiveQuery");
  53.             users = query.list();
  54.         } catch (HibernateException ex) {
  55.             throw convertHibernateAccessException(ex);
  56.         }
  57.         return users;
  58.     }

  59.     @SuppressWarnings("unchecked")
  60.     public List<User> findByStatus(int status) {
  61.         List<User> users;

  62.         try {
  63.             Query query = getSession().getNamedQuery("UsersByStatusQuery");
  64.             query.setInteger("userStatus", status);
  65.             users = query.list();
  66.         } catch (HibernateException ex) {
  67.             throw convertHibernateAccessException(ex);
  68.         }
  69.         return users;
  70.     }

  71.     @SuppressWarnings("unchecked")
  72.     public List<User> findSuperUsers() {
  73.         List<User> users;

  74.         try {
  75.             Query query = getSession().getNamedQuery("UsersSuperQuery");
  76.             users = query.list();
  77.         } catch (HibernateException ex) {
  78.             throw convertHibernateAccessException(ex);
  79.         }
  80.         return users;
  81.     }

  82.     @SuppressWarnings("unchecked")
  83.     public List<User> findByRegistrationType(int registrationType) {
  84.         List<User> users;

  85.         try {
  86.             Query query = getSession().getNamedQuery("UsersByRegistrationTypeQuery");
  87.             query.setInteger("registrationType", registrationType);
  88.             users = query.list();
  89.         } catch (HibernateException ex) {
  90.             throw convertHibernateAccessException(ex);
  91.         }
  92.         return users;
  93.     }

  94.     /**
  95.      * Searches all permissions for the given user and sorts it by project. The
  96.      * <code>HashMap</code> returned has the project ids as key (<code>Integer</code>)
  97.      * and a <code>HashSet</code> as values. The <code>HashSet</code> holds a set of
  98.      * string representation of the permission
  99.      *
  100.      * @param user          The user of interest
  101.      * @return HashMap of permission keyed by project ids
  102.      */
  103.     @SuppressWarnings("unchecked")
  104.     public Map<Integer, Set<PermissionType>> getUsersMapOfProjectsAndPermissionTypes(User user) {

  105.         // create hashMap to hold permission by project id as key
  106.         final Map<Integer, Set<PermissionType>> permissionsByProjectId =
  107.                 new HashMap<Integer, Set<PermissionType>>();

  108.         try {
  109.             // load user bean
  110.             User userBean = (User) getSession().load(User.class, user.getId());
  111.             // create criteria
  112.             Criteria criteria = getSession().createCriteria(Permission.class);
  113.             criteria.add(Expression.eq("user", userBean));
  114.             criteria.addOrder(Order.asc("project"));
  115.             // perform search
  116.             List<Permission> permissionsList = criteria.list();

  117.             for (int i = 0; i < permissionsList.size(); i++) {
  118.                 Permission permission = permissionsList.get(i);

  119.                 // Super user has access to all projects, which is indicated by the "null" project.
  120.                 final Integer projectId = (permission.getProject() == null)
  121.                         ? null : permission.getProject().getId();

  122.                 Set<PermissionType> projectPermissions = permissionsByProjectId.get(projectId);

  123.                 if (projectPermissions == null) {
  124.                     // First permission for the project.
  125.                     projectPermissions = new HashSet<PermissionType>();
  126.                     permissionsByProjectId.put(projectId, projectPermissions);
  127.                 } //else { // Add the permission to the existing set of permissions for the project. }

  128.                 PermissionType permissionType = permission.getPermissionType();
  129.                 projectPermissions.add(permissionType);
  130.             }
  131.         } catch (HibernateException ex) {
  132.             throw convertHibernateAccessException(ex);
  133.         }
  134.         return permissionsByProjectId;
  135.     }


  136.     @SuppressWarnings("unchecked")
  137.     public List<User> findUsersForProjectByAllPermissionTypeList(Integer projectID, Integer[] permissionTypes) {
  138.         PermissionType[] permissions = null;
  139.         if (null != permissionTypes) {
  140.             permissions = new PermissionType[permissionTypes.length];
  141.             int c = 0;
  142.             for (int p : permissionTypes) {
  143.                 permissions[c++] = PermissionType.valueOf(p);
  144.             }
  145.         }
  146.         return findUsersForProjectByAllPermissionTypeList(projectID, permissions);
  147.     }

  148.     @Override
  149.     public List<User> findUsersForProjectByAllPermissionTypeList(Integer projectID, PermissionType[] permissionTypes) {
  150.         List<User> users = new ArrayList<User>();

  151.         try {

  152.             DetachedCriteria userCriteria = DetachedCriteria.forClass(User.class);
  153.             userCriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
  154.             DetachedCriteria permissionCriteria = userCriteria.createCriteria("permissions");

  155.             permissionCriteria.add(Restrictions.in("permissionType", permissionTypes));
  156.             permissionCriteria.add(Restrictions.eq("project.id", projectID));

  157.             List<User> userList = userCriteria.getExecutableCriteria(getSession()).list();

  158.             for (User user : userList) {
  159.                 if (hasAllPermissions(user.getPermissions(), permissionTypes)) {
  160.                     users.add(user);
  161.                 }
  162.             }

  163.         } catch (HibernateException ex) {
  164.             throw convertHibernateAccessException(ex);
  165.         }

  166.         return users;

  167.     }

  168.     private boolean hasAllPermissions(Collection<Permission> permissions, PermissionType[] required) {
  169.         if (null == required || required.length == 0) {
  170.             return true;
  171.         }
  172.         if (null == permissions || permissions.isEmpty()) {
  173.             return false;
  174.         }

  175.         Collection<PermissionType> requiredPermissions = Arrays.asList(required);
  176.         Collection<PermissionType> userPermissionTypes = new HashSet<>(permissions.size());

  177.         Iterator<Permission> permsIt = permissions.iterator();
  178.         while (permsIt.hasNext()) {
  179.             userPermissionTypes.add(permsIt.next().getPermissionType());
  180.         }

  181.         return userPermissionTypes.containsAll(requiredPermissions);
  182.     }

  183. }