/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/msgcntr/trunk/messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/MessageForumsMessageManagerImpl.java $ * $Id: MessageForumsMessageManagerImpl.java 9227 2006-05-15 15:02:42Z cwen@iupui.edu $ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.sakaiproject.component.app.messageforums; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.Hibernate; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.sakaiproject.api.app.messageforums.Attachment; import org.sakaiproject.api.app.messageforums.BaseForum; import org.sakaiproject.api.app.messageforums.DiscussionForumService; import org.sakaiproject.api.app.messageforums.Message; import org.sakaiproject.api.app.messageforums.MessageForumsMessageManager; import org.sakaiproject.api.app.messageforums.MessageForumsTypeManager; import org.sakaiproject.api.app.messageforums.MessageMoveHistory; import org.sakaiproject.api.app.messageforums.PrivateMessage; import org.sakaiproject.api.app.messageforums.SynopticMsgcntrManager; import org.sakaiproject.api.app.messageforums.Topic; import org.sakaiproject.api.app.messageforums.UnreadStatus; import org.sakaiproject.api.app.messageforums.UserStatistics; import org.sakaiproject.api.app.messageforums.cover.SynopticMsgcntrManagerCover; import org.sakaiproject.component.app.messageforums.dao.hibernate.AttachmentImpl; import org.sakaiproject.component.app.messageforums.dao.hibernate.MessageImpl; import org.sakaiproject.component.app.messageforums.dao.hibernate.MessageMoveHistoryImpl; import org.sakaiproject.component.app.messageforums.dao.hibernate.PrivateMessageImpl; import org.sakaiproject.component.app.messageforums.dao.hibernate.UnreadStatusImpl; import org.sakaiproject.component.app.messageforums.dao.hibernate.Util; import org.sakaiproject.component.app.messageforums.exception.LockedException; import org.sakaiproject.content.api.ContentHostingService; import org.sakaiproject.event.api.EventTrackingService; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.id.api.IdManager; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.cover.SiteService; import org.sakaiproject.tool.api.Placement; import org.sakaiproject.tool.api.SessionManager; import org.sakaiproject.tool.cover.ToolManager; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; public class MessageForumsMessageManagerImpl extends HibernateDaoSupport implements MessageForumsMessageManager { private static final Log LOG = LogFactory.getLog(MessageForumsMessageManagerImpl.class); //private static final String QUERY_BY_MESSAGE_ID = "findMessageById"; //private static final String QUERY_ATTACHMENT_BY_ID = "findAttachmentById"; private static final String QUERY_BY_MESSAGE_ID_WITH_ATTACHMENTS = "findMessageByIdWithAttachments"; private static final String QUERY_COUNT_BY_READ = "findReadMessageCountByTopicId"; private static final String QUERY_COUNT_BY_AUTHORED = "findAuhtoredMessageCountByTopicId"; private static final String QUERY_MESSAGE_COUNTS_FOR_MAIN_PAGE = "findMessageCountsForMainPage"; private static final String QUERY_READ_MESSAGE_COUNTS_FOR_MAIN_PAGE = "findReadMessageCountsForMainPage"; private static final String QUERY_BY_TOPIC_ID = "findMessagesByTopicId"; private static final String QUERY_COUNT_VIEWABLE_BY_TOPIC_ID = "findViewableMessageCountByTopicIdByUserId"; private static final String QUERY_COUNT_READ_VIEWABLE_BY_TOPIC_ID = "findReadViewableMessageCountByTopicIdByUserId"; private static final String QUERY_UNREAD_STATUS = "findUnreadStatusForMessage"; private static final String QUERY_CHILD_MESSAGES = "finalAllChildMessages"; private static final String QUERY_READ_STATUS_WITH_MSGS_USER = "findReadStatusByMsgIds"; private static final String QUERY_FIND_PENDING_MSGS_BY_CONTEXT_AND_USER_AND_PERMISSION_LEVEL = "findAllPendingMsgsByContextByMembershipByPermissionLevel"; private static final String QUERY_FIND_PENDING_MSGS_BY_CONTEXT_AND_USER_AND_PERMISSION_LEVEL_NAME = "findAllPendingMsgsByContextByMembershipByPermissionLevelName"; private static final String QUERY_FIND_PENDING_MSGS_BY_TOPICID = "findPendingMsgsByTopicId"; private static final String QUERY_UNDELETED_MSG_BY_TOPIC_ID = "findUndeletedMessagesByTopicId"; private static final String QUERY_MOVED_MESSAGES_BY_TOPICID = "findMovedMessagesByTopicId"; private static final String QUERY_MOVED_HISTORY_BY_MESSAGEID = "findMovedHistoryByMessageId"; //private static final String ID = "id"; private static final String MESSAGECENTER_HELPER_TOOL_ID = "sakai.messageforums.helper"; private IdManager idManager; private MessageForumsTypeManager typeManager; private SessionManager sessionManager; private EventTrackingService eventTrackingService; private ContentHostingService contentHostingService; public void init() { LOG.info("init()"); ; } public EventTrackingService getEventTrackingService() { return eventTrackingService; } public void setEventTrackingService(EventTrackingService eventTrackingService) { this.eventTrackingService = eventTrackingService; } public MessageForumsTypeManager getTypeManager() { return typeManager; } public void setTypeManager(MessageForumsTypeManager typeManager) { this.typeManager = typeManager; } public void setSessionManager(SessionManager sessionManager) { this.sessionManager = sessionManager; } public void setIdManager(IdManager idManager) { this.idManager = idManager; } public IdManager getIdManager() { return idManager; } public SessionManager getSessionManager() { return sessionManager; } public void setContentHostingService(ContentHostingService contentHostingService) { this.contentHostingService = contentHostingService; } /** * FOR SYNOPTIC TOOL: * Returns the count of discussion forum messages grouped by site for sites with * Forum topics that don't have membership items in the db */ public List<Object []> findDiscussionForumMessageCountsForTopicsWithMissingPermsForAllSites(final List<String> siteList) { if (siteList == null) { LOG.error("findDiscussionForumMessageCountsForTopicsWithMissingPermsForAllSites failed with null site list."); throw new IllegalArgumentException("Null Argument"); } HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findDiscussionForumMessageCountsForTopicsWithMissingPermsForAllSites"); q.setParameterList("siteList", siteList); q.setParameter("userId", getCurrentUser(), Hibernate.STRING); return q.list(); } }; return (List) getHibernateTemplate().execute(hcb); } /** * FOR SYNOPTIC TOOL: * Returns the count of discussion forum messages grouped by site for sites with * Forum topics that don't have membership items in the db */ public List<Object []> findDiscussionForumReadMessageCountsForTopicsWithMissingPermsForAllSites(final List<String> siteList) { if (siteList == null) { LOG.error("findDiscussionForumReadMessageCountsForTopicsWithMissingPermsForAllSites failed with null site list."); throw new IllegalArgumentException("Null Argument"); } HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findDiscussionForumReadMessageCountsForTopicsWithMissingPermsForAllSites"); q.setParameterList("siteList", siteList); q.setParameter("userId", getCurrentUser(), Hibernate.STRING); return q.list(); } }; return (List) getHibernateTemplate().execute(hcb); } /** * FOR SYNOPTIC TOOL: * Returns the count of discussion forum messages grouped by site */ public List findDiscussionForumMessageCountsForAllSitesByPermissionLevelId(final List siteList, final List roleList) { if (siteList == null) { LOG.error("findDiscussionForumMessageCountsForAllSitesByPermissionLevelId failed with null site list."); throw new IllegalArgumentException("Null Argument"); } HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findDiscussionForumMessageCountsForAllSitesByPermissionLevelId"); q.setParameterList("siteList", siteList); q.setParameterList("roleList", roleList); q.setParameter("userId", getCurrentUser(), Hibernate.STRING); return q.list(); } }; return (List) getHibernateTemplate().execute(hcb); } /** * FOR SYNOPTIC TOOL: * Returns the count of discussion forum messages grouped by site */ public List findDiscussionForumMessageCountsForAllSitesByPermissionLevelName(final List siteList, final List roleList) { if (siteList == null) { LOG.error("findDiscussionForumMessageCountsForAllSitesByPermissionLevelName failed with null site list."); throw new IllegalArgumentException("Null Argument"); } HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findDiscussionForumMessageCountsForAllSitesByPermissionLevelName"); q.setParameterList("siteList", siteList); q.setParameterList("roleList", roleList); q.setParameter("userId", getCurrentUser(), Hibernate.STRING); q.setParameter("customTypeUuid", typeManager.getCustomLevelType(), Hibernate.STRING); return q.list(); } }; return (List) getHibernateTemplate().execute(hcb); } /** * FOR SYNOPTIC TOOL: * Returns the count of read discussion forum messages grouped by site */ public List findDiscussionForumReadMessageCountsForAllSitesByPermissionLevelId(final List siteList, final List roleList) { HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findDiscussionForumReadMessageCountsForAllSitesByPermissionLevelId"); q.setParameterList("siteList", siteList); q.setParameterList("roleList", roleList); q.setParameter("userId", getCurrentUser(), Hibernate.STRING); return q.list(); } }; return (List) getHibernateTemplate().execute(hcb); } /** * FOR SYNOPTIC TOOL: * Returns the count of read discussion forum messages grouped by site */ public List findDiscussionForumReadMessageCountsForAllSitesByPermissionLevelName(final List siteList, final List roleList) { HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findDiscussionForumReadMessageCountsForAllSitesByPermissionLevelName"); q.setParameterList("siteList", siteList); q.setParameterList("roleList", roleList); q.setParameter("userId", getCurrentUser(), Hibernate.STRING); q.setParameter("customTypeUuid", typeManager.getCustomLevelType(), Hibernate.STRING); return q.list(); } }; return (List) getHibernateTemplate().execute(hcb); } /** * FOR SYNOPTIC TOOL: * Returns the count of discussion forum messages grouped by topics within a site * Used by sites that are grouped */ public List findDiscussionForumMessageCountsForGroupedSitesByTopic(final List siteList, final List roleList) { HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findDiscussionForumMessageCountsForGroupedSitesByTopic"); q.setParameterList("siteList", siteList); q.setParameterList("roleList", roleList); q.setParameter("userId", getCurrentUser(), Hibernate.STRING); q.setParameter("customTypeUuid", typeManager.getCustomLevelType(), Hibernate.STRING); return q.list(); } }; return (List) getHibernateTemplate().execute(hcb); } /** * FOR SYNOPTIC TOOL: * Returns the count of discussion forum messages grouped by topics within a site * Used by sites that are grouped */ public List findDiscussionForumReadMessageCountsForGroupedSitesByTopic(final List siteList, final List roleList) { HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findDiscussionForumReadMessageCountsForGroupedSitesByTopic"); q.setParameterList("siteList", siteList); q.setParameterList("roleList", roleList); q.setParameter("userId", getCurrentUser(), Hibernate.STRING); q.setParameter("customTypeUuid", typeManager.getCustomLevelType(), Hibernate.STRING); return q.list(); } }; return (List) getHibernateTemplate().execute(hcb); } /** * FOR STATISTICS TOOL: * Returns the number of read messages by topic for specified user */ public int findAuhtoredMessageCountByTopicIdByUserId(final Long topicId, final String userId){ if (topicId == null || userId == null) { LOG.error("findAuthoredMessageCountByTopicIdByUserId failed with topicId: " + topicId + " and userId: " + userId); throw new IllegalArgumentException("Null Argument"); } LOG.debug("findAuthoredMessageCountByTopicIdByUserId executing with topicId: " + topicId + " and userId: " + userId); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_COUNT_BY_AUTHORED); q.setParameter("topicId", topicId, Hibernate.LONG); q.setParameter("userId", userId, Hibernate.STRING); return q.uniqueResult(); } }; return ((Integer) getHibernateTemplate().execute(hcb)).intValue(); } public int findAuthoredMessageCountForStudent(final String userId) { if (userId == null) { LOG.error("findAuthoredMessageCountForStudentInSite failed with a null userId"); throw new IllegalArgumentException("userId cannot be null"); } if (LOG.isDebugEnabled()) LOG.debug("findAuthoredMessageCountForStudentInSite executing with userId: " + userId); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findAuthoredMessageCountForStudent"); q.setParameter("contextId", getContextId(), Hibernate.STRING); q.setParameter("userId", userId, Hibernate.STRING); return q.uniqueResult(); } }; return ((Integer) getHibernateTemplate().execute(hcb)).intValue(); } /* * (non-Javadoc) * @see org.sakaiproject.api.app.messageforums.MessageForumsMessageManager#findAuthoredMessagesForStudent(java.lang.String) */ public List<Message> findAuthoredMessagesForStudent(final String studentId) { if (LOG.isDebugEnabled()) LOG.debug("findReadMessagesForCurrentStudent()"); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findAuthoredMessagesForStudent"); q.setParameter("contextId", getContextId(), Hibernate.STRING); q.setParameter("userId", studentId, Hibernate.STRING); return q.list(); } }; return (List)getHibernateTemplate().execute(hcb); } public List<UserStatistics> findAuthoredStatsForStudent(final String studentId) { if (LOG.isDebugEnabled()) LOG.debug("findAuthoredStatsForStudent()"); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findAuthoredStatsForStudent"); q.setParameter("contextId", getContextId(), Hibernate.STRING); q.setParameter("userId", studentId, Hibernate.STRING); return q.list(); } }; List<UserStatistics> returnList = new ArrayList<UserStatistics>(); List<Object[]> results = (List<Object[]>)getHibernateTemplate().execute(hcb); for(Object[] result : results){ UserStatistics stat = new UserStatistics((String) result[0], (String) result[1], (Date) result[2], (String) result[3], ((Integer) result[4]).toString(), ((Integer) result[5]).toString(), ((Integer) result[6]).toString(), studentId); returnList.add(stat); } return returnList; } public List<Message> findAuthoredMessagesForStudentByTopicId(final String studentId, final Long topicId) { if (LOG.isDebugEnabled()) LOG.debug("findReadMessagesForCurrentStudentByTopicId()"); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findAuthoredMessagesForStudentByTopicId"); q.setParameter("contextId", getContextId(), Hibernate.STRING); q.setParameter("userId", studentId, Hibernate.STRING); q.setParameter("topicId", topicId, Hibernate.LONG); return q.list(); } }; return (List)getHibernateTemplate().execute(hcb); } public List<UserStatistics> findAuthoredStatsForStudentByTopicId(final String studentId, final Long topicId) { if (LOG.isDebugEnabled()) LOG.debug("findAuthoredStatsForStudentByTopicId()"); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findAuthoredStatsForStudentByTopicId"); q.setParameter("topicId", topicId, Hibernate.LONG); q.setParameter("userId", studentId, Hibernate.STRING); return q.list(); } }; List<UserStatistics> returnList = new ArrayList<UserStatistics>(); List<Object[]> results = (List<Object[]>)getHibernateTemplate().execute(hcb); for(Object[] result : results){ UserStatistics stat = new UserStatistics((String) result[0], (String) result[1], (Date) result[2], (String) result[3], ((Integer) result[4]).toString(), ((Integer) result[5]).toString(), ((Integer) result[6]).toString(), studentId); returnList.add(stat); } return returnList; } public List<Message> findAuthoredMessagesForStudentByForumId(final String studentId, final Long forumId) { if (LOG.isDebugEnabled()) LOG.debug("findAuthoredMessagesForStudentByForumId()"); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findAuthoredMessagesForStudentByForumId"); q.setParameter("contextId", getContextId(), Hibernate.STRING); q.setParameter("userId", studentId, Hibernate.STRING); q.setParameter("forumId", forumId, Hibernate.LONG); return q.list(); } }; return (List)getHibernateTemplate().execute(hcb); } public List<UserStatistics> findAuthoredStatsForStudentByForumId(final String studentId, final Long topicId) { if (LOG.isDebugEnabled()) LOG.debug("findAuthoredStatsForStudentByForumId()"); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findAuthoredStatsForStudentByForumId"); q.setParameter("forumId", topicId, Hibernate.LONG); q.setParameter("userId", studentId, Hibernate.STRING); return q.list(); } }; List<UserStatistics> returnList = new ArrayList<UserStatistics>(); List<Object[]> results = (List<Object[]>)getHibernateTemplate().execute(hcb); for(Object[] result : results){ UserStatistics stat = new UserStatistics((String) result[0], (String) result[1], (Date) result[2], (String) result[3], ((Integer) result[4]).toString(), ((Integer) result[5]).toString(), ((Integer) result[6]).toString(), studentId); returnList.add(stat); } return returnList; } public List<Object[]> findAuthoredMessageCountForAllStudents() { if (LOG.isDebugEnabled()) LOG.debug("findAuthoredMessageCountForAllStudents executing"); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findAuthoredMessageCountForAllStudents"); q.setParameter("contextId", getContextId(), Hibernate.STRING); return q.list(); } }; return (List)getHibernateTemplate().execute(hcb); } public List<Object[]> findAuthoredMessageCountForAllStudentsByTopicId(final Long topicId) { if (LOG.isDebugEnabled()) LOG.debug("findAuthoredMessageCountForAllStudentsByTopicId executing"); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findAuthoredMessageCountForAllStudentsByTopicId"); q.setParameter("contextId", getContextId(), Hibernate.STRING); q.setParameter("topicId", topicId, Hibernate.LONG); return q.list(); } }; return (List)getHibernateTemplate().execute(hcb); } public List<Object[]> findAuthoredMessageCountForAllStudentsByForumId(final Long forumId) { if (LOG.isDebugEnabled()) LOG.debug("findAuthoredMessageCountForAllStudentsByForumId executing"); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findAuthoredMessageCountForAllStudentsByForumId"); q.setParameter("contextId", getContextId(), Hibernate.STRING); q.setParameter("forumId", forumId, Hibernate.LONG); return q.list(); } }; return (List)getHibernateTemplate().execute(hcb); } public int findReadMessageCountByTopicIdByUserId(final Long topicId, final String userId) { if (topicId == null || userId == null) { LOG.error("findReadMessageCountByTopicIdByUserId failed with topicId: " + topicId + " and userId: " + userId); throw new IllegalArgumentException("Null Argument"); } LOG.debug("findReadMessageCountByTopicIdByUserId executing with topicId: " + topicId + " and userId: " + userId); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_COUNT_BY_READ); q.setParameter("topicId", topicId, Hibernate.LONG); q.setParameter("userId", userId, Hibernate.STRING); return q.uniqueResult(); } }; return ((Integer) getHibernateTemplate().execute(hcb)).intValue(); } public int findReadMessageCountForStudent(final String userId) { if (userId == null) { LOG.error("findReadMessageCountForStudent failed with null userId"); throw new IllegalArgumentException("userId cannot be null"); } if (LOG.isDebugEnabled()) LOG.debug("findReadMessageCountForStudent executing with userId: " + userId); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findReadMessageCountForStudent"); q.setParameter("contextId", getContextId(), Hibernate.STRING); q.setParameter("userId", userId, Hibernate.STRING); return q.uniqueResult(); } }; return ((Integer) getHibernateTemplate().execute(hcb)).intValue(); } /* * (non-Javadoc) * @see org.sakaiproject.api.app.messageforums.MessageForumsMessageManager#findReadMessagesForStudent() */ public List<UserStatistics> findReadStatsForStudent(final String studentId) { if (LOG.isDebugEnabled()) LOG.debug("findReadStatsForStudent()"); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findReadStatsForStudent"); q.setParameter("contextId", getContextId(), Hibernate.STRING); q.setParameter("userId", studentId, Hibernate.STRING); return q.list(); } }; List<UserStatistics> returnList = new ArrayList<UserStatistics>(); List<Object[]> results = (List<Object[]>)getHibernateTemplate().execute(hcb); for(Object[] result : results){ UserStatistics stat = new UserStatistics((String) result[0], (String) result[1], (Date) result[2], (String) result[3], ((Integer) result[4]).toString(), ((Integer) result[5]).toString(), ((Integer) result[6]).toString(), studentId); returnList.add(stat); } return returnList; } public List<UserStatistics> findReadStatsForStudentByTopicId(final String studentId, final Long topicId) { if (LOG.isDebugEnabled()) LOG.debug("findReadStatsForStudentByTopicId()"); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findReadStatsForStudentByTopicId"); q.setParameter("userId", studentId, Hibernate.STRING); q.setParameter("topicId", topicId, Hibernate.LONG); return q.list(); } }; List<UserStatistics> returnList = new ArrayList<UserStatistics>(); List<Object[]> results = (List<Object[]>)getHibernateTemplate().execute(hcb); for(Object[] result : results){ UserStatistics stat = new UserStatistics((String) result[0], (String) result[1], (Date) result[2], (String) result[3], ((Integer) result[4]).toString(), ((Integer) result[5]).toString(), ((Integer) result[6]).toString(), studentId); returnList.add(stat); } return returnList; } public List<UserStatistics> findReadStatsForStudentByForumId(final String studentId, final Long forumId) { if (LOG.isDebugEnabled()) LOG.debug("findReadStatsForStudentByForumId()"); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findReadStatsForStudentByForumId"); q.setParameter("userId", studentId, Hibernate.STRING); q.setParameter("forumId", forumId, Hibernate.LONG); return q.list(); } }; List<UserStatistics> returnList = new ArrayList<UserStatistics>(); List<Object[]> results = (List<Object[]>)getHibernateTemplate().execute(hcb); for(Object[] result : results){ UserStatistics stat = new UserStatistics((String) result[0], (String) result[1], (Date) result[2], (String) result[3], ((Integer) result[4]).toString(), ((Integer) result[5]).toString(), ((Integer) result[6]).toString(), studentId); returnList.add(stat); } return returnList; } public List<Object[]> findReadMessageCountForAllStudents() { if (LOG.isDebugEnabled()) LOG.debug("findReadMessageCountForAllStudentsInSite executing"); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findReadMessageCountForAllStudents"); q.setParameter("contextId", getContextId(), Hibernate.STRING); return q.list(); } }; return (List)getHibernateTemplate().execute(hcb); } public List<Object[]> findReadMessageCountForAllStudentsByTopicId(final Long topicId) { if (LOG.isDebugEnabled()) LOG.debug("findReadMessageCountForAllStudentsByTopicId executing"); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findReadMessageCountForAllStudentsByTopicId"); q.setParameter("contextId", getContextId(), Hibernate.STRING); q.setParameter("topicId", topicId, Hibernate.LONG); return q.list(); } }; return (List)getHibernateTemplate().execute(hcb); } public List<Object[]> findReadMessageCountForAllStudentsByForumId(final Long forumId) { if (LOG.isDebugEnabled()) LOG.debug("findReadMessageCountForAllStudentsByForumId executing"); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findReadMessageCountForAllStudentsByForumId"); q.setParameter("contextId", getContextId(), Hibernate.STRING); q.setParameter("forumId", forumId, Hibernate.LONG); return q.list(); } }; return (List)getHibernateTemplate().execute(hcb); } /** * Returns count of all messages in a topic that have been approved or were authored by given user */ public int findViewableMessageCountByTopicIdByUserId(final Long topicId, final String userId) { if (topicId == null || userId == null) { LOG.error("findViewableMessageCountByTopicIdByUserId failed with topicId: " + topicId + " and userId: " + userId); throw new IllegalArgumentException("Null Argument"); } LOG.debug("findViewableMessageCountByTopicIdByUserId executing with topicId: " + topicId + " and userId: " + userId); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_COUNT_VIEWABLE_BY_TOPIC_ID); q.setParameter("topicId", topicId, Hibernate.LONG); q.setParameter("userId", userId, Hibernate.STRING); return q.uniqueResult(); } }; return ((Integer) getHibernateTemplate().execute(hcb)).intValue(); } /** * Returns count of all msgs in a topic that have been approved or were authored by curr user */ public int findViewableMessageCountByTopicId(final Long topicId) { if (topicId == null) { LOG.error("findViewableMessageCountByTopicId failed with topicId: null"); throw new IllegalArgumentException("Null Argument"); } LOG.debug("findViewableMessageCountByTopicId executing with topicId: " + topicId); if(getCurrentUser()!=null){ return findViewableMessageCountByTopicIdByUserId(topicId, getCurrentUser()); } else return 0; } public int findUnreadMessageCountByTopicIdByUserId(final Long topicId, final String userId){ if (topicId == null || userId == null) { LOG.error("findUnreadMessageCountByTopicIdByUserId failed with topicId: " + topicId + " and userId: " + userId); throw new IllegalArgumentException("Null Argument"); } LOG.debug("findUnreadMessageCountByTopicIdByUserId executing with topicId: " + topicId); return findMessageCountByTopicId(topicId) - findReadMessageCountByTopicIdByUserId(topicId, userId); } public int findUnreadMessageCountByTopicId(final Long topicId) { if (topicId == null) { LOG.error("findUnreadMessageCountByTopicId failed with topicId: null"); throw new IllegalArgumentException("Null Argument"); } LOG.debug("findUnreadMessageCountByTopicId executing with topicId: " + topicId); return findMessageCountByTopicId(topicId) - findReadMessageCountByTopicId(topicId); } /** * Returns count of all unread msgs for given user that have been approved or * were authored by user */ public int findUnreadViewableMessageCountByTopicIdByUserId(final Long topicId, final String userId) { if (topicId == null) { LOG.error("findUnreadViewableMessageCountByTopicIdByUserId failed with topicId: null and userid: " + userId); throw new IllegalArgumentException("Null Argument"); } LOG.debug("findUnreadViewableMessageCountByTopicIdByUserId executing with topicId: " + topicId + " userId: " + userId); return findViewableMessageCountByTopicIdByUserId(topicId, userId) - findReadViewableMessageCountByTopicIdByUserId(topicId, userId); } /** * Returns count of all unread msgs for current user that have been approved or * were authored by current user */ public int findUnreadViewableMessageCountByTopicId(final Long topicId) { if (topicId == null) { LOG.error("findUnreadViewableMessageCountByTopicId failed with topicId: null"); throw new IllegalArgumentException("Null Argument"); } LOG.debug("findUnreadViewableMessageCountByTopicId executing with topicId: " + topicId); if(getCurrentUser()!=null){ return findUnreadViewableMessageCountByTopicIdByUserId(topicId, getCurrentUser()); } else return 0; } public int findReadMessageCountByTopicId(final Long topicId) { if (topicId == null) { LOG.error("findReadMessageCountByTopicId failed with topicId: Null"); throw new IllegalArgumentException("Null Argument"); } if(getCurrentUser()!=null){ return findReadMessageCountByTopicIdByUserId(topicId, getCurrentUser()); }else return 0; } /** * Returns count of all read msgs for given user that have been approved or * were authored by user * @param topicId * @param userId * @return */ public int findReadViewableMessageCountByTopicIdByUserId(final Long topicId, final String userId) { if (topicId == null || userId == null) { LOG.error("findReadViewableMessageCountByTopicIdByUserId failed with topicId: " + topicId + " and userId: " + userId); throw new IllegalArgumentException("Null Argument"); } LOG.debug("findReadViewableMessageCountByTopicIdByUserId executing with topicId: " + topicId + " and userId: " + userId); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_COUNT_READ_VIEWABLE_BY_TOPIC_ID); q.setParameter("topicId", topicId, Hibernate.LONG); q.setParameter("userId", userId, Hibernate.STRING); return q.uniqueResult(); } }; return ((Integer) getHibernateTemplate().execute(hcb)).intValue(); } /** * Returns count of all read msgs for current user that have been approved or * were authored by user * @param topicId * @return */ public int findReadViewableMessageCountByTopicId(final Long topicId) { if (topicId == null) { LOG.error("findReadViewableMessageCountByTopicId failed with topicId: null"); throw new IllegalArgumentException("Null Argument"); } if(getCurrentUser()!=null){ return findReadViewableMessageCountByTopicIdByUserId(topicId, getCurrentUser()); } else return 0; } public List findMessagesByTopicId(final Long topicId) { if (topicId == null) { LOG.error("findMessagesByTopicId failed with topicId: null"); throw new IllegalArgumentException("Null Argument"); } LOG.debug("findMessagesByTopicId executing with topicId: " + topicId); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_BY_TOPIC_ID); q.setParameter("topicId", topicId, Hibernate.LONG); return q.list(); } }; return (List) getHibernateTemplate().execute(hcb); } public List findUndeletedMessagesByTopicId(final Long topicId) { if (topicId == null) { LOG.error("findUndeletedMessagesByTopicId failed with topicId: null"); throw new IllegalArgumentException("Null Argument"); } LOG.debug("findUndeletedMessagesByTopicId executing with topicId: " + topicId); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_UNDELETED_MSG_BY_TOPIC_ID); q.setParameter("topicId", topicId, Hibernate.LONG); return q.list(); } }; return (List) getHibernateTemplate().execute(hcb); } public int findMessageCountByTopicId(final Long topicId) { if (topicId == null) { LOG.error("findMessageCountByTopicId failed with topicId: null"); throw new IllegalArgumentException("Null Argument"); } LOG.debug("findMessageCountByTopicId executing with topicId: " + topicId); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findMessageCountByTopicId"); q.setParameter("topicId", topicId, Hibernate.LONG); return q.uniqueResult(); } }; return ((Integer) getHibernateTemplate().execute(hcb)).intValue(); } public int findMessageCountByForumId(final Long forumId) { if (forumId == null) { LOG.error("findMessageCountByForumId failed with forumId: " + forumId); throw new IllegalArgumentException("Null Argument"); } LOG.debug("findMessageCountByForumId executing with forumId: " + forumId); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findMessageCountByForumId"); q.setParameter("forumId", forumId, Hibernate.LONG); return q.uniqueResult(); } }; return ((Integer) getHibernateTemplate().execute(hcb)).intValue(); } /* + * (non-Javadoc) + * @see org.sakaiproject.api.app.messageforums.MessageForumsForumManager#findMessageCountsForMainPage(java.util.List) + */ public List<Object[]> findMessageCountsForMainPage(final Collection<Long> topicIds) { // have to manually check to make sure the Collection isn't empty to prevent Hibernate from // producing the "unexpected end of subtree" error. (SAKAI-399/357 [local UDayton] & SAK-16848) if (topicIds.isEmpty()) return new ArrayList<Object[]>(); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_MESSAGE_COUNTS_FOR_MAIN_PAGE); q.setParameterList("topicIds", topicIds); return q.list(); } }; return (List)getHibernateTemplate().execute(hcb); } /* * (non-Javadoc) * @see org.sakaiproject.api.app.messageforums.MessageForumsMessageManager#findReadMessageCountsForMainPage(java.util.Collection) */ public List<Object[]> findReadMessageCountsForMainPage(final Collection<Long> topicIds) { // have to manually check to make sure the Collection isn't empty to prevent Hibernate from // producing the "unexpected end of subtree" error. (SAKAI-399/357 [local UDayton] & SAK-16848) if (topicIds.isEmpty()) return new ArrayList<Object[]>(); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_READ_MESSAGE_COUNTS_FOR_MAIN_PAGE); q.setParameterList("topicIds", topicIds); q.setParameter("userId", getCurrentUser()); return q.list(); } }; return (List)getHibernateTemplate().execute(hcb); } public int findMessageCountTotal() { HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findMessageCountTotal"); q.setParameter("contextId", getContextId(), Hibernate.STRING); return q.uniqueResult(); } }; return ((Integer)getHibernateTemplate().execute(hcb)).intValue(); } public UnreadStatus findUnreadStatusByUserId(final Long topicId, final Long messageId, final String userId){ if (messageId == null || topicId == null || userId == null) { LOG.error("findUnreadStatusByUserId failed with topicId: " + topicId + ", messageId: " + messageId + ", userId: " + userId); throw new IllegalArgumentException("Null Argument"); } LOG.debug("findUnreadStatus executing with topicId: " + topicId + ", messageId: " + messageId); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_UNREAD_STATUS); q.setParameter("topicId", topicId, Hibernate.LONG); q.setParameter("messageId", messageId, Hibernate.LONG); q.setParameter("userId", userId, Hibernate.STRING); return q.uniqueResult(); } }; return (UnreadStatus) getHibernateTemplate().execute(hcb); } public UnreadStatus findUnreadStatus(final Long topicId, final Long messageId) { if (messageId == null || topicId == null) { LOG.error("findUnreadStatus failed with topicId: " + topicId + ", messageId: " + messageId); throw new IllegalArgumentException("Null Argument"); } if(getCurrentUser()!=null){ return findUnreadStatusByUserId(topicId, messageId, getCurrentUser()); }else return null; } public void deleteUnreadStatus(Long topicId, Long messageId) { if (messageId == null || topicId == null) { LOG.error("deleteUnreadStatus failed with topicId: " + topicId + ", messageId: " + messageId); throw new IllegalArgumentException("Null Argument"); } LOG.debug("deleteUnreadStatus executing with topicId: " + topicId + ", messageId: " + messageId); UnreadStatus status = findUnreadStatus(topicId, messageId); if (status != null) { getHibernateTemplate().delete(status); } } private boolean isMessageFromForums(Message message) { return message.getTopic() != null; } public void markMessageReadForUser(Long topicId, Long messageId, boolean read) { if (messageId == null || topicId == null) { LOG.error("markMessageReadForUser failed with topicId: " + topicId + ", messageId: " + messageId); throw new IllegalArgumentException("Null Argument"); } LOG.debug("markMessageReadForUser executing with topicId: " + topicId + ", messageId: " + messageId); if(getCurrentUser()!=null){ markMessageReadForUser(topicId, messageId, read, getCurrentUser()); } else return; } public void markMessageReadForUser(Long topicId, Long messageId, boolean read, String userId) { markMessageReadForUser(topicId, messageId, read, userId, ToolManager.getCurrentPlacement().getContext(), ToolManager.getCurrentTool().getId()); } public void markMessageReadForUser(Long topicId, Long messageId, boolean read, String userId, String context, String toolId) { // to only add to event log if not read boolean trulyUnread; boolean originalReadStatus; if (messageId == null || topicId == null || userId == null) { LOG.error("markMessageReadForUser failed with topicId: " + topicId + ", messageId: " + messageId + ", userId: " + userId); throw new IllegalArgumentException("Null Argument"); } LOG.debug("markMessageReadForUser executing with topicId: " + topicId + ", messageId: " + messageId); UnreadStatus status = findUnreadStatusByUserId(topicId, messageId, userId); if (status == null) { status = new UnreadStatusImpl(); trulyUnread = true; originalReadStatus = false; } else { trulyUnread = status.getRead().booleanValue(); trulyUnread = !trulyUnread; originalReadStatus = status.getRead().booleanValue(); } status.setTopicId(topicId); status.setMessageId(messageId); status.setUserId(userId); status.setRead(Boolean.valueOf(read)); Message message = (Message) getMessageById(messageId); boolean isMessageFromForums = isMessageFromForums(message); if (trulyUnread) { //increment the message count Integer nr = message.getNumReaders(); if (nr == null) nr = Integer.valueOf(0); nr = Integer.valueOf(nr.intValue() + 1); message.setNumReaders(nr); LOG.debug("set Message readers count to: " + nr); //baseForum is probably null if (message.getTopic().getBaseForum()==null && message.getTopic().getOpenForum() != null) message.getTopic().setBaseForum((BaseForum) message.getTopic().getOpenForum()); this.saveMessage(message, false, toolId, userId, context, true); if (isMessageFromForums) eventTrackingService.post(eventTrackingService.newEvent(DiscussionForumService.EVENT_FORUMS_READ, getEventMessage(message, toolId, userId, context), false)); else eventTrackingService.post(eventTrackingService.newEvent(DiscussionForumService.EVENT_MESSAGES_READ, getEventMessage(message, toolId, userId, context), false)); } getHibernateTemplate().saveOrUpdate(status); if (isMessageFromForums){ if(!originalReadStatus && read){ //status is changing from Unread to Read, so decrement unread number for Synoptic Messages decrementForumSynopticToolInfo(userId, context, SynopticMsgcntrManager.NUM_OF_ATTEMPTS); }else if(originalReadStatus && !read){ //status is changing from Read to Unread, so increment unread number for Synoptic Messages incrementForumSynopticToolInfo(userId, context, SynopticMsgcntrManager.NUM_OF_ATTEMPTS); } }else{ if(!originalReadStatus && read){ //status is changing from Unread to Read, so decrement unread number for Synoptic Messages decrementMessagesSynopticToolInfo(userId, context, SynopticMsgcntrManager.NUM_OF_ATTEMPTS); }else if(originalReadStatus && !read){ //status is changing from Read to Unread, so increment unread number for Synoptic Messages incrementMessagesSynopticToolInfo(userId, context, SynopticMsgcntrManager.NUM_OF_ATTEMPTS); } } } public void decrementForumSynopticToolInfo(String userId, String siteId, int numOfAttempts) { try { SynopticMsgcntrManagerCover.decrementForumSynopticToolInfo(userId, siteId); } catch (HibernateOptimisticLockingFailureException holfe) { // failed, so wait and try again try { Thread.sleep(SynopticMsgcntrManager.OPT_LOCK_WAIT); } catch (InterruptedException e) { e.printStackTrace(); } numOfAttempts--; if (numOfAttempts <= 0) { System.out .println("MessageForumsMessageManagerImpl: decrementForumSynopticToolInfo: HibernateOptimisticLockingFailureException no more retries left"); holfe.printStackTrace(); } else { System.out .println("MessageForumsMessageManagerImpl: decrementForumSynopticToolInfo: HibernateOptimisticLockingFailureException: attempts left: " + numOfAttempts); decrementForumSynopticToolInfo(userId, siteId, numOfAttempts); } } } public void incrementForumSynopticToolInfo(String userId, String siteId, int numOfAttempts) { try { SynopticMsgcntrManagerCover.incrementForumSynopticToolInfo(userId, siteId); } catch (HibernateOptimisticLockingFailureException holfe) { // failed, so wait and try again try { Thread.sleep(SynopticMsgcntrManager.OPT_LOCK_WAIT); } catch (InterruptedException e) { e.printStackTrace(); } numOfAttempts--; if (numOfAttempts <= 0) { System.out .println("MessageForumsMessageManagerImpl: incrementForumSynopticToolInfo: HibernateOptimisticLockingFailureException no more retries left"); holfe.printStackTrace(); } else { System.out .println("MessageForumsMessageManagerImpl: incrementForumSynopticToolInfo: HibernateOptimisticLockingFailureException: attempts left: " + numOfAttempts); incrementForumSynopticToolInfo(userId, siteId, numOfAttempts); } } } public void decrementMessagesSynopticToolInfo(String userId, String siteId, int numOfAttempts) { try { SynopticMsgcntrManagerCover.decrementMessagesSynopticToolInfo(userId, siteId); } catch (HibernateOptimisticLockingFailureException holfe) { // failed, so wait and try again try { Thread.sleep(SynopticMsgcntrManager.OPT_LOCK_WAIT); } catch (InterruptedException e) { e.printStackTrace(); } numOfAttempts--; if (numOfAttempts <= 0) { System.out .println("MessageForumsMessageManagerImpl: decrementMessagesSynopticToolInfo: HibernateOptimisticLockingFailureException no more retries left"); holfe.printStackTrace(); } else { System.out .println("MessageForumsMessageManagerImpl: decrementMessagesSynopticToolInfo: HibernateOptimisticLockingFailureException: attempts left: " + numOfAttempts); decrementMessagesSynopticToolInfo(userId, siteId, numOfAttempts); } } } public void incrementMessagesSynopticToolInfo(String userId, String siteId, int numOfAttempts) { try { SynopticMsgcntrManagerCover.incrementMessagesSynopticToolInfo(userId, siteId); } catch (HibernateOptimisticLockingFailureException holfe) { // failed, so wait and try again try { Thread.sleep(SynopticMsgcntrManager.OPT_LOCK_WAIT); } catch (InterruptedException e) { e.printStackTrace(); } numOfAttempts--; if (numOfAttempts <= 0) { System.out .println("MessageForumsMessageManagerImpl: incrementMessagesSynopticToolInfo: HibernateOptimisticLockingFailureException no more retries left"); holfe.printStackTrace(); } else { System.out .println("MessageForumsMessageManagerImpl: incrementMessagesSynopticToolInfo: HibernateOptimisticLockingFailureException: attempts left: " + numOfAttempts); incrementMessagesSynopticToolInfo(userId, siteId, numOfAttempts); } } } public boolean isMessageReadForUser(final Long topicId, final Long messageId) { if (messageId == null || topicId == null) { LOG.error("getMessageById failed with topicId: " + topicId + ", messageId: " + messageId); throw new IllegalArgumentException("Null Argument"); } LOG.debug("getMessageById executing with topicId: " + topicId + ", messageId: " + messageId); UnreadStatus status = findUnreadStatus(topicId, messageId); if (status == null) { return false; // not been saved yet, so it is unread } return status.getRead().booleanValue(); } public PrivateMessage createPrivateMessage() { PrivateMessage message = new PrivateMessageImpl(); message.setUuid(getNextUuid()); message.setTypeUuid(typeManager.getPrivateMessageAreaType()); message.setCreated(new Date()); message.setCreatedBy(getCurrentUser()); message.setDraft(Boolean.FALSE); message.setHasAttachments(Boolean.FALSE); LOG.debug("message " + message.getUuid() + " created successfully"); return message; } public Message createDiscussionMessage() { return createMessage(typeManager.getDiscussionForumType()); } public Message createOpenMessage() { return createMessage(typeManager.getOpenDiscussionForumType()); } public Message createMessage(String typeId) { Message message = new MessageImpl(); message.setUuid(getNextUuid()); message.setTypeUuid(typeId); message.setCreated(new Date()); message.setCreatedBy(getCurrentUser()); message.setDraft(Boolean.FALSE); message.setHasAttachments(Boolean.FALSE); LOG.debug("message " + message.getUuid() + " created successfully"); return message; } public Attachment createAttachment() { Attachment attachment = new AttachmentImpl(); attachment.setUuid(getNextUuid()); attachment.setCreated(new Date()); attachment.setCreatedBy(getCurrentUser()); attachment.setModified(new Date()); attachment.setModifiedBy(getCurrentUser()); LOG.debug("attachment " + attachment.getUuid() + " created successfully"); return attachment; } public void saveMessage(Message message) { saveMessage(message, true); } public void saveMessage(Message message, boolean logEvent) { saveMessage(message, logEvent, ToolManager.getCurrentTool().getId(), getCurrentUser(), getContextId()); } public void saveMessage(Message message, boolean logEvent, boolean ignoreLockedTopicForum) { saveMessage(message, logEvent, ToolManager.getCurrentTool().getId(), getCurrentUser(), getContextId(), ignoreLockedTopicForum); } public void saveMessage(Message message, boolean logEvent, String toolId, String userId, String contextId){ saveMessage(message, logEvent, toolId, userId, contextId, false); } public void saveMessage(Message message, boolean logEvent, String toolId, String userId, String contextId, boolean ignoreLockedTopicForum){ boolean isNew = message.getId() == null; if (!ignoreLockedTopicForum && !(message instanceof PrivateMessage)){ if (isForumOrTopicLocked(message.getTopic().getBaseForum().getId(), message.getTopic().getId())) { LOG.info("saveMessage executed [messageId: " + (isNew ? "new" : message.getId().toString()) + "] but forum is locked -- save aborted"); throw new LockedException("Message could not be saved [messageId: " + (isNew ? "new" : message.getId().toString()) + "]"); } } message.setModified(new Date()); if(getCurrentUser()!=null){ message.setModifiedBy(getCurrentUser()); } if(message.getUuid() == null || message.getCreated() == null || message.getCreatedBy() == null || message.getModified() == null || message.getModifiedBy() == null || message.getTitle() == null || message.getAuthor() == null || message.getHasAttachments() == null || message.getTypeUuid() == null || message.getDraft() == null) { LOG.error("null attribute(s) for saving message in MessageForumsMessageManagerImpl.saveMessage"); } if (message.getNumReaders() == null) message.setNumReaders(0); //MSGCNTR-448 if this is a top new top level message make sure the thread date is set if (logEvent) { if (isNew && message.getDateThreadlastUpdated() == null) { //we don't need to do this on non log events message.setDateThreadlastUpdated(new Date()); if (message.getInReplyTo() != null) { if (message.getInReplyTo().getThreadId() != null) { message.setThreadId(message.getInReplyTo().getThreadId()); } else { message.setThreadId(message.getInReplyTo().getId()); } } } } getHibernateTemplate().saveOrUpdate(message); if (logEvent) { if (isNew) { if (isMessageFromForums(message)) eventTrackingService.post(eventTrackingService.newEvent(DiscussionForumService.EVENT_FORUMS_ADD, getEventMessage(message, toolId, userId, contextId), false)); else eventTrackingService.post(eventTrackingService.newEvent(DiscussionForumService.EVENT_MESSAGES_ADD, getEventMessage(message, toolId, userId, contextId), false)); } else { if (isMessageFromForums(message)) eventTrackingService.post(eventTrackingService.newEvent(DiscussionForumService.EVENT_FORUMS_RESPONSE, getEventMessage(message, toolId, userId, contextId), false)); else eventTrackingService.post(eventTrackingService.newEvent(DiscussionForumService.EVENT_MESSAGES_RESPONSE, getEventMessage(message, toolId, userId, contextId), false)); } } LOG.debug("message " + message.getId() + " saved successfully"); } public void deleteMessage(Message message) { long id = message.getId().longValue(); message.setInReplyTo(null); getHibernateTemplate().saveOrUpdate(message); try { getSession().flush(); } catch (Exception e) { e.printStackTrace(); } if (isMessageFromForums(message)) eventTrackingService.post(eventTrackingService.newEvent(DiscussionForumService.EVENT_FORUMS_REMOVE, getEventMessage(message), false)); else eventTrackingService.post(eventTrackingService.newEvent(DiscussionForumService.EVENT_MESSAGES_REMOVE, getEventMessage(message), false)); try { getSession().evict(message); } catch (Exception e) { e.printStackTrace(); LOG.error("could not evict message: " + message.getId(), e); } Topic topic = message.getTopic(); topic.removeMessage(message); getHibernateTemplate().saveOrUpdate(topic); //getHibernateTemplate().delete(message); try { getSession().flush(); } catch (Exception e) { e.printStackTrace(); } LOG.debug("message " + id + " deleted successfully"); } public Message getMessageById(final Long messageId) { if (messageId == null) { throw new IllegalArgumentException("Null Argument"); } LOG.debug("getMessageById executing with messageId: " + messageId); return (Message) getHibernateTemplate().get(MessageImpl.class, messageId); } /** * @see org.sakaiproject.api.app.messageforums.MessageForumsMessageManager#getMessageByIdWithAttachments(java.lang.Long) */ public Message getMessageByIdWithAttachments(final Long messageId){ if (messageId == null) { throw new IllegalArgumentException("Null Argument"); } LOG.debug("getMessageByIdWithAttachments executing with messageId: " + messageId); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_BY_MESSAGE_ID_WITH_ATTACHMENTS); q.setParameter("id", messageId, Hibernate.LONG); return q.uniqueResult(); } }; return (Message) getHibernateTemplate().execute(hcb); } public Attachment getAttachmentById(final Long attachmentId) { if (attachmentId == null) { throw new IllegalArgumentException("Null Argument"); } LOG.debug("getAttachmentById executing with attachmentId: " + attachmentId); return (Attachment) getHibernateTemplate().get(AttachmentImpl.class, attachmentId); } public void getChildMsgs(final Long messageId, List returnList) { List tempList; HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_CHILD_MESSAGES); Query qOrdered= session.createQuery(q.getQueryString()); qOrdered.setParameter("messageId", messageId, Hibernate.LONG); return qOrdered.list(); } }; tempList = (List) getHibernateTemplate().execute(hcb); if(tempList != null) { for(int i=0; i<tempList.size(); i++) { getChildMsgs(((Message)tempList.get(i)).getId(), returnList); returnList.add((Message) tempList.get(i)); } } } /** * Will set the approved status on the given message */ public void markMessageApproval(Long messageId, boolean approved) { if (messageId == null) { LOG.error("markMessageApproval failed with messageId: null"); throw new IllegalArgumentException("Null Argument"); } LOG.debug("markMessageApproval executing with messageId: " + messageId); Message message = (Message) getMessageById(messageId); message.setApproved(Boolean.valueOf(approved)); getHibernateTemplate().saveOrUpdate(message); } public void deleteMsgWithChild(final Long messageId) { List thisList = new ArrayList(); getChildMsgs(messageId, thisList); for(int i=0; i<thisList.size(); i++) { Message delMessage = getMessageById(((Message)thisList.get(i)).getId()); deleteMessage(delMessage); } deleteMessage(getMessageById(messageId)); } public List getFirstLevelChildMsgs(final Long messageId) { HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_CHILD_MESSAGES); Query qOrdered= session.createQuery(q.getQueryString()); qOrdered.setParameter("messageId", messageId, Hibernate.LONG); return qOrdered.list(); } }; return (List)getHibernateTemplate().executeFind(hcb); } public List sortMessageBySubject(Topic topic, boolean asc) { List list = topic.getMessages(); if (asc) { Collections.sort(list, MessageImpl.SUBJECT_COMPARATOR); } else { Collections.sort(list, MessageImpl.SUBJECT_COMPARATOR_DESC); } topic.setMessages(list); return list; } public List sortMessageByAuthor(Topic topic, boolean asc) { List list = topic.getMessages(); if (asc) { Collections.sort(list, MessageImpl.AUTHORED_BY_COMPARATOR); } else { Collections.sort(list, MessageImpl.AUTHORED_BY_COMPARATOR_DESC); } topic.setMessages(list); return list; } public List sortMessageByDate(Topic topic, boolean asc) { List list = topic.getMessages(); if (asc) { Collections.sort(list, MessageImpl.DATE_COMPARATOR); } else { Collections.sort(list, MessageImpl.DATE_COMPARATOR_DESC); } topic.setMessages(list); return list; } public List sortMessageByDate(List list, boolean asc) { if (list == null || list.isEmpty()) return null; if (asc) { Collections.sort(list, MessageImpl.DATE_COMPARATOR); } else { Collections.sort(list, MessageImpl.DATE_COMPARATOR_DESC); } return list; } private boolean isForumOrTopicLocked(final Long forumId, final Long topicId) { if (forumId == null || topicId == null) { LOG.error("isForumLocked called with null arguments"); throw new IllegalArgumentException("Null Argument"); } LOG.debug("isForumLocked executing with forumId: " + forumId + ":: topicId: " + topicId); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findForumLockedAttribute"); q.setParameter("id", forumId, Hibernate.LONG); return q.uniqueResult(); } }; HibernateCallback hcb2 = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findTopicLockedAttribute"); q.setParameter("id", topicId, Hibernate.LONG); return q.uniqueResult(); } }; return ((Boolean) getHibernateTemplate().execute(hcb)).booleanValue() || ((Boolean) getHibernateTemplate().execute(hcb2)).booleanValue(); } // helpers private String getCurrentUser() { if (TestUtil.isRunningTests()) { return "test-user"; } return sessionManager.getCurrentSessionUserId(); } private String getNextUuid() { return idManager.createUuid(); } private String getEventMessage(Object object) { return getEventMessage(object, ToolManager.getCurrentTool().getId(), getCurrentUser(), getContextId()); } private String getEventMessage(Object object, String toolId, String userId, String contextId) { String eventMessagePrefix = ""; if (toolId.equals(DiscussionForumService.MESSAGE_CENTER_ID)) eventMessagePrefix = "/messagesAndForums/site/"; else if (toolId.equals(DiscussionForumService.MESSAGES_TOOL_ID)) eventMessagePrefix = "/messages/site/"; else eventMessagePrefix = "/forums/site/"; return eventMessagePrefix + contextId + "/" + object.toString() + "/" + userId; } public List getAllRelatedMsgs(final Long messageId) { Message rootMsg = getMessageById(messageId); while(rootMsg.getInReplyTo() != null) { rootMsg = rootMsg.getInReplyTo(); } List childList = new ArrayList(); getChildMsgs(rootMsg.getId(), childList); List returnList = new ArrayList(); returnList.add(rootMsg); for(int i=0; i<childList.size(); i++) { returnList.add((Message)childList.get(i)); } return returnList; } /** * * @param topicId * @param searchText * @return */ public List findPvtMsgsBySearchText(final String typeUuid, final String searchText, final Date searchFromDate, final Date searchToDate, final boolean searchByText, final boolean searchByAuthor, final boolean searchByBody, final boolean searchByLabel, final boolean searchByDate) { LOG.debug("findPvtMsgsBySearchText executing with searchText: " + searchText); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findPvtMsgsBySearchText"); q.setParameter("searchText", "%" + searchText + "%"); q.setParameter("searchByText", convertBooleanToInteger(searchByText)); q.setParameter("searchByAuthor", convertBooleanToInteger(searchByAuthor)); q.setParameter("searchByBody", convertBooleanToInteger(searchByBody)); q.setParameter("searchByLabel", convertBooleanToInteger(searchByLabel)); q.setParameter("searchByDate", convertBooleanToInteger(searchByDate)); q.setParameter("searchFromDate", (searchFromDate == null) ? new Date(0) : searchFromDate); q.setParameter("searchToDate", (searchToDate == null) ? new Date(System.currentTimeMillis()) : searchToDate); q.setParameter("userId", getCurrentUser()); q.setParameter("contextId", ToolManager.getCurrentPlacement().getContext()); q.setParameter("typeUuid", typeUuid); return q.list(); } }; return (List) getHibernateTemplate().execute(hcb); } private Integer convertBooleanToInteger(boolean value) { Integer retVal = (Boolean.TRUE.equals(value)) ? 1 : 0; return Integer.valueOf(retVal); } private String getContextId() { if (TestUtil.isRunningTests()) { return "test-context"; } Placement placement = ToolManager.getCurrentPlacement(); String presentSiteId = placement.getContext(); return presentSiteId; } public String getAttachmentUrl(String id) { try { return contentHostingService.getResource(id).getUrl(false); } catch(Exception e) { LOG.error("MessageForumsMessageManagerImpl.getAttachmentUrl" + e, e); } return null; } public String getAttachmentRelativeUrl(String id) { try { return contentHostingService.getResource(id).getUrl(true); } catch(Exception e) { LOG.error("MessageForumsMessageManagerImpl.getAttachmentUrl" + e, e); } return null; } /** * Returns true if the tool with the id passed in exists in the * current site. * * @param toolId * The tool id to search for. * * @return * TRUE if tool exists, FALSE otherwise. */ public boolean currentToolMatch(String toolId) { String curToolId = ToolManager.getCurrentTool().getId(); if (curToolId.equals(MESSAGECENTER_HELPER_TOOL_ID)) { curToolId = ToolManager.getCurrentPlacement().getTool().getId(); } if (toolId.equals(curToolId)) { return true; } return false; } /** * Return TRUE if tool with id passed in exists in site passed in * FALSE otherwise. * * @param thisSite * Site object to check * @param toolId * Tool id to be checked * * @return */ public boolean isToolInSite(String siteId, String toolId) { Site thisSite; try { thisSite = SiteService.getSite(siteId); Collection toolsInSite = thisSite.getTools(toolId); return ! toolsInSite.isEmpty(); } catch (IdUnusedException e) { // Weirdness - should not happen LOG.error("IdUnusedException attempting to get site for id " + siteId + " to check if tool " + "with id " + toolId + " is in it.", e); } return false; } public Map<Long, Boolean> getReadStatusForMessagesWithId(final List msgIds, final String userId) { Map<Long, Boolean> statusMap = new HashMap<Long, Boolean>(); if( msgIds != null && msgIds.size() > 0) { HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_READ_STATUS_WITH_MSGS_USER); q.setParameter("userId", userId, Hibernate.STRING); q.setParameterList("msgIds", msgIds); return q.list(); } }; for (Iterator msgIdIter = msgIds.iterator(); msgIdIter.hasNext();) { Long msgId = (Long) msgIdIter.next(); statusMap.put(msgId, Boolean.FALSE); } List statusList = (List)getHibernateTemplate().execute(hcb); if(statusList != null) { for(int i=0; i<statusList.size(); i++) { UnreadStatus status = (UnreadStatus) statusList.get(i); if(status != null) { statusMap.put(status.getMessageId(), status.getRead()); } } } } return statusMap; } public List getPendingMsgsInSiteByMembership(final List membershipList) { if (membershipList == null) { LOG.error("getPendingMsgsInSiteByMembership failed with membershipList: null"); throw new IllegalArgumentException("Null Argument"); } // First, check by permissionLevel (custom permissions) HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_FIND_PENDING_MSGS_BY_CONTEXT_AND_USER_AND_PERMISSION_LEVEL); q.setParameter("contextId", getContextId(), Hibernate.STRING); q.setParameterList("membershipList", membershipList); return q.list(); } }; Message tempMsg = null; Set resultSet = new HashSet(); List temp = (ArrayList) getHibernateTemplate().execute(hcb); for (Iterator i = temp.iterator(); i.hasNext();) { Object[] results = (Object[]) i.next(); if (results != null) { if (results[0] instanceof Message) { tempMsg = (Message)results[0]; tempMsg.setTopic((Topic)results[1]); tempMsg.getTopic().setBaseForum((BaseForum)results[2]); } resultSet.add(tempMsg); } } // Second, check by PermissionLevelName (non-custom permissions) HibernateCallback hcb2 = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_FIND_PENDING_MSGS_BY_CONTEXT_AND_USER_AND_PERMISSION_LEVEL_NAME); q.setParameter("contextId", getContextId(), Hibernate.STRING); q.setParameterList("membershipList", membershipList); q.setParameter("customTypeUuid", typeManager.getCustomLevelType(), Hibernate.STRING); return q.list(); } }; temp = (ArrayList) getHibernateTemplate().execute(hcb2); for (Iterator i = temp.iterator(); i.hasNext();) { Object[] results = (Object[]) i.next(); if (results != null) { if (results[0] instanceof Message) { tempMsg = (Message)results[0]; tempMsg.setTopic((Topic)results[1]); tempMsg.getTopic().setBaseForum((BaseForum)results[2]); } resultSet.add(tempMsg); } } return Util.setToList(resultSet); } public List getPendingMsgsInTopic(final Long topicId) { if (topicId == null) { LOG.error("getPendingMsgsInTopic failed with topicId: null"); throw new IllegalArgumentException("Null Argument"); } LOG.debug("getPendingMsgsInTopic executing with topicId: " + topicId); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_FIND_PENDING_MSGS_BY_TOPICID); q.setParameter("topicId", topicId, Hibernate.LONG); return q.list(); } }; Message tempMsg = null; Set resultSet = new HashSet(); List temp = (ArrayList) getHibernateTemplate().execute(hcb); for (Iterator i = temp.iterator(); i.hasNext();) { Object[] results = (Object[]) i.next(); if (results != null) { if (results[0] instanceof Message) { tempMsg = (Message)results[0]; tempMsg.setTopic((Topic)results[1]); tempMsg.getTopic().setBaseForum((BaseForum)results[2]); } resultSet.add(tempMsg); } } return Util.setToList(resultSet); } public List<Message> getAllMessagesInSite(final String siteId) { LOG.debug("getAllMessagesInSite executing with siteId: " + siteId); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findDiscussionForumMessagesInSite"); q.setParameter("contextId", siteId, Hibernate.STRING); return q.list(); } }; Message tempMsg = null; Set resultSet = new HashSet(); List temp = (ArrayList) getHibernateTemplate().execute(hcb); LOG.debug("got an initial list of " + temp.size()); for (Iterator i = temp.iterator(); i.hasNext();) { Object[] results = (Object[]) i.next(); if (results != null) { if (results[0] instanceof Message) { tempMsg = (Message)results[0]; tempMsg.setTopic((Topic)results[1]); tempMsg.getTopic().setBaseForum((BaseForum)results[2]); } resultSet.add(tempMsg); } } LOG.debug("about to return"); return Util.setToList(resultSet); } public void saveMessageMoveHistory(Long messageId, Long desttopicId, Long sourceTopicId, boolean checkReminder){ if (messageId == null || desttopicId == null || sourceTopicId == null) { LOG.error("saveMessageMoveHistory failed with desttopicId: " + desttopicId + ", messageId: " + messageId + ", sourceTopicId: " + sourceTopicId); throw new IllegalArgumentException("Null Argument"); } if (LOG.isDebugEnabled()) LOG.debug("saveMessageMoveHistory executing with desttopicId: " + desttopicId + ", messageId: " + messageId + ", sourceTopicId: " + sourceTopicId); List moved_history = null; moved_history = this.findMovedHistoryByMessageId(messageId); // if moving back to the original topic, set reminder to false, otherwise the original topic will show a Move reminder. if (LOG.isDebugEnabled()) LOG.debug("saveMessageMoveHistory (moved_messages size " + moved_history.size() ); for (Iterator histIter = moved_history.iterator(); histIter.hasNext();) { MessageMoveHistory hist = (MessageMoveHistory) histIter.next(); if (LOG.isDebugEnabled()) LOG.debug("moved message ids = " + hist.getId() + " from : " + hist.getFromTopicId() + " topic : " + hist.getToTopicId() ); if (hist.getFromTopicId().equals(desttopicId)){ hist.setReminder(false); hist.setModified(new Date()); hist.setModifiedBy(getCurrentUser()); getHibernateTemplate().update(hist); } } MessageMoveHistory mhist = new MessageMoveHistoryImpl (); mhist.setToTopicId(desttopicId); mhist.setMessageId(messageId); mhist.setFromTopicId(sourceTopicId); mhist.setReminder(checkReminder); mhist.setUuid(getNextUuid()); mhist.setCreated(new Date()); mhist.setCreatedBy(getCurrentUser()); mhist.setModified(new Date()); mhist.setModifiedBy(getCurrentUser()); getHibernateTemplate().saveOrUpdate(mhist); } public List findMovedMessagesByTopicId(final Long topicId) { if (topicId == null) { LOG.error("findMovedMessagesByTopicId failed with topicId: " + topicId); throw new IllegalArgumentException("Null Argument"); } if (LOG.isDebugEnabled()) LOG.debug("findMovedMessagesByTopicId executing with topicId: " + topicId); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_MOVED_MESSAGES_BY_TOPICID); q.setParameter("topicId", topicId, Hibernate.LONG); return q.list(); } }; return (List) getHibernateTemplate().execute(hcb); } public List findMovedHistoryByMessageId(final Long messageid){ if (messageid == null) { LOG.error("findMovedHistoryByMessageId failed with messageid: " + messageid); throw new IllegalArgumentException("Null Argument"); } if (LOG.isDebugEnabled()) LOG.debug("findMovedHistoryByMessageId executing with messageid: " + messageid); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_MOVED_HISTORY_BY_MESSAGEID); q.setParameter("messageId", messageid, Hibernate.LONG); return q.list(); } }; return (List) getHibernateTemplate().execute(hcb); } }