Package org.damour.base.server.hibernate.helpers

Source Code of org.damour.base.server.hibernate.helpers.PageHelper

package org.damour.base.server.hibernate.helpers;

import org.damour.base.client.objects.Page;
import org.damour.base.client.objects.PageInfo;
import org.damour.base.client.objects.PermissibleObject;
import org.damour.base.client.objects.Permission;
import org.damour.base.client.objects.User;
import org.damour.base.client.utils.StringUtils;
import org.hibernate.Session;

public class PageHelper {

  private static String buildQuery(PermissibleObject parent, Class<?> clazz, User authUser, String sortField, boolean sortDescending) {
    String query;

    String orderBy = " order by id " + (sortDescending ? "desc" : "asc");
    if (!StringUtils.isEmpty(sortField)) {
      orderBy = " order by " + sortField + (sortDescending ? " desc" : " asc");
    }

    if (authUser != null && authUser.isAdministrator()) {
      // admin sees all
      query = "from " + clazz.getSimpleName();
      if (parent != null) {
        query += " where parent.id = " + parent.getId();
      }
      query += orderBy;
    } else if (authUser == null) {
      query = "from " + clazz.getSimpleName() + " as obj where obj.globalRead = true";
      if (parent != null) {
        query += " and parent.id = " + parent.getId();
      }
      query += orderBy;
    } else {
      String selectFileUserPerm = "(select perm.permissibleObject.id from " + Permission.class.getSimpleName()
          + " as perm where perm.permissibleObject.id = obj.id and perm.securityPrincipal.id = " + authUser.id + " and perm.readPerm = true)";

      String selectFileGroupPerm = "(select perm.permissibleObject.id from "
          + Permission.class.getSimpleName()
          + " as perm where perm.permissibleObject.id = obj.id and perm.readPerm = true and perm.securityPrincipal.id in (select membership.userGroup.id from GroupMembership as membership where membership.user.id = "
          + authUser.id + "))";

      query = "from " + clazz.getSimpleName() + " as obj where (obj.owner.id = " + authUser.id + " OR obj.globalRead = true OR obj.id in " + selectFileUserPerm
          + " OR obj.id in " + selectFileGroupPerm + ")";
     
      if (parent != null) {
        query += " and parent.id = " + parent.getId();
      }
      query += orderBy;
    }
    return query;
  }

  public static Page<PermissibleObject> getPage(Session session, PermissibleObject parent, Class<?> clazz, User authUser, String sortField, boolean sortDescending, int pageNumber,
      int pageSize) {
    String query = buildQuery(parent, clazz, authUser, sortField, sortDescending);
    GenericPage<PermissibleObject> gPage = new GenericPage<PermissibleObject>(session, clazz, query, pageNumber, pageSize);
    return new Page<PermissibleObject>(gPage.getList(), pageNumber);
  }

  private static long getLastPageNumber(Session session, PermissibleObject parent, Class<?> clazz, User authUser, int pageSize) {
    String query = buildQuery(parent, clazz, authUser, "id", true);
    Long rowCount = (Long) session.createQuery("select count(*) " + query).setCacheable(true).uniqueResult();
    /*
     * We use the Math.floor() method because pageNumber numbers are zero-based (i.e. the first pageNumber is pageNumber 0).
     */
    return new Double(Math.floor((double) (rowCount - 1) / pageSize)).longValue();
  }

  private static long getRowCount(Session session, PermissibleObject parent, Class<?> clazz, User authUser) {
    String query = buildQuery(parent, clazz, authUser, "id", true);
    return (Long) session.createQuery("select count(*) " + query).setCacheable(true).uniqueResult();
  }

  public static PageInfo getPageInfo(Session session, PermissibleObject parent, Class<?> clazz, User authUser, int pageSize) {
    PageInfo pageInfo = new PageInfo();
    long rowCount = getRowCount(session, parent, clazz, authUser);
    long lastPageNumber = new Double(Math.floor((double) (rowCount - 1) / pageSize)).longValue();
    pageInfo.setTotalRowCount(rowCount);
    pageInfo.setLastPageNumber(lastPageNumber);
    return pageInfo;
  }
 
}
TOP

Related Classes of org.damour.base.server.hibernate.helpers.PageHelper

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.