Package org.jboss.seam.wiki.plugin.forum

Source Code of org.jboss.seam.wiki.plugin.forum.TopicHome

package org.jboss.seam.wiki.plugin.forum;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.*;
import org.jboss.seam.annotations.web.RequestParameter;
import org.jboss.seam.core.Conversation;
import org.jboss.seam.core.Events;
import org.jboss.seam.faces.Renderer;
import org.jboss.seam.international.StatusMessages;
import org.jboss.seam.wiki.core.action.DocumentHome;
import org.jboss.seam.wiki.core.model.WikiDirectory;
import org.jboss.seam.wiki.core.model.WikiDocument;
import org.jboss.seam.wiki.core.model.WikiNode;
import org.jboss.seam.wiki.core.model.WikiTextMacro;
import org.jboss.seam.wiki.core.ui.WikiRedirect;
import org.jboss.seam.wiki.core.plugin.PluginRegistry;
import org.jboss.seam.wiki.preferences.Preferences;

import static org.jboss.seam.international.StatusMessage.Severity.INFO;

@Name("topicHome")
@Scope(ScopeType.CONVERSATION)
public class TopicHome extends DocumentHome {

    public static final String TOPIC_LIST_MACRO             = "forumTopics";
    public static final String TOPIC_LIST_MACRO_ML_PARAM    = "mailingList";
    public static final String TOPIC_NOTIFY_ME_MACRO        = "forumNotifyReplies";
    public static final String TOPIC_NOTIFY_LIST_TEMPLATE   = "/mailtemplates/forumNotifyTopicToList.xhtml";

    @In
    WikiDirectory currentDirectory;

    @In
    WikiDocument currentDocument;

    private boolean showForm = false;
    private boolean sticky = false;
    private boolean notifyReplies = false;
    private String mailingList;

    /* -------------------------- Basic Overrides ------------------------------ */

    @Override
    protected boolean isPageRootController() {
        return false;
    }

    @Override
    public Class<WikiDocument> getEntityClass() {
        return WikiDocument.class;
    }

    @Override
    public void create() {
        super.create();
        setParentNodeId(currentDirectory.getId());

        Boolean preferencesNotifyReplies = Preferences.instance().get(ForumPreferences.class).getNotifyMeOfReplies();
        notifyReplies = preferencesNotifyReplies != null && preferencesNotifyReplies;

        // TODO: mailingList = getMailingListFromTopicMacro();

        textEditor.setKey("topic");
        textEditor.setAllowPlaintext(true);// Topics can be plain text, regular documents can't
    }

    @Override
    public WikiDocument afterNodeCreated(WikiDocument doc) {
        WikiDocument newTopic = super.afterNodeCreated(doc);
        newTopic.setDefaults(new TopicDefaults());
        setPushOnFeeds(true);
        return newTopic;
    }

    @Override
    protected boolean beforePersist() {
        // TODO: Use macro parameters for "sticky" and "notify" options instead of additional macros
        if (isSticky()) {
            getInstance().removeHeaderMacros("forumPosting");
            getInstance().addHeaderMacro(new WikiTextMacro("forumStickyPosting"));
        }
        if (isNotifyReplies()) {
            getInstance().addHeaderMacro(new WikiTextMacro(TOPIC_NOTIFY_ME_MACRO));
        }
        return super.beforePersist();
    }

    @Override
    public String persist() {
        // Only owners or admins can edit topics
        getInstance().setWriteAccessLevel(org.jboss.seam.wiki.core.model.Role.ADMINROLE_ACCESSLEVEL);

        String outcome = super.persist();
        if (outcome != null) {

            // Notify forum mailing list
            /* TODO
            if (mailingList != null) {
                getLog().debug("sending topic e-mail to list: " + mailingList);
                Renderer.instance().render(
                    PluginRegistry.instance().getPlugin("forum").getPackageThemePath()+TOPIC_NOTIFY_LIST_TEMPLATE
                );
            }
            */
            mailingList =
                    Preferences.instance().get(ForumPreferences.class).getNotificationMailingList();
            if (mailingList != null) {
                getLog().debug("sending topic notification e-mail to forum list: " + mailingList);
                Renderer.instance().render(
                    PluginRegistry.instance().getPlugin("forum").getPackageThemePath()+TOPIC_NOTIFY_LIST_TEMPLATE
                );
            }

            endConversation();

            // Redirect to topic (so the created message is actually never displayed, but that's ok)
            WikiRedirect.instance().setWikiDocument(getInstance()).execute();
        }
        return null; // Prevent navigation
    }
   
