package org.sakaiproject.component.app.messageforums.entity; import java.text.DateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.sakaiproject.api.app.messageforums.DiscussionForum; import org.sakaiproject.api.app.messageforums.entity.ForumEntityProvider; import org.sakaiproject.api.app.messageforums.entity.ForumTopicEntityProvider; import org.sakaiproject.api.app.messageforums.ui.DiscussionForumManager; import org.sakaiproject.entitybroker.entityprovider.CoreEntityProvider; import org.sakaiproject.entitybroker.entityprovider.capabilities.AutoRegisterEntityProvider; import org.sakaiproject.entitybroker.entityprovider.capabilities.PropertyProvideable; public class ForumEntityProviderImpl implements ForumEntityProvider, AutoRegisterEntityProvider, PropertyProvideable { private DiscussionForumManager forumManager; public String getEntityPrefix() { return ENTITY_PREFIX; } public boolean entityExists(String id) { DiscussionForum forum = null; try { forum = forumManager.getForumById(Long.valueOf(id)); } catch (Exception e) { e.printStackTrace(); } return (forum != null); } public List<String> findEntityRefs(String[] prefixes, String[] name, String[] searchValue, boolean exactMatch) { List<String> rv = new ArrayList<String>(); String userId = null; String siteId = null; if (ENTITY_PREFIX.equals(prefixes[0])) { for (int i = 0; i < name.length; i++) { if ("context".equalsIgnoreCase(name[i]) || "site".equalsIgnoreCase(name[i])) siteId = searchValue[i]; else if ("user".equalsIgnoreCase(name[i]) || "userId".equalsIgnoreCase(name[i])) userId = searchValue[i]; } String siteRef = siteId; if(siteRef != null && !siteRef.startsWith("/site/")){ siteRef = "/site/" + siteRef; } if (siteId != null && userId != null) { List<DiscussionForum> forums = forumManager.getDiscussionForumsByContextId(siteId); for (int i = 0; i < forums.size(); i++) { // TODO: authz is way too basic, someone more hip to message center please improve... //This should also allow people with read access to an item to link to it if (forumManager.isInstructor(userId, siteRef) || userId.equals(forums.get(i).getCreatedBy())) { rv.add("/" + ENTITY_PREFIX + "/" + forums.get(i).getId().toString()); } } } } return rv; } public Map<String, String> getProperties(String reference) { Map<String, String> props = new HashMap<String, String>(); DiscussionForum forum = forumManager.getForumById(Long.valueOf(reference.substring(reference.lastIndexOf("/") + 1))); props.put("title", forum.getTitle()); props.put("author", forum.getCreatedBy()); if (forum.getCreated() != null) props.put("date", DateFormat.getInstance().format(forum.getCreated())); if (forum.getModified() != null) { props.put("modified_date", DateFormat.getInstance().format(forum.getModified())); props.put("modified_by", forum.getModifiedBy()); } props.put("short_description", forum.getShortDescription()); props.put("description", forum.getExtendedDescription()); if (forum.getDraft() != null) props.put("draft", forum.getDraft().toString()); if (forum.getModerated() != null) props.put("moderated", forum.getModerated().toString()); props.put("child_provider", ForumTopicEntityProvider.ENTITY_PREFIX); props.put("assignment_name", forum.getDefaultAssignName()); return props; } public String getPropertyValue(String reference, String name) { // TODO: don't be so lazy, just get what we need... Map<String, String> props = getProperties(reference); return props.get(name); } public void setPropertyValue(String reference, String name, String value) { // This does nothing for now... we could all the setting of many published assessment properties // here though... if you're feeling jumpy feel free. } public void setForumManager(DiscussionForumManager forumManager) { this.forumManager = forumManager; } }