/* * Copyright (c) JForum Team. All rights reserved. * * The software in this package is published under the terms of the LGPL * license a copy of which has been included with this distribution in the * license.txt file. * * The JForum Project * http://www.jforum.net */ package net.jforum.repository; import java.util.List; import net.jforum.entities.PostReport; import net.jforum.entities.PostReportStatus; import net.jforum.entities.util.PaginatedResult; import org.apache.commons.lang.ArrayUtils; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import br.com.caelum.vraptor.ioc.Component; /** * @author Rafael Steil */ @Component public class PostReportRepository extends HibernateGenericDAO<PostReport> implements Repository<PostReport> { public PostReportRepository(Session session) { super(session); } @SuppressWarnings("unchecked") public PaginatedResult<PostReport> getPaginated(int start, int count, PostReportStatus status, int... forumIds) { int totalRecords = this.countTotalReportsByStatus(status, forumIds); List<PostReport> reports = this.createGetAllQuery(status, forumIds) .setFirstResult(start) .setMaxResults(count) .list(); return new PaginatedResult<PostReport>(reports, totalRecords); } @SuppressWarnings("unchecked") public List<PostReport> getAll(PostReportStatus status, int... forumIds) { return this.createGetAllQuery(status, forumIds).list(); } public int countPendingReports(int... forumIds) { return this.countTotalReportsByStatus(PostReportStatus.UNRESOLVED, forumIds); } private int countTotalReportsByStatus(PostReportStatus status, int... forumIds) { Criteria criteria = session.createCriteria(PostReport.class) .add(Restrictions.eq("status", status)) .setProjection(Projections.rowCount()); if (!ArrayUtils.isEmpty(forumIds)) { criteria.createAlias("post", "post").add( Restrictions.in("post.forum.id", this.primitiveToWrapper(forumIds))); } return ((Number)criteria.uniqueResult()).intValue(); } private Integer[] primitiveToWrapper(int... ids) { Integer[] wrapped = new Integer[ids.length]; for (int i = 0; i < ids.length; i++) { wrapped[i] = Integer.valueOf(ids[i]); } return wrapped; } private Query createGetAllQuery(PostReportStatus status, int... forumIds) { String query = "select new PostReport(report.id, post.id, post.subject, post.topic.id, report.date, " + "report.description, reportUser.username, reportUser.id, postUser.username, postUser.id, report.status)" + " from PostReport report " + " join report.user reportUser " + " join report.post post" + " join post.user postUser " + " where report.status = :status"; if (!ArrayUtils.isEmpty(forumIds)) { query += " and post.forum.id in (:forumIds)"; } if (!ArrayUtils.isEmpty(forumIds)) { return session.createQuery(query) .setParameter("status", status) .setParameterList("forumIds", this.primitiveToWrapper(forumIds)); } else { return session.createQuery(query).setParameter("status", status); } } }