org.exoplatform.forum.webui.UITopicContainer.java Source code

Java tutorial

Introduction

Here is the source code for org.exoplatform.forum.webui.UITopicContainer.java

Source

/***************************************************************************
 * Copyright (C) 2003-2007 eXo Platform SAS.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Affero General Public License
 * as published by the Free Software Foundation; either version 3
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see<http://www.gnu.org/licenses/>.
 ***************************************************************************/
package org.exoplatform.forum.webui;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.portlet.ActionResponse;
import javax.portlet.PortletSession;
import javax.xml.namespace.QName;

import org.apache.commons.lang.ArrayUtils;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.forum.ForumUtils;
import org.exoplatform.forum.common.CommonUtils;
import org.exoplatform.forum.common.UserHelper;
import org.exoplatform.forum.common.webui.BaseEventListener;
import org.exoplatform.forum.common.webui.UIPopupAction;
import org.exoplatform.forum.common.webui.WebUIUtils;
import org.exoplatform.forum.info.ForumParameter;
import org.exoplatform.forum.service.Forum;
import org.exoplatform.forum.service.ForumSearchResult;
import org.exoplatform.forum.service.ForumServiceUtils;
import org.exoplatform.forum.service.Topic;
import org.exoplatform.forum.service.UserProfile;
import org.exoplatform.forum.service.Utils;
import org.exoplatform.forum.service.impl.model.TopicFilter;
import org.exoplatform.forum.service.impl.model.TopicListAccess;
import org.exoplatform.forum.webui.popup.UIBanIPForumManagerForm;
import org.exoplatform.forum.webui.popup.UIExportForm;
import org.exoplatform.forum.webui.popup.UIForumForm;
import org.exoplatform.forum.webui.popup.UIMergeTopicForm;
import org.exoplatform.forum.webui.popup.UIMoveForumForm;
import org.exoplatform.forum.webui.popup.UIMoveTopicForm;
import org.exoplatform.forum.webui.popup.UIPageListTopicUnApprove;
import org.exoplatform.forum.webui.popup.UIPollForm;
import org.exoplatform.forum.webui.popup.UITopicForm;
import org.exoplatform.forum.webui.popup.UIWatchToolsForm;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.application.portlet.PortletRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIFormStringInput;
import org.exoplatform.webui.form.input.UICheckBoxInput;

@ComponentConfig(lifecycle = UIFormLifecycle.class, template = "app:/templates/forum/webui/UITopicContainer.gtmpl", events = {
        @EventConfig(listeners = UITopicContainer.SearchFormActionListener.class),
        @EventConfig(listeners = UITopicContainer.GoNumberPageActionListener.class),
        @EventConfig(listeners = UITopicContainer.AddTopicActionListener.class),
        @EventConfig(listeners = UITopicContainer.AddPollActionListener.class),
        @EventConfig(listeners = UITopicContainer.OpenTopicActionListener.class),
        // Forum
        @EventConfig(listeners = UITopicContainer.EditForumActionListener.class),
        @EventConfig(listeners = UITopicContainer.SetLockedForumActionListener.class),
        @EventConfig(listeners = UITopicContainer.SetUnLockForumActionListener.class),
        @EventConfig(listeners = UITopicContainer.SetOpenForumActionListener.class),
        @EventConfig(listeners = UITopicContainer.SetCloseForumActionListener.class),
        @EventConfig(listeners = UITopicContainer.MoveForumActionListener.class),
        @EventConfig(listeners = UITopicContainer.RemoveForumActionListener.class), // Menu
        // Topic
        @EventConfig(listeners = UITopicContainer.WatchOptionActionListener.class),

        @EventConfig(listeners = UITopicContainer.EditTopicActionListener.class),
        @EventConfig(listeners = UITopicContainer.SetOpenTopicActionListener.class),
        @EventConfig(listeners = UITopicContainer.SetCloseTopicActionListener.class),
        @EventConfig(listeners = UITopicContainer.SetLockedTopicActionListener.class),
        @EventConfig(listeners = UITopicContainer.SetUnLockTopicActionListener.class),
        @EventConfig(listeners = UITopicContainer.SetStickTopicActionListener.class),
        @EventConfig(listeners = UITopicContainer.SetUnStickTopicActionListener.class),
        @EventConfig(listeners = UITopicContainer.SetMoveTopicActionListener.class),
        @EventConfig(listeners = UITopicContainer.MergeTopicActionListener.class),
        @EventConfig(listeners = UITopicContainer.SetDeleteTopicActionListener.class),
        @EventConfig(listeners = UITopicContainer.SetUnWaitingActionListener.class),
        @EventConfig(listeners = UITopicContainer.ApproveTopicsActionListener.class),
        @EventConfig(listeners = UITopicContainer.ActivateTopicsActionListener.class),

        @EventConfig(listeners = UITopicContainer.SetOrderByActionListener.class),
        @EventConfig(listeners = UITopicContainer.AddWatchingActionListener.class),
        @EventConfig(listeners = UITopicContainer.UnWatchActionListener.class),
        @EventConfig(listeners = UITopicContainer.AddBookMarkActionListener.class),
        @EventConfig(listeners = UITopicContainer.ExportForumActionListener.class),
        @EventConfig(listeners = UITopicContainer.AdvancedSearchActionListener.class),
        @EventConfig(listeners = UITopicContainer.BanIpForumToolsActionListener.class),
        @EventConfig(listeners = UITopicContainer.RSSActionListener.class),
        @EventConfig(listeners = UIForumKeepStickPageIterator.GoPageActionListener.class) })
public class UITopicContainer extends UIForumKeepStickPageIterator {
    private String forumId = ForumUtils.EMPTY_STR;

    private String categoryId = ForumUtils.EMPTY_STR;

    private Forum forum;

    private List<Topic> topicList;

    private List<String> moderators;

