/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/msgcntr/trunk/messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/ui/PrivateMessageManagerImpl.java $ * $Id: PrivateMessageManagerImpl.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.ui; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.mail.MessagingException; import javax.mail.internet.InternetAddress; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.Hibernate; import org.hibernate.HibernateException; import org.hibernate.LockMode; import org.hibernate.Query; import org.hibernate.Session; import org.sakaiproject.api.app.messageforums.Area; import org.sakaiproject.api.app.messageforums.AreaManager; import org.sakaiproject.api.app.messageforums.Attachment; import org.sakaiproject.api.app.messageforums.DefaultPermissionsManager; import org.sakaiproject.api.app.messageforums.DiscussionForumService; import org.sakaiproject.api.app.messageforums.Message; import org.sakaiproject.api.app.messageforums.MessageForumsForumManager; import org.sakaiproject.api.app.messageforums.MessageForumsMessageManager; import org.sakaiproject.api.app.messageforums.MessageForumsTypeManager; import org.sakaiproject.api.app.messageforums.PrivateForum; import org.sakaiproject.api.app.messageforums.PrivateMessage; import org.sakaiproject.api.app.messageforums.PrivateMessageRecipient; import org.sakaiproject.api.app.messageforums.PrivateTopic; import org.sakaiproject.api.app.messageforums.SynopticMsgcntrManager; import org.sakaiproject.api.app.messageforums.Topic; import org.sakaiproject.api.app.messageforums.UniqueArrayList; import org.sakaiproject.api.app.messageforums.cover.SynopticMsgcntrManagerCover; import org.sakaiproject.api.app.messageforums.ui.PrivateMessageManager; import org.sakaiproject.authz.cover.SecurityService; import org.sakaiproject.component.app.messageforums.TestUtil; import org.sakaiproject.component.app.messageforums.dao.hibernate.PrivateMessageImpl; import org.sakaiproject.component.app.messageforums.dao.hibernate.PrivateMessageRecipientImpl; import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.content.api.ContentHostingService; import org.sakaiproject.content.api.ContentResource; import org.sakaiproject.email.api.EmailService; import org.sakaiproject.event.cover.EventTrackingService; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.id.api.IdManager; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.api.ToolConfiguration; import org.sakaiproject.site.cover.SiteService; import org.sakaiproject.tool.api.SessionManager; import org.sakaiproject.tool.api.ToolSession; import org.sakaiproject.tool.cover.ToolManager; import org.sakaiproject.user.api.User; import org.sakaiproject.user.cover.UserDirectoryService; import org.sakaiproject.util.ResourceLoader; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; public class PrivateMessageManagerImpl extends HibernateDaoSupport implements PrivateMessageManager { private static final Log LOG = LogFactory .getLog(PrivateMessageManagerImpl.class); private static final String QUERY_AGGREGATE_COUNT = "findAggregatePvtMsgCntForUserInContext"; private static final String QUERY_MESSAGES_BY_USER_TYPE_AND_CONTEXT = "findPrvtMsgsByUserTypeContext"; private static final String QUERY_MESSAGES_BY_ID_WITH_RECIPIENTS = "findPrivateMessageByIdWithRecipients"; private static final String MESSAGECENTER_BUNDLE = "org.sakaiproject.api.app.messagecenter.bundle.Messages"; private AreaManager areaManager; private MessageForumsMessageManager messageManager; private MessageForumsForumManager forumManager; private MessageForumsTypeManager typeManager; private IdManager idManager; private SessionManager sessionManager; private EmailService emailService; private ContentHostingService contentHostingService; private static final String MESSAGES_TITLE = "pvt_message_nav";// Mensajes-->Messages/need to be modified to support internationalization private static final String PVT_RECEIVED = "pvt_received"; // Recibidos ( 0 mensajes )-->Received ( 8 messages - 8 unread ) private static final String PVT_SENT = "pvt_sent"; // Enviados ( 0 mensajes )--> Sent ( 0 message ) private static final String PVT_DELETED = "pvt_deleted"; // Borrados ( 0 mensajes )-->Deleted ( 0 message ) private static final String PVT_DRAFTS = "pvt_drafts"; /** String ids for email footer messsage */ private static final String EMAIL_FOOTER1 = "pvt_email_footer1"; private static final String EMAIL_FOOTER2 = "pvt_email_footer2"; private static final String EMAIL_FOOTER3 = "pvt_email_footer3"; private static final String EMAIL_FOOTER4 = "pvt_email_footer4"; public void init() { LOG.info("init()"); ; } public void setContentHostingService(ContentHostingService contentHostingService) { this.contentHostingService = contentHostingService; } public boolean getPrivateAreaEnabled() { if (LOG.isDebugEnabled()) { LOG.debug("getPrivateAreaEnabled()"); } return areaManager.isPrivateAreaEnabled(); } public void setPrivateAreaEnabled(boolean value) { if (LOG.isDebugEnabled()) { LOG.debug("setPrivateAreaEnabled(value: " + value + ")"); } } /** * @see org.sakaiproject.api.app.messageforums.ui.PrivateMessageManager#isPrivateAreaEnabled() */ public boolean isPrivateAreaEnabled() { return areaManager.isPrivateAreaEnabled(); } /** * @see org.sakaiproject.api.app.messageforums.ui.PrivateMessageManager#getPrivateMessageArea() */ public Area getPrivateMessageArea() { return areaManager.getPrivateArea(); } public Area getPrivateMessageArea(String siteId) { return areaManager.getPrivateArea(siteId); } public void savePrivateMessageArea(Area area) { areaManager.saveArea(area); } /** * @see org.sakaiproject.api.app.messageforums.ui.PrivateMessageManager#initializePrivateMessageArea(org.sakaiproject.api.app.messageforums.Area) */ public PrivateForum initializePrivateMessageArea(Area area, List aggregateList){ return initializePrivateMessageArea(area, aggregateList, getCurrentUser()); } //==============Need to be modified to support localization huxt public PrivateForum initializePrivateMessageArea(Area area, List aggregateList, String userId){ return initializePrivateMessageArea(area, aggregateList, userId, getContextId()); } public PrivateForum initializePrivateMessageArea(Area area, List aggregateList, String userId, String siteId) { // String userId = getCurrentUser(); aggregateList.clear(); aggregateList.addAll(initializeMessageCounts(userId, siteId)); getHibernateTemplate().lock(area, LockMode.NONE); PrivateForum pf; /** create default user forum/topics if none exist */ if ((pf = forumManager.getPrivateForumByOwnerArea(userId, area)) == null) { /** initialize collections */ //getHibernateTemplate().initialize(area.getPrivateForumsSet()); pf = forumManager.createPrivateForum(getResourceBundleString(MESSAGES_TITLE), userId); //area.addPrivateForum(pf); //pf.setArea(area); //areaManager.saveArea(area); PrivateTopic receivedTopic = forumManager.createPrivateForumTopic(PVT_RECEIVED, true,false, userId, pf.getId()); PrivateTopic sentTopic = forumManager.createPrivateForumTopic(PVT_SENT, true,false, userId, pf.getId()); PrivateTopic deletedTopic = forumManager.createPrivateForumTopic(PVT_DELETED, true,false, userId, pf.getId()); PrivateTopic draftTopic = forumManager.createPrivateForumTopic(PVT_DRAFTS, true,false, userId, pf.getId()); /** save individual topics - required to add to forum's topic set */ forumManager.savePrivateForumTopic(receivedTopic, userId, siteId); forumManager.savePrivateForumTopic(sentTopic, userId, siteId); forumManager.savePrivateForumTopic(deletedTopic, userId, siteId); forumManager.savePrivateForumTopic(draftTopic); pf.addTopic(receivedTopic); pf.addTopic(sentTopic); pf.addTopic(deletedTopic); pf.addTopic(draftTopic); pf.setArea(area); PrivateForum oldForum; if ((oldForum = forumManager.getPrivateForumByOwnerAreaNull(userId)) != null) { oldForum = initializationHelper(oldForum, userId); // getHibernateTemplate().initialize(oldForum.getTopicsSet()); List pvtTopics = oldForum.getTopics(); for(int i=0; i<pvtTopics.size(); i++)//reveived deleted sent { PrivateTopic currentTopic = (PrivateTopic) pvtTopics.get(i); if(currentTopic != null) { if(!currentTopic.getTitle().equals(PVT_RECEIVED) && !currentTopic.getTitle().equals(PVT_SENT) && !currentTopic.getTitle().equals(PVT_DELETED) && !currentTopic.getTitle().equals(PVT_DRAFTS) && area.getContextId().equals(currentTopic.getContextId())) { currentTopic.setPrivateForum(pf); forumManager.savePrivateForumTopic(currentTopic, userId, siteId); pf.addTopic(currentTopic); } } } if(oldForum.getAutoForward() != null) { pf.setAutoForward(oldForum.getAutoForward()); } if(oldForum.getAutoForwardEmail() != null) { pf.setAutoForwardEmail(oldForum.getAutoForwardEmail()); } } forumManager.savePrivateForum(pf, userId); } else{ //getHibernateTemplate().initialize(pf.getTopicsSet()); pf = forumManager.getPrivateForumByOwnerAreaWithAllTopics(userId, area); } return pf; } public PrivateForum initializationHelper(PrivateForum forum){ return initializationHelper(forum, getCurrentUser()); } public PrivateForum initializationHelper(PrivateForum forum, String userId){ /** reget to load topic foreign keys */ //PrivateForum pf = forumManager.getPrivateForumByOwnerAreaNull(getCurrentUser()); //getHibernateTemplate().initialize(pf.getTopicsSet()); PrivateForum pf = forumManager.getPrivateForumByOwnerAreaNullWithAllTopics(userId); return pf; } public PrivateForum initializationHelper(PrivateForum forum, Area area){ return initializationHelper(forum, area, getCurrentUser()); } public PrivateForum initializationHelper(PrivateForum forum, Area area, String userId){ /** reget to load topic foreign keys */ //PrivateForum pf = forumManager.getPrivateForumByOwnerArea(getCurrentUser(), area); //getHibernateTemplate().initialize(pf.getTopicsSet()); PrivateForum pf = forumManager.getPrivateForumByOwnerAreaWithAllTopics(userId, area); return pf; } /** * @see org.sakaiproject.api.app.messageforums.ui.PrivateMessageManager#savePrivateMessage(org.sakaiproject.api.app.messageforums.Message) */ public void savePrivateMessage(Message message) { messageManager.saveMessage(message); } /** * @see org.sakaiproject.api.app.messageforums.ui.PrivateMessageManager#savePrivateMessage(org.sakaiproject.api.app.messageforums.Message, boolean logEvent) */ public void savePrivateMessage(Message message, boolean logEvent) { messageManager.saveMessage(message, logEvent); } public Message getMessageById(Long id) { return messageManager.getMessageById(id); } //Attachment public Attachment createPvtMsgAttachment(String attachId, String name) { try { Attachment attach = messageManager.createAttachment(); attach.setAttachmentId(attachId); attach.setAttachmentName(name); ContentResource cr = contentHostingService.getResource(attachId); attach.setAttachmentSize((Long.valueOf(cr.getContentLength())).toString()); attach.setCreatedBy(cr.getProperties().getProperty( cr.getProperties().getNamePropCreator())); attach.setModifiedBy(cr.getProperties().getProperty( cr.getProperties().getNamePropModifiedBy())); attach.setAttachmentType(cr.getContentType()); String tempString = cr.getUrl(); String newString = ""; char[] oneChar = new char[1]; for (int i = 0; i < tempString.length(); i++) { if (tempString.charAt(i) != ' ') { oneChar[0] = tempString.charAt(i); String concatString = new String(oneChar); newString = newString.concat(concatString); } else { newString = newString.concat("%20"); } } //tempString.replaceAll(" ", "%20"); //attach.setAttachmentUrl(newString); attach.setAttachmentUrl("/url"); return attach; } catch (Exception e) { e.printStackTrace(); return null; } } // Himansu: I am not quite sure this is what you want... let me know. // Before saving a message, we need to add all the attachmnets to a perticular message public void addAttachToPvtMsg(PrivateMessage pvtMsgData, Attachment pvtMsgAttach) { pvtMsgData.addAttachment(pvtMsgAttach); } // Required for editing multiple attachments to a message. // When you reply to a message, you do have option to edit attachments to a message public void removePvtMsgAttachment(Attachment o) { o.getMessage().removeAttachment(o); } public Attachment getPvtMsgAttachment(Long pvtMsgAttachId) { return messageManager.getAttachmentById(pvtMsgAttachId); } public int getTotalNoMessages(Topic topic) { return messageManager.findMessageCountByTopicId(topic.getId()); } public int getUnreadNoMessages(Topic topic) { return messageManager.findUnreadMessageCountByTopicId(topic.getId()); } /** * @see org.sakaiproject.api.app.messageforums.ui.PrivateMessageManager#saveAreaAndForumSettings(org.sakaiproject.api.app.messageforums.Area, org.sakaiproject.api.app.messageforums.PrivateForum) */ public void saveAreaAndForumSettings(Area area, PrivateForum forum) { /** method calls placed in this function to participate in same transaction */ saveForumSettings(forum); /** need to evict forum b/c area saves fk on forum (which places two objects w/same id in session */ //getHibernateTemplate().evict(forum); if (isInstructor() || isEmailPermit()){ savePrivateMessageArea(area); } } public void saveForumSettings(PrivateForum forum) { if (LOG.isDebugEnabled()) { LOG.debug("saveForumSettings(forum: " + forum + ")"); } if (forum == null) { throw new IllegalArgumentException("Null Argument"); } forumManager.savePrivateForum(forum); } /** * Topic Folder Setting */ public boolean isMutableTopicFolder(String parentTopicId) { return false; } public void createTopicFolderInForum(PrivateForum pf, String folderName) { String userId = getCurrentUser(); PrivateTopic createdTopic = forumManager.createPrivateForumTopic(folderName, true,true, userId, pf.getId()); /** set context and type to differentiate user topics within sites */ createdTopic.setContextId(getContextId()); createdTopic.setTypeUuid(typeManager.getUserDefinedPrivateTopicType()); forumManager.savePrivateForumTopic(createdTopic); pf.addTopic(createdTopic); forumManager.savePrivateForum(pf); } public void createTopicFolderInTopic(PrivateForum pf, PrivateTopic parentTopic, String folderName) { String userId = getCurrentUser(); PrivateTopic createdTopic = forumManager.createPrivateForumTopic(folderName, true,true, userId, pf.getId()); createdTopic.setParentTopic(parentTopic); forumManager.savePrivateForumTopic(createdTopic); pf.addTopic(createdTopic); forumManager.savePrivateForum(pf); } public void renameTopicFolder(PrivateForum pf, String topicUuid, String newName) { String userId = getCurrentUser(); List pvtTopics= pf.getTopics(); for (Iterator iter = pvtTopics.iterator(); iter.hasNext();) { PrivateTopic element = (PrivateTopic) iter.next(); if(element.getUuid().equals(topicUuid)) { element.setTitle(newName); element.setModifiedBy(userId); element.setModified(new Date()); EventTrackingService.post(EventTrackingService.newEvent(DiscussionForumService.EVENT_MESSAGES_FOLDER_REVISE, getEventMessage(element), false)); } } forumManager.savePrivateForum(pf); } public void deleteTopicFolder(PrivateForum pf,String topicUuid) { List pvtTopics= pf.getTopics(); for (Iterator iter = pvtTopics.iterator(); iter.hasNext();) { PrivateTopic element = (PrivateTopic) iter.next(); if(element.getUuid().equals(topicUuid)) { pf.removeTopic(element); EventTrackingService.post(EventTrackingService.newEvent(DiscussionForumService.EVENT_MESSAGES_FOLDER_REMOVE, getEventMessage(element), false)); break; } } forumManager.savePrivateForum(pf); } /** * Return Topic based on uuid * @see org.sakaiproject.api.app.messageforums.ui.PrivateMessageManager#getTopicByIdWithMessages(java.lang.Long) */ public Topic getTopicByUuid(final String topicUuid) { if (LOG.isDebugEnabled()) { LOG.debug("getTopicByIdWithMessages(final Long" + topicUuid + ")"); } return forumManager.getTopicByUuid(topicUuid); } public static final String PVTMSG_MODE_RECEIVED = "pvt_received"; public static final String PVTMSG_MODE_SENT = "pvt_sent"; public static final String PVTMSG_MODE_DELETE = "pvt_deleted"; public static final String PVTMSG_MODE_DRAFT = "pvt_drafts"; public void movePvtMsgTopic(PrivateMessage message, Topic oldTopic, Topic newTopic) { List recipients= message.getRecipients(); //get new topic type uuid String newTopicTypeUuid=getTopicTypeUuid(newTopic.getTitle()); //get pld topic type uuid String oldTopicTypeUuid=getTopicTypeUuid(oldTopic.getTitle()); //now set the recipiant with new topic type uuid for (Iterator iter = recipients.iterator(); iter.hasNext();) { PrivateMessageRecipient element = (PrivateMessageRecipient) iter.next(); LOG.debug("element.getTypeUuid(): "+element.getTypeUuid()+", oldTopicTypeUuid: "+oldTopicTypeUuid+", element.getUserId(): "+element.getUserId()+ ", getCurrentUser(): "+getCurrentUser()); if (element.getTypeUuid().equals(oldTopicTypeUuid) && (element.getUserId().equals(getCurrentUser()))) { element.setTypeUuid(newTopicTypeUuid); } } savePrivateMessage(message, false); } /** * @see org.sakaiproject.api.app.messageforums.ui.PrivateMessageManager#createPrivateMessage(java.lang.String) */ public PrivateMessage createPrivateMessage(String typeUuid) { PrivateMessage message = new PrivateMessageImpl(); message.setUuid(idManager.createUuid()); message.setTypeUuid(typeUuid); message.setCreated(new Date()); message.setCreatedBy(getCurrentUser()); LOG.debug("message " + message.getUuid() + " created successfully"); return message; } public boolean hasNextMessage(PrivateMessage message) { // TODO: Needs optimized boolean next = false; if (message != null && message.getTopic() != null && message.getTopic().getMessages() != null) { for (Iterator iter = message.getTopic().getMessages().iterator(); iter .hasNext();) { Message m = (Message) iter.next(); if (next) { return true; } if (m.getId().equals(message.getId())) { next = true; } } } // if we get here, there is no next message return false; } public boolean hasPreviousMessage(PrivateMessage message) { // TODO: Needs optimized PrivateMessage prev = null; if (message != null && message.getTopic() != null && message.getTopic().getMessages() != null) { for (Iterator iter = message.getTopic().getMessages().iterator(); iter .hasNext();) { Message m = (Message) iter.next(); if (m.getId().equals(message.getId())) { // need to check null because we might be on the first message // which means there is no previous one return prev != null; } prev = (PrivateMessage) m; } } // if we get here, there is no previous message return false; } public PrivateMessage getNextMessage(PrivateMessage message) { // TODO: Needs optimized boolean next = false; if (message != null && message.getTopic() != null && message.getTopic().getMessages() != null) { for (Iterator iter = message.getTopic().getMessages().iterator(); iter .hasNext();) { Message m = (Message) iter.next(); if (next) { return (PrivateMessage) m; } if (m.getId().equals(message.getId())) { next = true; } } } // if we get here, there is no next message return null; } public PrivateMessage getPreviousMessage(PrivateMessage message) { // TODO: Needs optimized PrivateMessage prev = null; if (message != null && message.getTopic() != null && message.getTopic().getMessages() != null) { for (Iterator iter = message.getTopic().getMessages().iterator(); iter .hasNext();) { Message m = (Message) iter.next(); if (m.getId().equals(message.getId())) { return prev; } prev = (PrivateMessage) m; } } // if we get here, there is no previous message return null; } public List getMessagesByTopic(String userId, Long topicId) { // TODO Auto-generated method stub return null; } public List getReceivedMessages(String orderField, String order) { return getMessagesByType(typeManager.getReceivedPrivateMessageType(), orderField, order); } public List getSentMessages(String orderField, String order) { return getMessagesByType(typeManager.getSentPrivateMessageType(), orderField, order); } public List getDeletedMessages(String orderField, String order) { return getMessagesByType(typeManager.getDeletedPrivateMessageType(), orderField, order); } public List getDraftedMessages(String orderField, String order) { return getMessagesByType(typeManager.getDraftPrivateMessageType(), orderField, order); } public PrivateMessage initMessageWithAttachmentsAndRecipients(PrivateMessage msg){ PrivateMessage pmReturn = (PrivateMessage) messageManager.getMessageByIdWithAttachments(msg.getId()); getHibernateTemplate().initialize(pmReturn.getRecipients()); return pmReturn; } /** * helper method to get messages by type * @param typeUuid * @return message list */ public List getMessagesByType(final String typeUuid, final String orderField, final String order) { if (LOG.isDebugEnabled()) { LOG.debug("getMessagesByType(typeUuid:" + typeUuid + ", orderField: " + orderField + ", order:" + order + ")"); } // HibernateCallback hcb = new HibernateCallback() { // public Object doInHibernate(Session session) throws HibernateException, SQLException { // Criteria messageCriteria = session.createCriteria(PrivateMessageImpl.class); // Criteria recipientCriteria = messageCriteria.createCriteria("recipients"); // // Conjunction conjunction = Expression.conjunction(); // conjunction.add(Expression.eq("userId", getCurrentUser())); // conjunction.add(Expression.eq("typeUuid", typeUuid)); // // recipientCriteria.add(conjunction); // // if ("asc".equalsIgnoreCase(order)){ // messageCriteria.addOrder(Order.asc(orderField)); // } // else if ("desc".equalsIgnoreCase(order)){ // messageCriteria.addOrder(Order.desc(orderField)); // } // else{ // LOG.debug("getMessagesByType failed with (typeUuid:" + typeUuid + ", orderField: " + orderField + // ", order:" + order + ")"); // throw new IllegalArgumentException("order must have value asc or desc"); // } // // //todo: parameterize fetch mode // messageCriteria.setFetchMode("recipients", FetchMode.EAGER); // messageCriteria.setFetchMode("attachments", FetchMode.EAGER); // // return messageCriteria.list(); // } // }; HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_MESSAGES_BY_USER_TYPE_AND_CONTEXT); Query qOrdered = session.createQuery(q.getQueryString() + " order by " + orderField + " " + order); qOrdered.setParameter("userId", getCurrentUser(), Hibernate.STRING); qOrdered.setParameter("typeUuid", typeUuid, Hibernate.STRING); qOrdered.setParameter("contextId", getContextId(), Hibernate.STRING); return qOrdered.list(); } }; return (List) getHibernateTemplate().execute(hcb); } /** * FOR SYNOPTIC TOOL: * helper method to get messages by type * needed to pass contextId since could be in MyWorkspace * * @param typeUuid * The type of forum it is (Private or Topic) * @param contextId * The site id whose messages are needed * * @return message list */ public List getMessagesByTypeByContext(final String typeUuid, final String contextId) { if (LOG.isDebugEnabled()) { LOG.debug("getMessagesByTypeForASite(typeUuid:" + typeUuid + ")"); } HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_MESSAGES_BY_USER_TYPE_AND_CONTEXT); q.setParameter("userId", getCurrentUser(), Hibernate.STRING); q.setParameter("typeUuid", typeUuid, Hibernate.STRING); q.setParameter("contextId", contextId, Hibernate.STRING); return q.list(); } }; return (List) getHibernateTemplate().execute(hcb); } public List getMessagesByTypeByContext(final String typeUuid, final String contextId, final String userId, final String orderField, final String order){ if (LOG.isDebugEnabled()) { LOG.debug("getMessagesByTypeForASite(typeUuid:" + typeUuid + ")"); } HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_MESSAGES_BY_USER_TYPE_AND_CONTEXT); Query qOrdered = session.createQuery(q.getQueryString() + " order by " + orderField + " " + order); qOrdered.setParameter("userId", userId, Hibernate.STRING); qOrdered.setParameter("typeUuid", typeUuid, Hibernate.STRING); qOrdered.setParameter("contextId", contextId, Hibernate.STRING); return qOrdered.list(); } }; return (List) getHibernateTemplate().execute(hcb); } /** * @see org.sakaiproject.api.app.messageforums.ui.PrivateMessageManager#findMessageCount(java.lang.String) */ public int findMessageCount(String typeUuid, List aggregateList) { if (LOG.isDebugEnabled()) { LOG.debug("findMessageCount executing with typeUuid: " + typeUuid); } if (typeUuid == null) { LOG.error("findMessageCount failed with typeUuid: null"); throw new IllegalArgumentException("Null Argument"); } if (aggregateList == null) { LOG.error("findMessageCount failed with aggregateList: null"); throw new IllegalStateException("aggregateList is null"); } int totalCount = 0; for (Iterator i = aggregateList.iterator(); i.hasNext();){ Object[] element = (Object[]) i.next(); /** filter on type */ if (typeUuid.equals(element[1])){ /** add read/unread message types */ totalCount += ((Integer) element[2]).intValue(); } } return totalCount; } /** * @see org.sakaiproject.api.app.messageforums.ui.PrivateMessageManager#findUnreadMessageCount(java.lang.String) */ public int findUnreadMessageCount(String typeUuid, List aggregateList) { if (LOG.isDebugEnabled()) { LOG.debug("findUnreadMessageCount executing with typeUuid: " + typeUuid); } if (typeUuid == null) { LOG.error("findUnreadMessageCount failed with typeUuid: null"); throw new IllegalArgumentException("Null Argument"); } if (aggregateList == null) { LOG.error("findMessageCount failed with aggregateList: Null"); throw new IllegalStateException("aggregateList is null"); } int unreadCount = 0; for (Iterator i = aggregateList.iterator(); i.hasNext();){ Object[] element = (Object[]) i.next(); /** filter on type and read status*/ if (!typeUuid.equals(element[1]) || Boolean.TRUE.equals(element[0])){ continue; } else{ unreadCount = ((Integer) element[2]).intValue(); break; } } return unreadCount; } private List initializeMessageCounts(final String userId, final String contextId) { if (LOG.isDebugEnabled()) { LOG.debug("initializeMessageCounts executing"); } HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_AGGREGATE_COUNT); q.setParameter("contextId", contextId, Hibernate.STRING); q.setParameter("userId", userId, Hibernate.STRING); return q.list(); } }; return (List) getHibernateTemplate().execute(hcb); } /** * FOR SYNOPTIC TOOL: * Returns a list of all sites this user is in along with a count of his/her * unread messages * * @return * List of site id, count of unread message pairs */ public List getPrivateMessageCountsForAllSites() { HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findUnreadPvtMsgCntByUserForAllSites"); q.setParameter("userId", getCurrentUser(), Hibernate.STRING); return q.list(); } }; return (List) getHibernateTemplate().execute(hcb); } /** * @see org.sakaiproject.api.app.messageforums.ui.PrivateMessageManager#deletePrivateMessage(org.sakaiproject.api.app.messageforums.PrivateMessage, java.lang.String) */ public void deletePrivateMessage(PrivateMessage message, String typeUuid) { String userId = getCurrentUser(); if (LOG.isDebugEnabled()) { LOG.debug("deletePrivateMessage(message:" + message + ", typeUuid:" + typeUuid + ")"); } /** fetch recipients for message */ PrivateMessage pvtMessage = getPrivateMessageWithRecipients(message); /** * create PrivateMessageRecipient to search */ PrivateMessageRecipient pmrReadSearch = new PrivateMessageRecipientImpl( userId, typeUuid, getContextId(), Boolean.TRUE, false); PrivateMessageRecipient pmrNonReadSearch = new PrivateMessageRecipientImpl( userId, typeUuid, getContextId(), Boolean.FALSE , false); int indexDelete = -1; int indexRead = pvtMessage.getRecipients().indexOf(pmrReadSearch); if (indexRead != -1) { indexDelete = indexRead; } else { int indexNonRead = pvtMessage.getRecipients().indexOf(pmrNonReadSearch); if (indexNonRead != -1) { indexDelete = indexNonRead; } else { LOG .error("deletePrivateMessage -- cannot find private message for user: " + userId + ", typeUuid: " + typeUuid); } } if (indexDelete != -1) { PrivateMessageRecipient pmrReturned = (PrivateMessageRecipient) pvtMessage .getRecipients().get(indexDelete); if (pmrReturned != null) { /** check for existing deleted message from user */ PrivateMessageRecipient pmrDeletedSearch = new PrivateMessageRecipientImpl( userId, typeManager.getDeletedPrivateMessageType(), getContextId(), Boolean.TRUE, false); int indexDeleted = pvtMessage.getRecipients().indexOf(pmrDeletedSearch); if (indexDeleted == -1) { boolean prevReadStatus = pmrReturned.getRead(); pmrReturned.setRead(Boolean.TRUE); String contextId = getContextId(); if(!prevReadStatus){ decrementMessagesSynopticToolInfo(userId, contextId, SynopticMsgcntrManager.NUM_OF_ATTEMPTS); } pmrReturned.setTypeUuid(typeManager.getDeletedPrivateMessageType()); } else { pvtMessage.getRecipients().remove(indexDelete); } } } } 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("PrivateMessageManagerImpl: decrementMessagesSynopticToolInfo: HibernateOptimisticLockingFailureException no more retries left"); holfe.printStackTrace(); } else { System.out .println("PrivateMessageManagerImpl: 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("PrivateMessageManagerImpl: incrementMessagesSynopticToolInfo: HibernateOptimisticLockingFailureException no more retries left"); holfe.printStackTrace(); } else { System.out .println("PrivateMessageManagerImpl: incrementMessagesSynopticToolInfo: HibernateOptimisticLockingFailureException: attempts left: " + numOfAttempts); incrementMessagesSynopticToolInfo(userId, siteId, numOfAttempts); } } } /** * @see org.sakaiproject.api.app.messageforums.ui.PrivateMessageManager#sendPrivateMessage(org.sakaiproject.api.app.messageforums.PrivateMessage, java.util.Set, boolean) */ public void sendPrivateMessage(PrivateMessage message, Map<User, Boolean> recipients, boolean asEmail) { try { if (LOG.isDebugEnabled()) { LOG.debug("sendPrivateMessage(message: " + message + ", recipients: " + recipients + ")"); } if (message == null || recipients == null) { throw new IllegalArgumentException("Null Argument"); } if (recipients.size() == 0 && !message.getDraft().booleanValue()) { /** for no just return out throw new IllegalArgumentException("Empty recipient list"); **/ return; } String currentUserAsString = getCurrentUser(); User currentUser = UserDirectoryService.getCurrentUser(); List recipientList = new UniqueArrayList(); /** test for draft message */ if (message.getDraft().booleanValue()) { PrivateMessageRecipientImpl receiver = new PrivateMessageRecipientImpl( currentUserAsString, typeManager.getDraftPrivateMessageType(), getContextId(), Boolean.TRUE, false); recipientList.add(receiver); message.setRecipients(recipientList); savePrivateMessage(message, false); return; } //build the message body List additionalHeaders = new ArrayList(1); additionalHeaders.add("Content-Type: text/html; charset=utf-8"); /** determines if default in sakai.properties is set, if not will make a reasonable default */ String defaultEmail = "postmaster@" + ServerConfigurationService.getServerName(); String systemEmail = ServerConfigurationService.getString("msgcntr.notification.from.address", defaultEmail); if (!ServerConfigurationService.getBoolean("msgcntr.notification.user.real.from", false)) { systemEmail = ServerConfigurationService.getString("msgcntr.notification.from.address", defaultEmail); } else { if (currentUser.getEmail() != null) systemEmail = currentUser.getEmail(); else systemEmail = ServerConfigurationService.getString("msgcntr.notification.from.address", defaultEmail); } String bodyString = buildMessageBody(message); Area currentArea = null; List<PrivateForum> privateForums = null; Map<String, PrivateForum> pfMap = null; currentArea = getAreaByContextIdAndTypeId(typeManager.getPrivateMessageAreaType()); // make sure the site-wide email copy preference is respected in case an invalid // value slipped in if (currentArea.getSendToEmail() == Area.EMAIL_COPY_ALWAYS) { asEmail = true; } else if (currentArea.getSendToEmail() == Area.EMAIL_COPY_NEVER) { asEmail = false; } //this is fairly inneficient and should realy be a convenience method to lookup // the users who want to forward their messages privateForums = currentArea.getPrivateForums(); //create a map for efficient lookup for large sites pfMap = new HashMap<String, PrivateForum>(); for (int i = 0; i < privateForums.size(); i++) { PrivateForum pf1 = (PrivateForum)privateForums.get(i); pfMap.put(pf1.getOwner(), pf1); } boolean forwardingEnabled = false; List<InternetAddress> fAddresses = new ArrayList<InternetAddress>(); //this only needs to be done if the message is not being sent for (Iterator<Entry<User, Boolean>> i = recipients.entrySet().iterator(); i.hasNext();) { Entry<User, Boolean> entrySet = (Entry<User, Boolean>) i.next(); User u = (User) entrySet.getKey(); Boolean bcc = (Boolean) entrySet.getValue(); String userId = u.getId(); //boolean forwardingEnabled = false; //String forwardAddress = null; PrivateForum pf = null; if (pfMap.containsKey(userId)) pf = pfMap.get(userId); if (pf != null && pf.getAutoForward().booleanValue() && pf.getAutoForwardEmail() != null){ forwardingEnabled = true; fAddresses.add(new InternetAddress(pf.getAutoForwardEmail())); //forwardAddress = pf.getAutoForwardEmail(); } if( pf == null) { //only check for default settings if the pf is null PrivateForum oldPf = forumManager.getPrivateForumByOwnerAreaNull(userId); if (oldPf != null && oldPf.getAutoForward().booleanValue() && oldPf.getAutoForwardEmail() != null) { //forwardAddress = oldPf.getAutoForwardEmail(); forwardingEnabled = true; fAddresses.add(new InternetAddress(oldPf.getAutoForwardEmail())); } } /** determine if current user is equal to recipient */ Boolean isRecipientCurrentUser = (currentUserAsString.equals(userId) ? Boolean.TRUE : Boolean.FALSE); PrivateMessageRecipientImpl receiver = new PrivateMessageRecipientImpl( userId, typeManager.getReceivedPrivateMessageType(), getContextId(), isRecipientCurrentUser, bcc); recipientList.add(receiver); } if (asEmail) { //send as 1 action to all recipients //we need to add som headers additionalHeaders.add("From: " + systemEmail); additionalHeaders.add("Subject: " + message.getTitle()); emailService.sendToUsers(recipients.keySet(), additionalHeaders, bodyString); } if(!isEmailForwardDisabled() && forwardingEnabled) { InternetAddress fAddressesArr[] = new InternetAddress[fAddresses.size()]; fAddressesArr = fAddresses.toArray(fAddressesArr); emailService.sendMail(new InternetAddress(systemEmail), fAddressesArr, message.getTitle(), bodyString, fAddressesArr, null, additionalHeaders); } /** add sender as a saved recipient */ PrivateMessageRecipientImpl sender = new PrivateMessageRecipientImpl( currentUserAsString, typeManager.getSentPrivateMessageType(), getContextId(), Boolean.TRUE, false); recipientList.add(sender); message.setRecipients(recipientList); savePrivateMessage(message, false); } catch (MessagingException e) { LOG.warn("PrivateMessageManagerImpl.sendPrivateMessage: exception: " + e.getMessage(), e); } } public boolean isEmailForwardDisabled(){ return ServerConfigurationService.getBoolean("mc.messages.forwardEmailDisabled", false); } private String buildMessageBody(PrivateMessage message) { User currentUser = UserDirectoryService.getCurrentUser(); StringBuilder body = new StringBuilder(message.getBody()); StringBuilder fromString = new StringBuilder(); fromString.append("<p>"); if (ServerConfigurationService.getBoolean("msg.displayEid", true)) { fromString.append(getResourceBundleString("pvt_email_from_with_eid", new Object[] {currentUser.getDisplayName(), currentUser.getEid(), currentUser.getEmail() })); } else { fromString.append(getResourceBundleString("pvt_email_from", new Object[] {currentUser.getDisplayName(), currentUser.getEmail() })); } fromString.append("</p>"); body.insert(0, fromString.toString()); // need to determine if there are "hidden" recipients to this message. // If so, we need to replace them with "Undisclosed Recipients" // Identifying them is tricky now because hidden users are identified by having their // names in parentheses at the end of the list. At some point, the usernames were also added to // this in parentheses (although this may be overridden via a property). // So to fix this going forward, the hidden users will be indicated by brackets [], // but we still need to handle the old data with hidden users in parens String sendToString = message.getRecipientsAsText(); if (sendToString.indexOf(PrivateMessage.HIDDEN_RECIPIENTS_START) > 0) { sendToString = sendToString.substring(0, sendToString.indexOf(PrivateMessage.HIDDEN_RECIPIENTS_START)); // add "Undisclosed Recipients" in place of the hidden users sendToString = sendToString.trim(); if (sendToString.length() > 0) { sendToString += "; "; } sendToString += getResourceBundleString("pvt_HiddenRecipients"); } else { // we may have parens around a list of names with eid in parens if (ServerConfigurationService.getBoolean("msg.displayEid", true)) { String originalSendTo = sendToString; sendToString = sendToString.replaceAll("\\([^)]+\\(.*", ""); // add "Undisclosed Recipients" in place of the hidden users if (!sendToString.equals(originalSendTo)) { sendToString = sendToString.trim(); if (sendToString.length() > 0) { sendToString += "; "; } sendToString += getResourceBundleString("pvt_HiddenRecipients"); } } else { // the old data just has the hidden users in parens if (sendToString.indexOf("(") > 0) { sendToString = sendToString.substring(0, sendToString.indexOf("(")); // add "Undisclosed Recipients" in place of the hidden users sendToString = sendToString.trim(); if (sendToString.length() > 0) { sendToString += "; "; } sendToString += getResourceBundleString("pvt_HiddenRecipients"); } } } body.insert(0, "<p>" + getResourceBundleString("pvt_email_to", new Object[] {sendToString}) + "<p/>"); if (message.getAttachments() != null && message.getAttachments().size() > 0) { body.append("<br/><br/>"); for (Iterator iter = message.getAttachments().iterator(); iter.hasNext();) { Attachment attachment = (Attachment) iter.next(); //body.append("<a href=\"" + attachment.getAttachmentUrl() + //"\">" + attachment.getAttachmentName() + "</a><br/>"); body.append("<a href=\"" + messageManager.getAttachmentUrl(attachment.getAttachmentId()) + "\">" + attachment.getAttachmentName() + "</a><br/>"); } } String siteTitle = null; try{ siteTitle = SiteService.getSite(getContextId()).getTitle(); } catch (IdUnusedException e){ LOG.error(e.getMessage(), e); } String thisPageId = ""; ToolSession ts = sessionManager.getCurrentToolSession(); if (ts != null) { ToolConfiguration tool = SiteService.findTool(ts.getPlacementId()); if (tool != null) { thisPageId = tool.getPageId(); } } String footer = "<p>----------------------<br>" + getResourceBundleString(EMAIL_FOOTER1) + " " + ServerConfigurationService.getString("ui.service","Sakai") + " " + getResourceBundleString(EMAIL_FOOTER2) + " \"" + siteTitle + "\" " + getResourceBundleString(EMAIL_FOOTER3) + "\n" + getResourceBundleString(EMAIL_FOOTER4) + " <a href=\"" + ServerConfigurationService.getPortalUrl() + "/site/" + ToolManager.getCurrentPlacement().getContext() + "/page/" + thisPageId+ "\">"; footer += siteTitle + "</a>.</p>"; body.append(footer); String bodyString = body.toString(); return bodyString; } /** * @see org.sakaiproject.api.app.messageforums.ui.PrivateMessageManager#markMessageAsReadForUser(org.sakaiproject.api.app.messageforums.PrivateMessage) */ public void markMessageAsReadForUser(final PrivateMessage message) { markMessageAsReadForUser(message, getContextId()); } /** * FOR SYNOPTIC TOOL: * Need to pass in contextId also */ public void markMessageAsReadForUser(final PrivateMessage message, final String contextId) { markMessageAsReadForUser(message, contextId, getCurrentUser(), ToolManager.getCurrentTool().getId()); } public void markMessageAsReadForUser(final PrivateMessage message, final String contextId, final String userId, String toolId) { if (LOG.isDebugEnabled()) { LOG.debug("markMessageAsReadForUser(message: " + message + ")"); } if (message == null) { throw new IllegalArgumentException("Null Argument"); } /** fetch recipients for message */ PrivateMessage pvtMessage = getPrivateMessageWithRecipients(message); /** create PrivateMessageRecipientImpl to search for recipient to update */ PrivateMessageRecipientImpl searchRecipient = new PrivateMessageRecipientImpl( userId, typeManager.getReceivedPrivateMessageType(), contextId, Boolean.FALSE, false); List recipientList = pvtMessage.getRecipients(); if (recipientList == null || recipientList.size() == 0) { LOG.error("markMessageAsReadForUser(message: " + message + ") has empty recipient list"); throw new RuntimeException("markMessageAsReadForUser(message: " + message + ") has empty recipient list"); } int recordIndex = -1; for(int i = 0; i < pvtMessage.getRecipients().size(); i++) { if(((PrivateMessageRecipientImpl) pvtMessage.getRecipients().get(i)).getUserId().equals(searchRecipient.getUserId())){ recordIndex = i; if (! ((PrivateMessageRecipientImpl) recipientList.get(recordIndex)).getRead()) { ((PrivateMessageRecipientImpl) recipientList.get(recordIndex)).setRead(Boolean.TRUE); } } } if(recordIndex != -1){ decrementMessagesSynopticToolInfo(searchRecipient.getUserId(), contextId, SynopticMsgcntrManager.NUM_OF_ATTEMPTS); EventTrackingService.post(EventTrackingService.newEvent(DiscussionForumService.EVENT_MESSAGES_READ, getEventMessage(pvtMessage, toolId, userId, contextId), false)); } } /** * @see org.sakaiproject.api.app.messageforums.ui.PrivateMessageManager#markMessageAsReadForUser(org.sakaiproject.api.app.messageforums.PrivateMessage) */ public void markMessageAsUnreadForUser(final PrivateMessage message) { markMessageAsUnreadForUser(message, getContextId()); } /** * FOR SYNOPTIC TOOL: * Need to pass in contextId also */ public void markMessageAsUnreadForUser(final PrivateMessage message, final String contextId) { if (LOG.isDebugEnabled()) { LOG.debug("markMessageAsUnreadForUser(message: " + message + ")"); } if (message == null) { throw new IllegalArgumentException("Null Argument"); } final String userId = getCurrentUser(); /** fetch recipients for message */ PrivateMessage pvtMessage = getPrivateMessageWithRecipients(message); /** create PrivateMessageRecipientImpl to search for recipient to update */ PrivateMessageRecipientImpl searchRecipient = new PrivateMessageRecipientImpl( userId, typeManager.getReceivedPrivateMessageType(), contextId, Boolean.TRUE, false); List recipientList = pvtMessage.getRecipients(); if (recipientList == null || recipientList.size() == 0) { LOG.error("markMessageAsUnreadForUser(message: " + message + ") has empty recipient list"); throw new RuntimeException("markMessageAsUnreadForUser(message: " + message + ") has empty recipient list"); } int recordIndex = -1; for(int i = 0; i < pvtMessage.getRecipients().size(); i++) { if(((PrivateMessageRecipientImpl) pvtMessage.getRecipients().get(i)).getUserId().equals(searchRecipient.getUserId())){ recordIndex = i; if (((PrivateMessageRecipientImpl) recipientList.get(recordIndex)) .getRead()) { ((PrivateMessageRecipientImpl) recipientList.get(recordIndex)) .setRead(Boolean.FALSE); } } } if(recordIndex != -1){ Site currentSite; try { //TODO is this only used to prevent increments if the site doesn't exit? DH currentSite = SiteService.getSite(contextId); incrementMessagesSynopticToolInfo(searchRecipient .getUserId(), contextId, SynopticMsgcntrManager.NUM_OF_ATTEMPTS); } catch (IdUnusedException e) { e.printStackTrace(); } EventTrackingService.post(EventTrackingService.newEvent( DiscussionForumService.EVENT_MESSAGES_UNREAD, getEventMessage(pvtMessage), false)); } } public void markMessageAsRepliedForUser(final PrivateMessage message) { PrivateMessage pvtMessage = getPrivateMessageWithRecipients(message); List recipientList = pvtMessage.getRecipients(); if (recipientList != null) { String userId = getCurrentUser(); for (Object r : recipientList) { if (((PrivateMessageRecipientImpl) r).getUserId().equals(userId)) { ((PrivateMessageRecipientImpl) r).setReplied(true); } } } } private PrivateMessage getPrivateMessageWithRecipients( final PrivateMessage message) { if (LOG.isDebugEnabled()) { LOG.debug("getPrivateMessageWithRecipients(message: " + message + ")"); } if (message == null) { throw new IllegalArgumentException("Null Argument"); } HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery(QUERY_MESSAGES_BY_ID_WITH_RECIPIENTS); q.setParameter("id", message.getId(), Hibernate.LONG); return q.uniqueResult(); } }; PrivateMessage pvtMessage = (PrivateMessage) getHibernateTemplate() .execute(hcb); if (pvtMessage == null) { LOG.error("getPrivateMessageWithRecipients(message: " + message + ") could not find message"); throw new RuntimeException("getPrivateMessageWithRecipients(message: " + message + ") could not find message"); } return pvtMessage; } public List searchPvtMsgs(String typeUuid, String searchText,Date searchFromDate, Date searchToDate, boolean searchByText, boolean searchByAuthor, boolean searchByBody, boolean searchByLabel, boolean searchByDate) { return messageManager.findPvtMsgsBySearchText(typeUuid, searchText,searchFromDate, searchToDate, searchByText,searchByAuthor,searchByBody,searchByLabel,searchByDate); } public String getAuthorString() { String authorString = getCurrentUser(); try { authorString = UserDirectoryService.getUser(authorString).getSortName(); } catch(Exception e) { e.printStackTrace(); } return authorString; } private String getCurrentUser() { if (TestUtil.isRunningTests()) { return "test-user"; } return sessionManager.getCurrentSessionUserId(); } public AreaManager getAreaManager() { return areaManager; } public void setAreaManager(AreaManager areaManager) { this.areaManager = areaManager; } public MessageForumsMessageManager getMessageManager() { return messageManager; } public void setMessageManager(MessageForumsMessageManager messageManager) { this.messageManager = messageManager; } 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 void setForumManager(MessageForumsForumManager forumManager) { this.forumManager = forumManager; } public void setEmailService(EmailService emailService) { this.emailService = emailService; } public boolean isInstructor() { LOG.debug("isInstructor()"); return isInstructor(UserDirectoryService.getCurrentUser()); } public boolean isSectionTA() { LOG.debug("isSectionTA()"); return isSectionTA(UserDirectoryService.getCurrentUser()); } /** * Check if the given user has site.upd access * * @param user * @return */ private boolean isInstructor(User user) { if (LOG.isDebugEnabled()) { LOG.debug("isInstructor(User " + user + ")"); } if (user != null) return SecurityService.unlock(user, "site.upd", getContextSiteId()); else return false; } private boolean isSectionTA(User user) { if (user != null) return SecurityService.unlock(user, "section.role.ta", getContextSiteId()); else return false; } public boolean isEmailPermit() { LOG.debug("isEmailPermit()"); return isEmailPermit(UserDirectoryService.getCurrentUser()); } private boolean isEmailPermit(User user) { if (LOG.isDebugEnabled()) { LOG.debug("isEmailPermit(User " + user + ")"); } if (user != null) return SecurityService.unlock(user, "msg.emailout", getContextSiteId()); else return false; } public boolean isAllowToFieldGroups() { LOG.debug("isAllowToFieldGroups()"); return isAllowToFieldGroups(UserDirectoryService.getCurrentUser()); } private boolean isAllowToFieldGroups(User user) { if (LOG.isDebugEnabled()) { LOG.debug("isAllowToFieldGroups(User " + user + ")"); } if (user != null) return SecurityService.unlock(user, DefaultPermissionsManager.MESSAGE_FUNCTION_ALLOW_TO_FIELD_GROUPS, getContextSiteId()); else return false; } public boolean isAllowToFieldAllParticipants() { LOG.debug("isAllowToFieldAllParticipants()"); return isAllowToFieldAllParticipants(UserDirectoryService.getCurrentUser()); } private boolean isAllowToFieldAllParticipants(User user) { if (LOG.isDebugEnabled()) { LOG.debug("isAllowToFieldAllParticipants(User " + user + ")"); } if (user != null) return SecurityService.unlock(user, DefaultPermissionsManager.MESSAGE_FUNCTION_ALLOW_TO_FIELD_ALL_PARTICIPANTS, getContextSiteId()); else return false; } public boolean isAllowToFieldRoles() { LOG.debug("isAllowToFieldRoles()"); return isAllowToFieldRoles(UserDirectoryService.getCurrentUser()); } private boolean isAllowToFieldRoles(User user) { if (LOG.isDebugEnabled()) { LOG.debug("isAllowToFieldRoles(User " + user + ")"); } if (user != null) return SecurityService.unlock(user, DefaultPermissionsManager.MESSAGE_FUNCTION_ALLOW_TO_FIELD_ROLES, getContextSiteId()); else return false; } public boolean isAllowToViewHiddenGroups() { LOG.debug("isAllowToViewHiddenGroups()"); return isAllowToViewHiddenGroups(UserDirectoryService.getCurrentUser()); } private boolean isAllowToViewHiddenGroups(User user) { if (LOG.isDebugEnabled()) { LOG.debug("isAllowToViewHiddenGroups(User " + user + ")"); } if (user != null) return SecurityService.unlock(user, DefaultPermissionsManager.MESSAGE_FUNCTION_VIEW_HIDDEN_GROUPS, getContextSiteId()); else return false; } /** * @return siteId */ public String getContextSiteId() { LOG.debug("getContextSiteId()"); return ("/site/" + ToolManager.getCurrentPlacement().getContext()); } public String getContextId() { LOG.debug("getContextId()"); if (TestUtil.isRunningTests()) { return "01001010"; } else { //org.sakaiproject.tool.api.ToolManager manager = getInstance(); return ToolManager.getCurrentPlacement().getContext(); } } //Helper class public String getTopicTypeUuid(String topicTitle) { String topicTypeUuid; if(PVTMSG_MODE_RECEIVED.equals(topicTitle)) { topicTypeUuid=typeManager.getReceivedPrivateMessageType(); } else if(PVTMSG_MODE_SENT.equals(topicTitle)) { topicTypeUuid=typeManager.getSentPrivateMessageType(); } else if(PVTMSG_MODE_DELETE.equals(topicTitle)) { topicTypeUuid=typeManager.getDeletedPrivateMessageType(); } else if(PVTMSG_MODE_DRAFT.equals(topicTitle)) { topicTypeUuid=typeManager.getDraftPrivateMessageType(); } else { topicTypeUuid=typeManager.getCustomTopicType(topicTitle); } return topicTypeUuid; } public Area getAreaByContextIdAndTypeId(final String typeId) { LOG.debug("getAreaByContextIdAndTypeId executing for current user: " + getCurrentUser()); HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.getNamedQuery("findAreaByContextIdAndTypeId"); q.setParameter("contextId", getContextId(), Hibernate.STRING); q.setParameter("typeId", typeId, Hibernate.STRING); return q.uniqueResult(); } }; return (Area) getHibernateTemplate().execute(hcb); } /** * Gets Strings from Message Bundle (specifically for titles) * TODO: pull directly from bundle instead of using areaManager * as an intermediary * * @param key * Message bundle key for String wanted * * @return * String requested or "[missing key: key]" if not found */ public String getResourceBundleString(String key) { // ResourceLoader rb = new ResourceLoader(MESSAGECENTER_BUNDLE); return areaManager.getResourceBundleString(key); } private String getResourceBundleString(String key, Object[] replacementValues) { final ResourceLoader rb = new ResourceLoader(MESSAGECENTER_BUNDLE); return rb.getFormattedMessage(key, replacementValues); } /** * Constructs the event message string */ 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; } }