package org.sakaiproject.component.app.messageforums.entity; import java.io.Reader; import java.io.StringReader; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.api.app.messageforums.DiscussionForum; import org.sakaiproject.api.app.messageforums.DiscussionTopic; import org.sakaiproject.api.app.messageforums.Message; import org.sakaiproject.api.app.messageforums.MessageForumsMessageManager; import org.sakaiproject.api.app.messageforums.Topic; import org.sakaiproject.api.app.messageforums.ui.DiscussionForumManager; import org.sakaiproject.api.app.messageforums.ui.UIPermissionsManager; import org.sakaiproject.component.api.ServerConfigurationService; import org.sakaiproject.entitybroker.DeveloperHelperService; import org.sakaiproject.entitybroker.EntityBroker; import org.sakaiproject.entitybroker.EntityReference; import org.sakaiproject.event.api.Event; import org.sakaiproject.search.api.EntityContentProducer; import org.sakaiproject.search.api.PortalUrlEnabledProducer; import org.sakaiproject.search.api.SearchIndexBuilder; import org.sakaiproject.search.api.SearchService; import org.sakaiproject.search.model.SearchBuilderItem; import org.sakaiproject.util.FormattedText; public class MessageForumsEntityContentProducer implements EntityContentProducer, PortalUrlEnabledProducer { private static Log log = LogFactory.getLog(MessageForumsEntityContentProducer.class); // runtime dependency private List addEvents = null; // runtime dependency private List removeEvents = null; /** * @param addEvents * The addEvents to set. */ public void setAddEvents(List addEvents) { this.addEvents = addEvents; } public void setRemoveEvents(List removeEvents) { this.removeEvents = removeEvents; } // runtime dependency private String toolName = null; /** * @param toolName * The toolName to set. */ public void setToolName(String toolName) { this.toolName = toolName; } private DeveloperHelperService developerHelperService; public void setDeveloperHelperService( DeveloperHelperService developerHelperService) { this.developerHelperService = developerHelperService; } private ServerConfigurationService serverConfigurationService; public void setServerConfigurationService( ServerConfigurationService serverConfigurationService) { this.serverConfigurationService = serverConfigurationService; } // injected dependency private SearchService searchService = null; /** * @param searchService the searchService to set */ public void setSearchService(SearchService searchService) { this.searchService = searchService; } // injected dependency private SearchIndexBuilder searchIndexBuilder = null; /** * @param searchIndexBuilder the searchIndexBuilder to set */ public void setSearchIndexBuilder(SearchIndexBuilder searchIndexBuilder) { this.searchIndexBuilder = searchIndexBuilder; } /** * Forums Services */ private MessageForumsMessageManager messageForumsMessageManager; public void setMessageForumsMessageManager( MessageForumsMessageManager messageForumsMessageManager) { this.messageForumsMessageManager = messageForumsMessageManager; } private DiscussionForumManager discussionForumManager; public void setDiscussionForumManager( DiscussionForumManager discussionForumManager) { this.discussionForumManager = discussionForumManager; } public void setUIPermissionManager(UIPermissionsManager permissionManager) { uIPermissionManager = permissionManager; } private UIPermissionsManager uIPermissionManager; private EntityBroker entityBroker; public void setEntityBroker(EntityBroker eb) { this.entityBroker = eb; } public void init() { if ( "true".equals(serverConfigurationService.getString( "search.enable", "false"))) { for (Iterator i = addEvents.iterator(); i.hasNext();) { searchService.registerFunction((String) i.next()); } for (Iterator i = removeEvents.iterator(); i.hasNext();) { searchService.registerFunction((String) i.next()); } searchIndexBuilder.registerEntityContentProducer(this); } } public boolean canRead(String reference) { String msgId = EntityReference.getIdFromRefByKey(reference, "Message"); Message m = messageForumsMessageManager.getMessageById(Long.valueOf(msgId)); Topic topic = m.getTopic(); boolean canRead = false; DiscussionTopic dt = discussionForumManager.getTopicById(topic.getId()); if(dt != null){ DiscussionForum df = discussionForumManager.getForumById(dt.getOpenForum().getId()); canRead = uIPermissionManager.isRead(dt, df); } return canRead; } public Integer getAction(Event event) { String evt = event.getEvent(); if (evt == null) return SearchBuilderItem.ACTION_UNKNOWN; for (Iterator i = addEvents.iterator(); i.hasNext();) { String match = (String) i.next(); if (evt.equals(match)) { return SearchBuilderItem.ACTION_ADD; } } for (Iterator i = removeEvents.iterator(); i.hasNext();) { String match = (String) i.next(); if (evt.equals(match)) { return SearchBuilderItem.ACTION_DELETE; } } return SearchBuilderItem.ACTION_UNKNOWN; } public String getContainer(String ref) { log.debug("getContainer(String "+ ref + ")"); return "/site/" + getSiteId(ref); } public String getContent(String reference) { log.debug("getting content for " + reference); String msgId = EntityReference.getIdFromRefByKey(reference, "Message"); Message m = messageForumsMessageManager.getMessageById(Long.valueOf(msgId)); StringBuilder sb = new StringBuilder(); if (m != null) { sb.append("author: " + m.getAuthor()); sb.append(" title: " + m.getTitle()); sb.append(" body: " + FormattedText.convertFormattedTextToPlaintext(m.getBody())); /* causes hibernate lazy init error List attachments = m.getAttachments(); if (attachments != null && attachments.size() > 0) { for (int q = 0; q < attachments.size(); q++) { Attachment at = (Attachment) attachments.get(q); String id = at.getAttachmentId(); EntityContentProducer ecp = searchIndexBuilder .newEntityContentProducer(id); String attachementDigest = ecp.getContent(id); sb.append("\n attachement: \n"); sb.append(attachementDigest); sb.append("\n"); } } */ } return sb.toString(); } public Reader getContentReader(String reference) { return new StringReader(getContent(reference)); } public Map getCustomProperties(String ref) { // TODO Auto-generated method stub return null; } public String getCustomRDF(String ref) { // TODO Auto-generated method stub return null; } public String getId(String ref) { return EntityReference.getIdFromRefByKey(ref, "Message"); } /** * Deprecated method */ public List getSiteContent(String context) { log.warn("DEPRECATED method getSiteContent called"); return null; } public Iterator getSiteContentIterator(String context) { log.debug("getSiteContentIterator(String "+ context + ")"); List<Message> messages = messageForumsMessageManager.getAllMessagesInSite(context); log.debug("got a list of " + messages.size() + "messages"); List<String> out = new ArrayList<String>(); for (int i = 0; i < messages.size(); i ++) { Message m = (Message)messages.get(i); String ref = buildRefForContextAndId(context, m.getId()); log.debug("adding " + ref); out.add(ref); } return out.iterator(); } private String buildRefForContextAndId(String context, Long messageId) { ///forums/site/705b3a28-e04d-4858-8b66-77fa9d9c9121/Message/2 String ret = "/forums/site/" + context + "/Message/" + messageId.toString(); return ret; } public String getSiteId(String reference) { return EntityReference.getIdFromRefByKey(reference, "site"); } public String getSubType(String ref) { log.debug("getSubType(" +ref); return "message"; } public String getTitle(String reference) { log.debug("getTitle: " + reference); String msgId = EntityReference.getIdFromRefByKey(reference, "Message"); Message m = messageForumsMessageManager.getMessageById(Long.valueOf(msgId)); if (m !=null) return m.getTitle(); return null; } public String getTool() { return toolName; } public String getType(String ref) { log.debug("getType(" +ref); return "Message"; } public String getUrl(String reference) { log.debug("getUrl(" + reference +")"); Map<String, String> params = new HashMap<String, String>(); String msgId = EntityReference.getIdFromRefByKey(reference, "Message"); Message m = messageForumsMessageManager.getMessageById(Long.valueOf(msgId)); params.put("messageId", msgId); params.put("topicId", m.getTopic().getId().toString()); log.debug("got topic: " + m.getTopic().getId().toString()); //Topic topic = developerHelperService.cloneBean(m.getTopic(), 1, null); DiscussionTopic topic = discussionForumManager.getTopicById(m.getTopic().getId()); params.put("forumId", topic.getOpenForum().getId().toString()); String context = "/site/" + this.getSiteId(reference); log.debug("context: " + context); //seems not to work "/discussionForum/message/dfViewMessage" String path = "/discussionForum/message/dfViewThreadDirect"; String url = null; try { url = developerHelperService.getToolViewURL("sakai.forums", path, params, context); log.debug("got url" + url); return url; } catch (Exception e) { //MSGCNTR this could happen if there is no tool placement log.warn("swallowing exception", e); } return url; } public boolean isContentFromReader(String reference) { return false; } public boolean isForIndex(String reference) { String msgId = EntityReference.getIdFromRefByKey(reference, "Message"); Message m = messageForumsMessageManager.getMessageById(Long.valueOf(msgId)); if (m != null && !m.getDeleted()) { log.debug("we will index " + reference); return true; } return false; } public boolean matches(String reference) { if (reference == null || "".equals(reference)) { return false; } try { String prefix = EntityReference.getPrefix(reference); log.debug("checking if " + prefix + " matches"); if (toolName.equals(prefix)) return true; } catch (Exception e) { log.warn("unable to parse reference: " + reference +", " + e); if (log.isDebugEnabled()) { log.debug(e); } } return false; } public boolean matches(Event event) { // TODO Auto-generated method stub return matches(event.getResource()); } }