    private boolean isModerator = false;

    private boolean canAddNewThread = true;

    private String strOrderBy = ForumUtils.EMPTY_STR;

    private boolean isLogin = false;

    private boolean isNull = false;

    private boolean enableIPLogging = true;

    private boolean isShowActive = false;

    public String openTopicId = ForumUtils.EMPTY_STR;

    private Map<String, Integer> pageTopicRemember = new HashMap<String, Integer>();

    private TopicListAccess topicListAccess;

    public UITopicContainer() throws Exception {
        addUIFormInput(new UIFormStringInput(ForumUtils.GOPAGE_ID_T, null));
        addUIFormInput(new UIFormStringInput(ForumUtils.GOPAGE_ID_B, null));
        addUIFormInput(new UIFormStringInput(ForumUtils.SEARCHFORM_ID, null));
        if (!UserHelper.isAnonim())
            isLogin = true;
        isLink = true;

        setSubmitAction("return false;");
    }

    public boolean isNull() {
        return isNull;
    }

    public void setNull(boolean isNull) {
        this.isNull = isNull;
    }

    public boolean isLogin() {
        return isLogin;
    }

    public void setLogin(boolean isLogin) {
        this.isLogin = isLogin;
    }

    public void setOrderBy(String orderBy) {
        this.strOrderBy = orderBy;
    }

    public String getRSSLink(String cateId) {
        PortalContainer pcontainer = PortalContainer.getInstance();
        return CommonUtils.getRSSLink("forum", pcontainer.getPortalContainerInfo().getContainerName(), cateId);
    }

    public String getLastPostIdReadOfTopic(String topicId) throws Exception {
        return getUserProfile().getLastPostIdReadOfTopic(topicId);
    }

    private int getPageTopicRemember(String forumId) {
        if (pageTopicRemember.containsKey(forumId))
            return pageTopicRemember.get(forumId);
        return 1;
    }

    public void setUpdateForum(String categoryId, Forum forum, int page) throws Exception {
        this.forum = forum;
        this.forumId = forum.getId();
        this.categoryId = categoryId;
        this.pageSelect = page;
        if (page == 0)
            pageSelect = getPageTopicRemember(forumId);
        UIForumPortlet forumPortlet = this.getAncestorOfType(UIForumPortlet.class);
        isUseAjax = forumPortlet.isUseAjax();
        enableIPLogging = forumPortlet.isEnableIPLogging();
        forumPortlet.getChild(UIBreadcumbs.class).setUpdataPath((categoryId + ForumUtils.SLASH + forumId));
        forumPortlet.updateAccessForum(forumId);
        cleanCheckedList();
        setForum(true);
    }

    public boolean getIsAutoPrune() throws Exception {
        return isShowActive;
    }

    public void updateByBreadcumbs(String categoryId, String forumId, boolean isBreadcumbs, int page)
            throws Exception {
        this.forumId = forumId;
        this.categoryId = categoryId;
        this.pageSelect = page;
        if (page == 0)
            pageSelect = getPageTopicRemember(forumId);
        UIForumPortlet forumPortlet = this.getAncestorOfType(UIForumPortlet.class);
        this.isUseAjax = forumPortlet.isUseAjax();
        enableIPLogging = forumPortlet.isEnableIPLogging();
        forumPortlet.updateAccessForum(forumId);
        if (!isBreadcumbs) {
            forumPortlet.getChild(UIBreadcumbs.class).setUpdataPath((categoryId + ForumUtils.SLASH + forumId));
        }
        cleanCheckedList();
        setForum(true);
    }

    protected String getActionViewInfoUser(String linkType, String userName) {
        return getAncestorOfType(UIForumPortlet.class).getPortletLink(linkType, userName);
    }

    public boolean getCanAddNewThread() {
        return this.canAddNewThread;
    }

    private void setForumModeratorPortlet() {
        PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance();
        PortletSession portletSession = pcontext.getRequest().getPortletSession();
        ActionResponse actionRes = null;
        if (pcontext.getResponse() instanceof ActionResponse) {
            actionRes = (ActionResponse) pcontext.getResponse();
        }
        ForumParameter param = new ForumParameter();
        param.setRenderModerator(true);
        param.setModerators(moderators);
        param.setRenderRule(true);
        List<String> list = param.getInfoRules();
        boolean isLock = forum.getIsClosed();
        if (!isLock)
            isLock = forum.getIsLock();
        if (!isLock)
            isLock = !canAddNewThread;
        list.set(0, String.valueOf(isLock));
        param.setInfoRules(list);
        if (actionRes != null) {
            actionRes.setEvent(new QName("ForumModerateEvent"), param);
            actionRes.setEvent(new QName("ForumRuleEvent"), param);
        } else {
            portletSession.setAttribute(UIForumPortlet.FORUM_MODERATE_EVENT_PARAMS, param,
                    PortletSession.APPLICATION_SCOPE);
            portletSession.setAttribute(UIForumPortlet.RULE_EVENT_PARAMS, param, PortletSession.APPLICATION_SCOPE);
        }
    }

    public void setForum(boolean isSetModerator) throws Exception {
        this.forum = getForum();
        this.canAddNewThread = true;
        moderators = ForumServiceUtils.getUserPermission(forum.getModerators());
        String userId = getUserProfile().getUserId();
        isModerator = (userProfile.getUserRole() == 0
                || (!userProfile.getIsBanned() && !moderators.isEmpty() && moderators.contains(userId))) ? true
                        : false;
        boolean isCheck = true;
        List<String> ipBaneds = forum.getBanIP();
        if (ipBaneds != null && ipBaneds.contains(getRemoteIP()) || userProfile.getIsBanned()) {
            canAddNewThread = false;
            isCheck = false;
        }
        if (!isModerator && isCheck) {
            String[] strings = this.forum.getCreateTopicRole();
            boolean isEmpty = false;
            if (!ForumUtils.isArrayEmpty(strings)) {
                canAddNewThread = ForumServiceUtils.hasPermission(strings, userId);
            } else
                isEmpty = true;

            if (isEmpty || !canAddNewThread) {
                strings = getForumService().getPermissionTopicByCategory(categoryId, Utils.EXO_CREATE_TOPIC_ROLE);
                if (!ForumUtils.isArrayEmpty(strings)) {
                    canAddNewThread = ForumServiceUtils.hasPermission(strings, userId);
                }
            }
        }
        if (isSetModerator)
            setForumModeratorPortlet();
        UIForumContainer forumContainer = this.getParent();
        if (this.forum != null) {
            forumContainer.findFirstComponentOfType(UIForumInfos.class).setForum(this.forum);
        }
    }

