package fi.otavanopisto.muikku.plugins.forum.dao;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Root;
import fi.otavanopisto.muikku.plugins.forum.model.ForumThreadReply_;
import fi.otavanopisto.muikku.plugins.forum.model.ForumThread_;
import fi.otavanopisto.muikku.model.users.UserEntity;
import fi.otavanopisto.muikku.plugins.CorePluginsDAO;
import fi.otavanopisto.muikku.plugins.forum.model.ForumArea;
import fi.otavanopisto.muikku.plugins.forum.model.ForumThread;
import fi.otavanopisto.muikku.plugins.forum.model.ForumThreadReply;
public class ForumThreadReplyDAO extends CorePluginsDAO<ForumThreadReply> {
private static final long serialVersionUID = 6996591519523286352L;
public ForumThreadReply create(
ForumArea forumArea,
ForumThread thread,
String message,
UserEntity creator,
ForumThreadReply parentReply) {
Date now = new Date();
return create(forumArea, thread, message, now, creator, now, creator, false, false, parentReply);
}
public ForumThreadReply create(ForumArea forumArea, ForumThread thread, String message, Date created, UserEntity creator, Date lastModified, UserEntity lastModifier, Boolean archived) {
return create(forumArea, thread, message, created, creator, lastModified, lastModifier, false, archived, null);
}
public ForumThreadReply create(
ForumArea forumArea,
ForumThread thread,
String message,
Date created,
UserEntity creator,
Date lastModified,
UserEntity lastModifier,
Boolean deleted,
Boolean archived,
ForumThreadReply parentReply) {
ForumThreadReply reply = new ForumThreadReply();
reply.setForumArea(forumArea);
reply.setThread(thread);
reply.setMessage(message);
reply.setCreated(created);
reply.setCreator(creator.getId());
reply.setLastModified(lastModified);
reply.setLastModifier(lastModifier.getId());
reply.setDeleted(deleted);
reply.setArchived(archived);
reply.setParentReply(parentReply);
getEntityManager().persist(reply);
return reply;
}
public List<ForumThreadReply> listByForumThread(ForumThread forumThread) {
return listByForumThread(forumThread, false);
}
public List<ForumThreadReply> listByForumThread(ForumThread forumThread, boolean includeArchived) {
return listByForumThread(forumThread, null, null, includeArchived);
}
public List<ForumThreadReply> listByForumThread(ForumThread forumThread, Integer firstResult, Integer maxResults) {
return listByForumThread(forumThread, null, null, false);
}
public List<ForumThreadReply> listByForumThread(ForumThread forumThread, Integer firstResult, Integer maxResults, boolean includeArchived) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<ForumThreadReply> criteria = criteriaBuilder.createQuery(ForumThreadReply.class);
Root<ForumThreadReply> root = criteria.from(ForumThreadReply.class);
Join<ForumThreadReply, ForumThreadReply> parent = root.join(ForumThreadReply_.parentReply, JoinType.LEFT);
criteria.select(root);
if (!includeArchived) {
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(ForumThreadReply_.thread), forumThread),
criteriaBuilder.equal(root.get(ForumThreadReply_.archived), Boolean.FALSE)
)
);
} else {
criteria.where(
criteriaBuilder.equal(root.get(ForumThreadReply_.thread), forumThread)
);
}
criteria.orderBy(
criteriaBuilder.asc(
criteriaBuilder.coalesce(
parent.get(ForumThreadReply_.created),
root.get(ForumThreadReply_.created)
)),
criteriaBuilder.asc(
root.get(ForumThreadReply_.created)));
TypedQuery<ForumThreadReply> query = entityManager.createQuery(criteria);
if (firstResult != null) {
query.setFirstResult(firstResult);
}
if (maxResults != null) {
query.setMaxResults(maxResults);
}
return query.getResultList();
}
public ForumThreadReply findLatestReplyByThread(ForumThread thread) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<ForumThreadReply> criteria = criteriaBuilder.createQuery(ForumThreadReply.class);
Root<ForumThreadReply> root = criteria.from(ForumThreadReply.class);
criteria.select(root);
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(ForumThreadReply_.thread), thread),
criteriaBuilder.equal(root.get(ForumThreadReply_.archived), Boolean.FALSE)
)
);
criteria.orderBy(criteriaBuilder.desc(root.get(ForumThreadReply_.created)));
TypedQuery<ForumThreadReply> query = entityManager.createQuery(criteria);
query.setMaxResults(1);
return getSingleResult(query);
}
public Long countByThread(ForumThread thread) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> criteria = criteriaBuilder.createQuery(Long.class);
Root<ForumThreadReply> root = criteria.from(ForumThreadReply.class);
criteria.select(criteriaBuilder.count(root));
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(ForumThreadReply_.thread), thread),
criteriaBuilder.equal(root.get(ForumThreadReply_.archived), Boolean.FALSE)
)
);
return entityManager.createQuery(criteria).getSingleResult();
}
public ForumThreadReply findLatestReplyByArea(ForumArea area) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<ForumThreadReply> criteria = criteriaBuilder.createQuery(ForumThreadReply.class);
Root<ForumThreadReply> root = criteria.from(ForumThreadReply.class);
Join<ForumThreadReply, ForumThread> join = root.join(ForumThreadReply_.thread);
criteria.select(root);
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(join.get(ForumThread_.forumArea), area),
criteriaBuilder.equal(root.get(ForumThreadReply_.archived), Boolean.FALSE)
)
);
criteria.orderBy(criteriaBuilder.desc(root.get(ForumThreadReply_.created)));
TypedQuery<ForumThreadReply> query = entityManager.createQuery(criteria);
query.setMaxResults(1);
return getSingleResult(query);
}
public ForumThreadReply update(ForumThreadReply reply, String message, Date lastModified, UserEntity lastModifier) {
reply.setMessage(message);
reply.setLastModified(lastModified);
reply.setLastModifier(lastModifier.getId());
getEntityManager().persist(reply);
return reply;
}
public ForumThreadReply updateParentReply(ForumThreadReply reply, ForumThreadReply parentReply) {
reply.setParentReply(parentReply);
return persist(reply);
}
public ForumThreadReply updateDeleted(ForumThreadReply reply, boolean deleted) {
reply.setDeleted(deleted);
return persist(reply);
}
public ForumThreadReply updateArchived(ForumThreadReply reply, Boolean archived){
reply.setArchived(archived);
return persist(reply);
}
@Override
public void delete(ForumThreadReply e) {
super.delete(e);
}
}