package org.jboss.seam.wiki.plugin.forum; import org.jboss.seam.ScopeType; import org.jboss.seam.international.StatusMessages; import org.jboss.seam.annotations.*; import org.jboss.seam.core.Conversation; import org.jboss.seam.core.Events; import org.jboss.seam.wiki.core.model.*; import org.jboss.seam.wiki.core.action.DirectoryHome; import static org.jboss.seam.international.StatusMessage.Severity.INFO; import java.util.List; @Name("forumHome") @Scope(ScopeType.CONVERSATION) public class ForumHome extends DirectoryHome { @In(create = true) ForumDAO forumDAO; @In WikiDirectory currentDirectory; private boolean showForm = false; /* -------------------------- Basic Overrides ------------------------------ */ @Override protected boolean isPageRootController() { return false; } @Override public Class<WikiDirectory> getEntityClass() { return WikiDirectory.class; } @Override public void create() { super.create(); setParentNodeId(currentDirectory.getId()); } @Override public WikiDirectory afterNodeCreated(WikiDirectory node) { node.setWriteProtected(true); // Only allow admins to edit it setHasFeed(true); // New forum always has a feed return super.afterNodeCreated(node); } @Override public String persist() { // This is _always_ a subdirectory in an area getInstance().setAreaNumber(getParentNode().getAreaNumber()); String outcome = super.persist(); if (outcome != null) { // Create a mandatory menu item List<WikiMenuItem> menuItems = forumDAO.findForumsMenuItems(getParentNode()); WikiMenuItem newMenuItem = new WikiMenuItem(getInstance()); menuItems.add(newMenuItem); for (WikiMenuItem menuItem : menuItems) { menuItem.setDisplayPosition(menuItems.indexOf(menuItem)); } getEntityManager().persist(newMenuItem); // Default document is topic list WikiDocument topicListTemplate = new WikiDocument(); topicListTemplate.setName(getInstance().getName()); topicListTemplate.setCreatedBy(currentUser); topicListTemplate.setAreaNumber(getInstance().getAreaNumber()); topicListTemplate.setReadAccessLevel(getInstance().getReadAccessLevel()); WikiDocument topicList = new WikiDocument(new TopicListDefaults(topicListTemplate)); topicList.setParent(getInstance()); getInstance().setDefaultFile(topicList); getEntityManager().persist(topicList); getEntityManager().flush(); endConversation(); } return null; // Prevent navigation } @Override public String update() { String outcome = super.update(); if (outcome != null) endConversation(); return null; // Prevent navigation } @Override public String remove() { String outcome = super.remove(); if (outcome != null) endConversation(); return null; // Prevent navigation } /* -------------------------- Messages ------------------------------ */ @Override protected void createdMessage() { StatusMessages.instance().addFromResourceBundleOrDefault( INFO, "forum.msg.Forum.Persist", "Forum '{0}' has been saved.", getInstance().getName() ); } @Override protected void updatedMessage() { StatusMessages.instance().addFromResourceBundleOrDefault( INFO, "forum.msg.Forum.Update", "Forum '{0}' has been updated.", getInstance().getName() ); } @Override protected void deletedMessage() { StatusMessages.instance().addFromResourceBundleOrDefault( INFO, "forum.msg.Forum.Delete", "Forum '{0}' has been deleted.", getInstance().getName() ); } @Override protected void feedCreatedMessage() { StatusMessages.instance().addFromResourceBundleOrDefault( INFO, "forum.msg.Feed.Create", "Created syndication feed for this forum"); } @Override protected void feedRemovedMessage() { StatusMessages.instance().addFromResourceBundleOrDefault( INFO, "forum.msg.Feed.Remove", "Removed syndication feed of this forum"); } protected String getEditorWorkspaceDescription(boolean create) { return null; } /* -------------------------- Internal Methods ------------------------------ */ private void endConversation() { showForm = false; Conversation.instance().end(); getEntityManager().clear(); // Need to force re-read in the forum list refresh Events.instance().raiseEvent("Forum.forumListRefresh"); } /* -------------------------- Public Features ------------------------------ */ public boolean isShowForm() { return showForm; } public void setShowForm(boolean showForm) { this.showForm = showForm; } @Begin(flushMode = FlushModeType.MANUAL, join = true) public void newForum() { initEditor(false); showForm = true; } @Begin(flushMode = FlushModeType.MANUAL, join = true) public void edit(Long forumId) { setId(forumId); initEditor(false); showForm = true; } public void cancel() { endConversation(); } }