    private Forum getForum() throws Exception {
        return getForumService().getForum(categoryId, forumId);
    }

    protected void initPage() throws Exception {
        setListWatches();
        objectId = forumId;
        if (getUserProfile() == null) {
            userProfile = new UserProfile();
        }

        TopicFilter filter = new TopicFilter(categoryId, forumId);
        filter.isAdmin(isModerator).userLogin(userProfile.getUserId()).isApproved(forum.getIsModerateTopic());
        if (isModerator == false) {
            filter.viewers(ForumUtils.arraysMerge(forum.getViewer(),
                    getForumService().getPermissionTopicByCategory(categoryId, Utils.EXO_VIEWER)));
        }
        //
        this.topicListAccess = (TopicListAccess) getForumService().getTopics(filter);

        int pageSize = (int) this.userProfile.getMaxTopicInPage();
        topicListAccess.initialize(pageSize, pageSelect);
    }

    @Override
    public List<Integer> getInfoPage() throws Exception {
        List<Integer> temp = new ArrayList<Integer>();
        try {
            temp.add(topicListAccess.getPageSize());
            temp.add(topicListAccess.getCurrentPage());
            temp.add(topicListAccess.getSize());
            temp.add(topicListAccess.getTotalPages());
        } catch (Exception e) {
            temp.add(1);
            temp.add(1);
            temp.add(1);
            temp.add(1);
        }
        return temp;
    }

    private String getRemoteIP() throws Exception {
        if (enableIPLogging) {
            return WebUIUtils.getRemoteIP();
        }
        return ForumUtils.EMPTY_STR;
    }

    public String[] getActionMenuForum() throws Exception {
        String[] actions = new String[] { "EditForum", "SetUnLockForum", "SetLockedForum", "SetOpenForum",
                "SetCloseForum", "MoveForum", "RemoveForum", "ExportForum", "WatchOption", "BanIpForumTools" };
        if (userProfile.getUserRole() > 0 || (userProfile.getUserRole() == 0
                && (!ForumUtils.isEmpty(getAncestorOfType(UIForumPortlet.class).getForumIdOfSpace())))) {
            actions = (String[]) ArrayUtils.removeElement(actions, "RemoveForum");
            actions = (String[]) ArrayUtils.removeElement(actions, "MoveForum");
        }
        return actions;
    }

    protected String getConfirm(String action) {
        String confirm;
        if (action.equals("MoveForum")) {
            confirm = WebUIUtils.getLabel(null, "UITopicContainer.confirm.MoveForum");
        } else {
            confirm = WebUIUtils.getLabel(null, "UITopicContainer.confirm.RemoveForum");
        }
        if (forumId.indexOf(Utils.FORUM_SPACE_ID_PREFIX) == 0) {
            confirm = new StringBuffer(confirm).append(WebUIUtils.getLabel(null, "UICategory.confirm.in-space"))
                    .toString().replace("?", "") + " ?";
        }
        return confirm.replace("'", "\\47").replace("\"", "\\42");
    }

    public String[] getActionMenuTopic() throws Exception {
        String[] actions = { "EditTopic", "SetOpenTopic", "SetCloseTopic", "SetLockedTopic", "SetUnLockTopic",
                "SetStickTopic", "SetUnStickTopic", "SetMoveTopic", "SetDeleteTopic", "MergeTopic", "SetUnWaiting",
                "ApproveTopics", "ActivateTopics" };
        return actions;
    }

    public List<Topic> getTopicPageList() throws Exception {
        //
        topicListAccess.setCurrentPage(pageSelect);
        this.pageSelect = topicListAccess.getCurrentPage();

        maxPage = topicListAccess.getTotalPages();
        //
        topicList = Arrays.asList(topicListAccess.load(pageSelect));
        this.pageSelect = topicListAccess.getCurrentPage();

        pageTopicRemember.put(forumId, pageSelect);
        if (topicList == null)
            topicList = new ArrayList<Topic>();
        isShowActive = false;
        for (Topic topic : topicList) {
            if (!topic.getIsActive())
                isShowActive = true;
            if (getUICheckBoxInput(topic.getId()) != null) {
                getUICheckBoxInput(topic.getId()).setChecked(false);
            } else {
                addChild(new UICheckBoxInput(topic.getId(), topic.getId(), false));
            }
        }
        return topicList;
    }

    private Topic getTopic(String topicId) throws Exception {
        return getForumService().getTopic(categoryId, forumId, topicId, null);
    }

    private Topic getTopicInForm(String topicId) {
        for (Topic topic : topicList) {
            if (topic.getId().equals(topicId)) {
                return topic;
            }
        }
        return null;
    }