    /**
     * Have to jiggle with the subject line a bit to get it right
     * @return
     */
    public String getMailSubject()
    {
       StringBuilder sb = new StringBuilder();
      
       String forumName = getForumName();
      
       if (getInstance().getName().toLowerCase().startsWith("re:"))
       {
          sb.append("Re: ");
          if (forumName != null)
          {
             sb.append("[");
             sb.append(forumName);
             sb.append("] ");
          }
          sb.append(getInstance().getName().replaceFirst("[Rr]e:", "").trim());
       }
       else
       {
          if (forumName != null)
          {
             sb.append("[");
             sb.append(forumName);
             sb.append("] ");
          }
          sb.append(getInstance().getName());
       }      
      
       return sb.toString();
    }   
   
    /**
     * This *should* return the name of the forum the topic belongs to
     *
     * @return
     */
    public String getForumName()
    {
       WikiNode parent = getInstance().getParent();
       while (parent != null && !(parent instanceof WikiDirectory))
       {
          parent = parent.getParent();
       }
       return (parent != null && parent instanceof WikiDirectory) ? parent.getName() : "";
    }

    @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 ------------------------------ */

    protected void createdMessage() {
        StatusMessages.instance().addFromResourceBundleOrDefault(
                INFO,
                "forum.msg.Topic.Persist",
                "Topic '{0}' has been saved.",
                getInstance().getName()
        );
    }

    protected void updatedMessage() {
        StatusMessages.instance().addFromResourceBundleOrDefault(
                INFO,
                "forum.msg.Topic.Update",
                "Topic '{0}' has been updated.",
                getInstance().getName()
        );
    }

    protected void deletedMessage() {
        StatusMessages.instance().addFromResourceBundleOrDefault(
                INFO,
                "forum.msg.Topic.Delete",
                "Topic '{0}' has been deleted.",
                getInstance().getName()
        );
    }

    protected String getEditorWorkspaceDescription(boolean create) {
        return null;
    }

    /* -------------------------- Internal Methods ------------------------------ */

    private void endConversation() {
        getLog().debug("ending conversation and hiding topic form");
        showForm = false;
        Conversation.instance().end();
        getEntityManager().clear(); // Need to force re-read in the topic list refresh
        Events.instance().raiseEvent("Forum.topicListRefresh");
    }

    protected String getFeedEntryManagerName() {
        return "forumTopicFeedEntryManager";
    }

    public String getMailingListFromTopicMacro() {
        for (WikiTextMacro macro : currentDocument.getContentMacros()) {
            if (macro.getName().equals(TOPIC_LIST_MACRO))
                return macro.getParamValue(TOPIC_LIST_MACRO_ML_PARAM);
        }
        return null;
    }

    /* -------------------------- Public Features ------------------------------ */

    public boolean isShowForm() {
        return showForm;
    }

    public void setShowForm(boolean showForm) {
        this.showForm = showForm;
    }

    public boolean isSticky() {
        return sticky;
    }

    public void setSticky(boolean sticky) {
        this.sticky = sticky;
    }

    public boolean isNotifyReplies() {
        return notifyReplies;
    }

    public void setNotifyReplies(boolean notifyReplies) {
        this.notifyReplies = notifyReplies;
    }

    public String getMailingList() {
        return mailingList;
    }

    public String getMailingListName() {
        return currentDocument.getName();
    }

    @Begin(flushMode = FlushModeType.MANUAL, join = true)
    public void newTopic() {
        initEditor(false);
        showForm = true;
    }

    public void cancel() {
        endConversation();

        // Redirect to topic list
        WikiRedirect.instance().setWikiDocument(currentDocument).execute();
    }

    @RequestParameter("showTopicForm")
    public void showTopicForm(Boolean requestParam) {
        if (requestParam != null && requestParam && !showForm) {
            getLog().debug("request parameter sets topic form visible, starts conversation");
            Conversation.instance().begin(true, false);
            Conversation.instance().changeFlushMode(FlushModeType.MANUAL);
            newTopic();
        }
    }

}
TOP

Related Classes of org.jboss.seam.wiki.plugin.forum.TopicHome

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.