    public long getSizePost(Topic topic) throws Exception {
        long maxPost = userProfile.getMaxPostInPage();
        if (maxPost <= 0) {
            maxPost = 10;
        }
        if (topic.getPostCount() >= maxPost) {
            long availablePost = 0;
            if (isModerator) {
                availablePost = topic.getPostCount() + 1;
            } else {
                String isApprove = ForumUtils.EMPTY_STR;
                String userLogin = userProfile.getUserId();
                if (this.forum.getIsModeratePost() || topic.getIsModeratePost()) {
                    if (!(topic.getOwner().equals(userLogin))) {
                        isApprove = "true";
                    }
                }
                availablePost = getForumService().getAvailablePost(this.categoryId, this.forumId, topic.getId(),
                        isApprove, "false", userLogin);
            }
            long value = (availablePost) / maxPost;
            if ((value * maxPost) < availablePost)
                value = value + 1;
            return value;
        } else
            return 1;
    }

    public String[] getStarNumber(Topic topic) throws Exception {
        double voteRating = topic.getVoteRating();
        return ForumUtils.getStarNumber(voteRating);
    }

    public boolean isModerator() {
        return isModerator;
    }

    static public class SearchFormActionListener extends BaseEventListener<UITopicContainer> {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            String path = uiTopicContainer.forum.getPath();
            UIFormStringInput formStringInput = uiTopicContainer.getUIStringInput(ForumUtils.SEARCHFORM_ID);
            String text = formStringInput.getValue();
            if (!ForumUtils.isEmpty(text) && !ForumUtils.isEmpty(path)) {
                String special = "\\,.?!`~/][)(;#@$%^&*<>-_+=|:\"'";
                for (int i = 0; i < special.length(); i++) {
                    char c = special.charAt(i);
                    if (text.indexOf(c) >= 0) {
                        warning("UIQuickSearchForm.msg.failure");
                        return;
                    }
                }
                StringBuffer type = new StringBuffer();
                if (uiTopicContainer.isModerator) {
                    type.append("true,").append(Utils.TOPIC).append(ForumUtils.SLASH).append(Utils.POST);
                } else {
                    type.append("false,").append(Utils.TOPIC).append(ForumUtils.SLASH).append(Utils.POST);
                }
                UIForumPortlet forumPortlet = uiTopicContainer.getAncestorOfType(UIForumPortlet.class);
                forumPortlet.updateIsRendered(ForumUtils.CATEGORIES);
                UICategoryContainer categoryContainer = forumPortlet.getChild(UICategoryContainer.class);
                categoryContainer.updateIsRender(true);
                UICategories categories = categoryContainer.getChild(UICategories.class);
                categories.setIsRenderChild(true);
                List<ForumSearchResult> list = uiTopicContainer.getForumService().getQuickSearch(text,
                        type.toString(), path, uiTopicContainer.getUserProfile().getUserId(),
                        forumPortlet.getInvisibleCategories(), forumPortlet.getInvisibleForums(), null);
                UIForumListSearch listSearchEvent = categories.getChild(UIForumListSearch.class);
                listSearchEvent.setListSearchEvent(text, list, path.substring(path.indexOf(Utils.CATEGORY)));
                forumPortlet.getChild(UIBreadcumbs.class).setUpdataPath(ForumUtils.FIELD_EXOFORUM_LABEL);
                formStringInput.setValue(ForumUtils.EMPTY_STR);
                event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet);
            } else {
                warning("UIQuickSearchForm.msg.checkEmpty");
            }
        }
    }

    static public class GoNumberPageActionListener extends BaseEventListener<UITopicContainer> {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer topicContainer, final String objectId)
                throws Exception {
            int idbt = Integer.parseInt(objectId);
            UIFormStringInput stringInput1 = topicContainer.getUIStringInput(ForumUtils.GOPAGE_ID_T);
            UIFormStringInput stringInput2 = topicContainer.getUIStringInput(ForumUtils.GOPAGE_ID_B);
            String numberPage = ForumUtils.EMPTY_STR;
            if (idbt == 1) {
                numberPage = stringInput1.getValue();
            } else {
                numberPage = stringInput2.getValue();
            }
            stringInput1.setValue(ForumUtils.EMPTY_STR);
            stringInput2.setValue(ForumUtils.EMPTY_STR);
            numberPage = ForumUtils.removeZeroFirstNumber(numberPage);
            if (!ForumUtils.isEmpty(numberPage)) {
                try {
                    int page = Integer.parseInt(numberPage.trim());
                    if (page < 0) {
                        warning("NameValidator.msg.Invalid-number", new String[] { getLabel("GoPage") });
                    } else {
                        if (page == 0) {
                            page = 1;
                        } else if (page > topicContainer.topicListAccess.getTotalPages()) {
                            page = topicContainer.topicListAccess.getTotalPages();
                        }
                        topicContainer.pageSelect = page;
                        event.getRequestContext().addUIComponentToUpdateByAjax(topicContainer);
                    }
                } catch (NumberFormatException e) {
                    warning("NameValidator.msg.Invalid-number", new String[] { getLabel("GoPage") });
                }
            }
        }
    }

    static private abstract class BaseTopicContainerActionListener
            extends BaseForumEventListener<UITopicContainer> {
        @Override
        public boolean isValid(UITopicContainer component, String objectId) throws Exception {
            if (isExisting(component.categoryId) == false) {
                categoryNotExist();
                return false;
            }
            if (isExisting(component.forumId) == false) {
                forumNotExist(component.categoryId);
                return false;
            }
            return true;
        }

        public String getForumPath() {
            StringBuffer buffer = new StringBuffer(component.categoryId).append(ForumUtils.SLASH)
                    .append(component.forumId);
            return buffer.toString();
        }

        public void errorEvent() throws Exception {
        }
    }

    static public class AddTopicActionListener extends BaseTopicContainerActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            UITopicForm topicForm = uiTopicContainer.openPopup(UITopicForm.class, "UIAddTopicContainer", 900, 520);
            topicForm.setTopicIds(uiTopicContainer.categoryId, uiTopicContainer.forumId, uiTopicContainer.forum);
            topicForm.setSpaceGroupId(uiTopicContainer.getAncestorOfType(UIForumPortlet.class).getSpaceGroupId());
            topicForm.setMod(uiTopicContainer.isModerator);
        }
    }

    static public class AddPollActionListener extends BaseEventListener<UITopicContainer> {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {

            UIPollForm pollForm = uiTopicContainer.openPopup(UIPollForm.class, 655, 455);
            pollForm.setAddTopic(uiTopicContainer.getForum().getPath());

        }
    }

    static public class OpenTopicActionListener extends BaseTopicContainerActionListener {
        private Topic topic;
        private Forum forum;
        private int pageuNumber = 0;
        private String topicId = "";
        private String postView = "";

        @Override
        public boolean isValid(UITopicContainer component, String objectId) throws Exception {
            if (super.isValid(component, objectId) == true) {
                String params = objectId;
                if (ForumUtils.isEmpty(objectId) || objectId.indexOf(ForumUtils.COMMA) < 0) {
                    params = new StringBuffer(component.openTopicId).append(ForumUtils.COMMA).append("1")
                            .append(ForumUtils.COMMA).append("false").toString();
                }
                String[] strs = params.split(ForumUtils.COMMA);
                topicId = strs[0];
                pageuNumber = Integer.parseInt(strs[1].trim());
                postView = strs[2];

                topic = (Topic) forumService.getObjectNameById(topicId, Utils.TOPIC);
                if (topic == null) {
                    topicNotExist();
                    return false;
                }
                forum = forumService.getForum(topic.getCategoryId(), topic.getForumId());
                boolean isModerator = (component.getUserProfile().getUserRole() == 0
                        || (component.getUserProfile().getUserRole() == 1 && ForumServiceUtils
                                .hasPermission(forum.getModerators(), component.getUserProfile().getUserId())));
                if (isModerator == false) {
                    if (forum.getIsClosed()) {
                        warning("UIForumPortlet.msg.do-not-permission", false);
                        openCategory(component.categoryId);
                        return false;
                    }
                    if (topic.getIsClosed() || topic.getIsWaiting() || !topic.getIsActive()
                            || !topic.getIsActiveByForum()) {
                        warning("UIForumPortlet.msg.do-not-permission", false);
                        context.addUIComponentToUpdateByAjax(component);
                        return false;
                    }
                }
                return true;
            }
            return false;
        }

        @Override
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, String idAndNumber)
                throws Exception {
            uiTopicContainer.openTopicId = ForumUtils.EMPTY_STR;
            UIForumContainer uiForumContainer = forumPortlet.getChild(UIForumContainer.class);
            UITopicDetailContainer uiTopicDetailContainer = uiForumContainer.getChild(UITopicDetailContainer.class);
            uiForumContainer.setIsRenderChild(false);
            UITopicDetail uiTopicDetail = uiTopicDetailContainer.getChild(UITopicDetail.class);
            uiTopicDetail.setUpdateForum(forum);
            uiTopicDetailContainer.getChild(UITopicPoll.class).updateFormPoll(topic.getCategoryId(),
                    topic.getForumId(), topic.getId());
            if (postView.equals("true")) {
                uiTopicDetail.setIdPostView("lastpost");
            } else if (postView.equals("false")) {
                uiTopicDetail.setIdPostView("top");
            } else {
                uiTopicDetail.setIdPostView(postView);
                uiTopicDetail.setLastPostId(postView);
            }
            if (UserProfile.USER_GUEST.equals(uiTopicContainer.getUserProfile().getUserId()) == false) {
                forumService.updateTopicAccess(uiTopicContainer.getUserProfile().getUserId(), topic.getId());
            }
            uiTopicDetail.initInfoTopic(topic.getCategoryId(), topic.getForumId(), topic, pageuNumber);
            context.addUIComponentToUpdateByAjax(forumPortlet);
        }
    }

    static public class EditForumActionListener extends BaseTopicContainerActionListener {
        @Override
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            Forum forum = uiTopicContainer.getForum();
            String spaceGroupId = uiTopicContainer.getAncestorOfType(UIForumPortlet.class).getSpaceGroupId();
            UIForumForm forumForm = uiTopicContainer.openPopup(UIForumForm.class, "EditForumForm", 650, 480);
            if (uiTopicContainer.userProfile.getUserRole() == 1) {
                forumForm.setMode(true);
            }
            forumForm.initForm(spaceGroupId);
            forumForm.setCategoryValue(uiTopicContainer.categoryId, false);
            forumForm.setForumValue(forum, true);
            forumForm.setForumUpdate(true);
        }
    }

    static private abstract class SetStatusForumListener extends BaseTopicContainerActionListener {
        private int modifyType;
        private boolean isLock = false;
        private boolean isClosed = false;
        private String action = "";

        public void onEvent(UITopicContainer uiTopicContainer, Forum forum) throws Exception {
            try {
                forum.setIsLock(isLock);
                forum.setIsClosed(isClosed);
                uiTopicContainer.getForumService().modifyForum(forum, modifyType);
                uiTopicContainer.setForum(true);
            } catch (Exception e) {
                warning(String.format("UITopicContainer.msg.fail-%s-forum", action), false);
                uiTopicContainer.log.debug(String.format("Failed to %s forum %s", action, uiTopicContainer.forumId),
                        e);
            }
            context.addUIComponentToUpdateByAjax(uiTopicContainer);
        }

        public void initParams(String action, boolean isClosed, boolean isLock, int modifyType) {
            this.action = action;
            this.isClosed = isClosed;
            this.isLock = isLock;
            this.modifyType = modifyType;
        }
    }

    static public class SetLockedForumActionListener extends SetStatusForumListener {
        @Override
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            Forum forum = uiTopicContainer.getForum();
            initParams("lock", forum.getIsClosed(), true, Utils.LOCK);
            onEvent(uiTopicContainer, forum);
        }
    }

    static public class SetUnLockForumActionListener extends SetStatusForumListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            Forum forum = uiTopicContainer.getForum();
            initParams("unlock", forum.getIsClosed(), false, Utils.LOCK);
            onEvent(uiTopicContainer, forum);
        }
    }

    static public class SetOpenForumActionListener extends SetStatusForumListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            Forum forum = uiTopicContainer.getForum();
            initParams("open", false, forum.getIsLock(), Utils.CLOSE);
            onEvent(uiTopicContainer, forum);
        }
    }

    static public class SetCloseForumActionListener extends SetStatusForumListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            Forum forum = uiTopicContainer.getForum();
            initParams("close", true, forum.getIsLock(), Utils.CLOSE);
            onEvent(uiTopicContainer, forum);
        }
    }

    static public class MoveForumActionListener extends BaseTopicContainerActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            Forum forum = uiTopicContainer.getForum();
            List<Forum> forums = new ArrayList<Forum>();
            forums.add(forum);
            UIMoveForumForm moveForumForm = uiTopicContainer.openPopup(UIMoveForumForm.class, 315, 365);
            moveForumForm.setListForum(forums, uiTopicContainer.categoryId);
            moveForumForm.setForumUpdate(true);
        }
    }

    static public class RemoveForumActionListener extends BaseTopicContainerActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            Forum forum = uiTopicContainer.getForum();
            forumService.removeForum(uiTopicContainer.categoryId, forum.getId());
            openCategory(uiTopicContainer.categoryId);
        }
    }

    static public class ExportForumActionListener extends BaseTopicContainerActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            Forum forum = uiTopicContainer.getForum();
            UIExportForm exportForm = uiTopicContainer.openPopup(UIExportForm.class, 500, 160);
            exportForm.setObjectId(forum);
        }
    }

    static public class WatchOptionActionListener extends BaseTopicContainerActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            uiTopicContainer.forum = uiTopicContainer.getForumService().getForum(uiTopicContainer.categoryId,
                    uiTopicContainer.forumId);
            UIWatchToolsForm watchToolsForm = uiTopicContainer.openPopup(UIWatchToolsForm.class, 500, 365);
            watchToolsForm.setPath(uiTopicContainer.forum.getPath());
            watchToolsForm.setEmails(uiTopicContainer.forum.getEmailNotification());
            event.getRequestContext().addUIComponentToUpdateByAjax(uiTopicContainer);
        }
    }

    // ----------------------------------MenuThread---------------------------------
    static private abstract class ModifyTopicsActionListener extends BaseTopicContainerActionListener {
        protected List<String> topicIdNotExist = new ArrayList<String>();

        protected List<String> topicIdSelected() throws Exception {
            List<String> topicIds = new ArrayList<String>();
            topicIdNotExist.clear();
            for (String topicId : component.getIdSelected()) {
                String topicPath = new StringBuffer(getForumPath()).append(ForumUtils.SLASH).append(topicId)
                        .toString();
                if (isExisting(topicPath)) {
                    topicIds.add(topicId);
                } else {
                    topicIdNotExist.add(topicId);
                }
            }
            return topicIds;
        }

        protected List<Topic> topicSelected() throws Exception {
            List<Topic> topics = new ArrayList<Topic>();
            List<String> topicIds = topicIdSelected();
            Topic topic;
            for (String topicId : topicIds) {
                topic = component.getTopic(topicId);
                if (topic != null) {
                    if (modifyTopic(topic) == true) {
                        topics.add(topic);
                    }
                }
            }
            return topics;
        }

        protected List<String> topicNameRemoveds() {
            List<String> topicNames = new ArrayList<String>();
            for (String topicId : topicIdNotExist) {
                Topic topic = component.getTopicInForm(topicId);
                if (topic != null) {
                    topicNames.add(topic.getTopicName());
                }
            }
            return topicNames;
        }

        protected void modifyTopics(int modifyType, String errorMsg) throws Exception {
            List<Topic> topics = topicSelected();
            if (topics.size() > 0) {
                try {
                    forumService.modifyTopic(topics, modifyType);
                    context.addUIComponentToUpdateByAjax(component);
                } catch (Exception e) {
                    warning(errorMsg, false);
                    component.log.error(WebUIUtils.getLabel(null, errorMsg), e);
                }
            } else {
                if (showPopup() == false) {
                    warningMessage();
                }
            }
        }

        protected void warningMessage() {
            if (topicIdNotExist.size() == 1) {
                warning("UIForumPortlet.msg.topicEmpty", false);
            } else if (topicIdNotExist.size() > 1) {
                warning("UIForumPortlet.msg.listTopicEmpty", false);
            } else {
                warning("UITopicDetail.msg.notCheckTopic");
            }
        }

        protected abstract boolean showPopup() throws Exception;

        protected abstract boolean modifyTopic(Topic topic);
    }

    static public class ApproveTopicsActionListener extends ModifyTopicsActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            modifyTopics(Utils.APPROVE, "UITopicContainer.msg.fail-approve-topics");
        }

        @Override
        protected boolean showPopup() throws Exception {
            UIPageListTopicUnApprove pageList = component.openPopup(UIPageListTopicUnApprove.class,
                    "PageListTopicUnApprove", 760, 450);
            pageList.setTypeApprove(Utils.APPROVE);
            pageList.setUpdateContainer(component.categoryId, component.forumId);
            return true;
        }

        @Override
        protected boolean modifyTopic(Topic topic) {
            if (topic.getIsApproved() == false) {
                topic.setIsApproved(true);
                return true;
            }
            return false;
        }
    }

    static public class ActivateTopicsActionListener extends ModifyTopicsActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            modifyTopics(Utils.ACTIVE, "UITopicContainer.msg.fail-activate-topics");
        }

        @Override
        protected boolean showPopup() throws Exception {
            UIPageListTopicUnApprove pageListTopicUnApprove = component.openPopup(UIPageListTopicUnApprove.class,
                    "PageListTopicInActive", 760, 450);
            pageListTopicUnApprove.setId("UIPageListTopicInActive");
            pageListTopicUnApprove.setTypeApprove(Utils.ACTIVE);
            pageListTopicUnApprove.setUpdateContainer(component.categoryId, component.forumId);
            return true;
        }

        @Override
        protected boolean modifyTopic(Topic topic) {
            if (topic.getIsActive() == false) {
                topic.setIsActive(true);
                return true;
            }
            return false;
        }
    }

    static public class EditTopicActionListener extends ModifyTopicsActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            List<String> topicIds = topicIdSelected();
            if (topicIds.size() > 0) {
                StringBuffer path = new StringBuffer(getForumPath());
                Topic topic = uiTopicContainer.getForumService()
                        .getTopicByPath(path.append(ForumUtils.SLASH).append(topicIds.get(0)).toString(), false);
                UITopicForm topicForm = uiTopicContainer.openPopup(UITopicForm.class, "UIEditTopicContainer", 900,
                        545);
                topicForm.setTopicIds(uiTopicContainer.categoryId, uiTopicContainer.forumId,
                        uiTopicContainer.forum);
                topicForm.setUpdateTopic(topic, true);
                topicForm.setMod(uiTopicContainer.isModerator);
                topicForm.setSpaceGroupId(
                        uiTopicContainer.getAncestorOfType(UIForumPortlet.class).getSpaceGroupId());
            } else {
                warningMessage();
            }
        }

        @Override
        protected boolean showPopup() throws Exception {
            return true;
        }

        @Override
        protected boolean modifyTopic(Topic topic) {
            return false;
        }
    }

    static public class SetOpenTopicActionListener extends ModifyTopicsActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiForm, final String objectId)
                throws Exception {
            modifyTopics(Utils.CLOSE, "UITopicContainer.msg.fail-open-topics");
        }

        @Override
        protected boolean showPopup() throws Exception {
            return false;
        }

        @Override
        protected boolean modifyTopic(Topic topic) {
            if (topic.getIsClosed() == true) {
                topic.setIsClosed(false);
                return true;
            }
            return false;
        }
    }

    static public class SetCloseTopicActionListener extends ModifyTopicsActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiForm, final String objectId)
                throws Exception {
            modifyTopics(Utils.CLOSE, "UITopicContainer.msg.fail-close-topics");
        }

        @Override
        protected boolean showPopup() throws Exception {
            return false;
        }

        @Override
        protected boolean modifyTopic(Topic topic) {
            if (topic.getIsClosed() == false) {
                topic.setIsClosed(true);
                return true;
            }
            return false;
        }
    }

    static public class SetLockedTopicActionListener extends ModifyTopicsActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiForm, final String objectId)
                throws Exception {
            modifyTopics(Utils.LOCK, "UITopicContainer.msg.fail-lock-topic");
        }

        @Override
        protected boolean showPopup() throws Exception {
            return false;
        }

        @Override
        protected boolean modifyTopic(Topic topic) {
            if (topic.getIsLock() == false) {
                topic.setIsLock(true);
                return true;
            }
            return false;
        }
    }

    static public class SetUnLockTopicActionListener extends ModifyTopicsActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            if (uiTopicContainer.getForum().getIsLock()) {
                warning("UITopicContainer.sms.ForumIsLocked");
                return;
            }
            modifyTopics(Utils.LOCK, "UITopicContainer.msg.fail-unlock-topic");
        }

        @Override
        protected boolean showPopup() throws Exception {
            return false;
        }

        @Override
        protected boolean modifyTopic(Topic topic) {
            if (topic.getIsLock() == true) {
                topic.setIsLock(false);
                return true;
            }
            return false;
        }
    }

    static public class SetUnStickTopicActionListener extends ModifyTopicsActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiform, final String objectId)
                throws Exception {
            modifyTopics(Utils.STICKY, "UITopicContainer.msg.fail-unstick-topic");
        }

        @Override
        protected boolean showPopup() throws Exception {
            return false;
        }

        @Override
        protected boolean modifyTopic(Topic topic) {
            if (topic.getIsSticky() == true) {
                topic.setIsSticky(false);
                return true;
            }
            return false;
        }
    }

    static public class SetStickTopicActionListener extends ModifyTopicsActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiform, final String objectId)
                throws Exception {
            modifyTopics(Utils.STICKY, "UITopicContainer.msg.fail-stick-topic");
        }

        @Override
        protected boolean showPopup() throws Exception {
            return false;
        }

        @Override
        protected boolean modifyTopic(Topic topic) {
            if (topic.getIsSticky() == false) {
                topic.setIsSticky(true);
                return true;
            }
            return false;
        }
    }

    static public class SetMoveTopicActionListener extends ModifyTopicsActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiform, final String objectId)
                throws Exception {
            List<Topic> topics = topicSelected();
            if (topics.size() > 0) {
                UIMoveTopicForm moveTopicForm = uiform.openPopup(UIMoveTopicForm.class, 400, 420);
                moveTopicForm.updateTopic(uiform.forumId, topics, false);
            } else {
                warningMessage();
            }
            context.addUIComponentToUpdateByAjax(uiform);
        }

        @Override
        protected boolean showPopup() throws Exception {
            return false;
        }

        @Override
        protected boolean modifyTopic(Topic topic) {
            return true;
        }
    }

    static public class MergeTopicActionListener extends ModifyTopicsActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            List<Topic> topics = topicSelected();
            if (topics.size() > 1) {
                UIForumPortlet forumPortlet = uiTopicContainer.getAncestorOfType(UIForumPortlet.class);
                UIPopupAction popupAction = forumPortlet.getChild(UIPopupAction.class);
                UIMergeTopicForm mergeTopicForm = popupAction.createUIComponent(UIMergeTopicForm.class, null, null);
                mergeTopicForm.updateTopics(topics);
                popupAction.activate(mergeTopicForm, 560, 260);
                context.addUIComponentToUpdateByAjax(popupAction);
            } else {
                warningMessage();
            }
            context.addUIComponentToUpdateByAjax(uiTopicContainer);
        }

        @Override
        protected boolean showPopup() throws Exception {
            return true;
        }

        @Override
        protected boolean modifyTopic(Topic topic) {
            return true;
        }
    }

    static public class SetDeleteTopicActionListener extends ModifyTopicsActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            List<Topic> topics = topicSelected();
            if (topics.size() > 0) {
                for (Topic topic : topics) {
                    try {
                        forumService.removeTopic(uiTopicContainer.categoryId, uiTopicContainer.forumId,
                                topic.getId());
                    } catch (Exception e) {
                        uiTopicContainer.log
                                .error("Removing " + topic.getId() + " fail. \nCaused by: " + e.getCause());
                    }
                }
                forumPortlet.removeCacheUserProfile();
            } else {
                warningMessage();
            }
            context.addUIComponentToUpdateByAjax(uiTopicContainer);
        }

        @Override
        protected boolean showPopup() throws Exception {
            return true;
        }

        @Override
        protected boolean modifyTopic(Topic topic) {
            return true;
        }
    }

    static public class SetUnWaitingActionListener extends ModifyTopicsActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            modifyTopics(Utils.WAITING, "UITopicContainer.msg.fail-set-unwaiting-topic");
        }

        @Override
        protected boolean showPopup() throws Exception {
            UIPageListTopicUnApprove pageListTopicUnApprove = component.openPopup(UIPageListTopicUnApprove.class,
                    "PageListTopicWaiting", 760, 450);
            pageListTopicUnApprove.setId("UIPageListTopicWaiting");
            pageListTopicUnApprove.setTypeApprove(Utils.WAITING);
            pageListTopicUnApprove.setUpdateContainer(component.categoryId, component.forumId);
            return true;
        }

        @Override
        protected boolean modifyTopic(Topic topic) {
            if (topic.getIsWaiting() == true) {
                topic.setIsWaiting(false);
                return true;
            }
            return false;
        }
    }

    static public class SetOrderByActionListener extends BaseTopicContainerActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String path)
                throws Exception {
            uiTopicContainer.strOrderBy = ForumUtils.getOrderBy(uiTopicContainer.strOrderBy, path);
            event.getRequestContext().addUIComponentToUpdateByAjax(uiTopicContainer);
        }
    }

    static public class AddBookMarkActionListener extends BaseTopicContainerActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String topicId)
                throws Exception {
            if (!ForumUtils.isEmpty(topicId)) {
                StringBuffer buffer = new StringBuffer();
                if (topicId.equals("forum")) {
                    buffer.append("uiIconUIForms//").append(uiTopicContainer.forum.getForumName()).append("//")
                            .append(uiTopicContainer.forumId);
                } else {
                    Topic topic = uiTopicContainer.getTopic(topicId);
                    buffer.append("uiIconForumTopic//").append(topic.getTopicName()).append("//").append(topicId);
                }
                String userName = uiTopicContainer.userProfile.getUserId();
                uiTopicContainer.getForumService().saveUserBookmark(userName, buffer.toString(), true);
            }
        }
    }

    static public class AddWatchingActionListener extends BaseTopicContainerActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, String path)
                throws Exception {
            StringBuffer buffer = new StringBuffer(getForumPath());
            if (path.equals("forum") == false) {
                buffer.append(ForumUtils.SLASH).append(path);
            }
            uiTopicContainer.addWatch(buffer.toString());
            context.addUIComponentToUpdateByAjax(uiTopicContainer);
        }
    }

    static public class UnWatchActionListener extends BaseTopicContainerActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, String path)
                throws Exception {
            StringBuffer buffer = new StringBuffer(getForumPath());
            if (path.equals("forum") == false) {
                buffer.append(ForumUtils.SLASH).append(path);
            }
            uiTopicContainer.unWatch(buffer.toString());
            context.addUIComponentToUpdateByAjax(uiTopicContainer);
        }
    }

    static public class AdvancedSearchActionListener extends EventListener<UITopicContainer> {
        public void execute(Event<UITopicContainer> event) throws Exception {
            UITopicContainer uiForm = event.getSource();
            UIForumPortlet forumPortlet = uiForm.getAncestorOfType(UIForumPortlet.class);
            forumPortlet.updateIsRendered(ForumUtils.FIELD_SEARCHFORUM_LABEL);
            forumPortlet.getChild(UIBreadcumbs.class).setUpdataPath(ForumUtils.FIELD_EXOFORUM_LABEL);
            UISearchForm searchForm = forumPortlet.getChild(UISearchForm.class);
            searchForm.setPath(uiForm.forum.getPath());
            searchForm.setSelectType(Utils.TOPIC);
            searchForm.setSearchOptionsObjectType(Utils.TOPIC);
            event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet);
        }
    }

    static public class BanIpForumToolsActionListener extends BaseTopicContainerActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiTopicContainer, final String objectId)
                throws Exception {
            UIBanIPForumManagerForm ipForumManager = uiTopicContainer.openPopup(UIBanIPForumManagerForm.class,
                    "BanIPForumManagerForm", 430, 500);
            ipForumManager.setForumId(getForumPath());
        }
    }

    static public class RSSActionListener extends BaseTopicContainerActionListener {
        public void onEvent(Event<UITopicContainer> event, UITopicContainer uiForm, final String forumId)
                throws Exception {
            if (!uiForm.getUserProfile().getUserId().equals(UserProfile.USER_GUEST)) {
                uiForm.getForumService().addWatch(-1, forumId, null, uiForm.getUserProfile().getUserId());
            }
        }
    }
}