/*************************************************************************** * 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.List; import java.util.ResourceBundle; import javax.portlet.ActionResponse; import javax.portlet.PortletMode; import javax.portlet.PortletPreferences; import javax.servlet.http.HttpServletRequest; import javax.xml.namespace.QName; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.container.PortalContainer; import org.exoplatform.forum.ForumSessionUtils; import org.exoplatform.forum.ForumUtils; import org.exoplatform.forum.TimeConvertUtils; import org.exoplatform.forum.info.ForumParameter; import org.exoplatform.forum.service.Category; import org.exoplatform.forum.service.Forum; import org.exoplatform.forum.service.ForumService; import org.exoplatform.forum.service.ForumServiceUtils; import org.exoplatform.forum.service.Post; import org.exoplatform.forum.service.Topic; import org.exoplatform.forum.service.UserProfile; import org.exoplatform.forum.service.Utils; import org.exoplatform.forum.webui.popup.UIPostForm; import org.exoplatform.forum.webui.popup.UIPrivateMessageForm; import org.exoplatform.forum.webui.popup.UISettingEditModeForm; import org.exoplatform.forum.webui.popup.UIViewPostedByUser; import org.exoplatform.forum.webui.popup.UIViewTopicCreatedByUser; import org.exoplatform.forum.webui.popup.UIViewUserProfile; import org.exoplatform.ks.common.UserHelper; import org.exoplatform.ks.common.user.CommonContact; import org.exoplatform.ks.common.webui.UIPopupAction; import org.exoplatform.ks.common.webui.UIPopupContainer; import org.exoplatform.ks.common.webui.WebUIUtils; import org.exoplatform.portal.application.PortalRequestContext; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.social.core.space.model.Space; import org.exoplatform.social.core.space.spi.SpaceService; import org.exoplatform.web.application.ApplicationMessage; import org.exoplatform.web.application.RequestContext; import org.exoplatform.webui.application.WebuiApplication; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.application.portlet.PortletApplication; 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.UIApplication; import org.exoplatform.webui.core.UIPopupMessages; import org.exoplatform.webui.core.UIPopupWindow; import org.exoplatform.webui.core.UIPortletApplication; import org.exoplatform.webui.core.lifecycle.UIApplicationLifecycle; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.exception.MessageException; import org.exoplatform.ws.frameworks.cometd.ContinuationService; import org.mortbay.cometd.AbstractBayeux; import org.mortbay.cometd.continuation.EXoContinuationBayeux; /** * Author : Nguyen Quang Hung * hung.nguyen@exoplatform.com * Aug 01, 2007 */ @ComponentConfig( lifecycle = UIApplicationLifecycle.class, template = "app:/templates/forum/webui/UIForumPortlet.gtmpl", events = { @EventConfig(listeners = UIForumPortlet.ReLoadPortletEventActionListener.class), @EventConfig(listeners = UIForumPortlet.ViewPublicUserInfoActionListener.class ) , @EventConfig(listeners = UIForumPortlet.ViewPostedByUserActionListener.class ), @EventConfig(listeners = UIForumPortlet.PrivateMessageActionListener.class ), @EventConfig(listeners = UIForumPortlet.ViewThreadByUserActionListener.class ), @EventConfig(listeners = UIForumPortlet.OpenLinkActionListener.class) } ) public class UIForumPortlet extends UIPortletApplication { private ForumService forumService; private boolean isCategoryRendered = true; private boolean isForumRendered = false; private boolean isTagRendered = false; private boolean isSearchRendered = false; private boolean isJumpRendered = false; private boolean isShowForumJump = false; private boolean isShowPoll = false; private boolean isShowModerators = false; private boolean isShowRules = false; private boolean isShowIconsLegend = false; private boolean isShowStatistics = false; private boolean isShowQuickReply = false; private UserProfile userProfile = null; private boolean enableIPLogging = false; private boolean isShowForumActionBar = false; private boolean enableBanIP = false; private boolean useAjax = true; private int dayForumNewPost = 0; private String linkUserInfo = ForumUtils.EMPTY_STR; private List<String> invisibleForums = new ArrayList<String>(); private List<String> invisibleCategories = new ArrayList<String>(); public UIForumPortlet() throws Exception { forumService = (ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ForumService.class); addChild(UIBreadcumbs.class, null, null); boolean isRenderBar = !UserHelper.isAnonim(); addChild(UIForumActionBar.class, null, null).setRendered(isRenderBar); addChild(UICategoryContainer.class, null, null).setRendered(isCategoryRendered); addChild(UIForumContainer.class, null, null).setRendered(isForumRendered); addChild(UITopicsTag.class, null, null).setRendered(isTagRendered); addChild(UISearchForm.class, null, null).setRendered(isSearchRendered); addChild(UIForumLinks.class, null, null).setRendered(isJumpRendered); UIPopupAction popupAction = addChild(UIPopupAction.class, null, "UIForumPopupAction"); popupAction.getChild(UIPopupWindow.class).setId("UIForumPopupWindow"); try { loadPreferences(); } catch (Exception e) { } } public void processRender(WebuiApplication app, WebuiRequestContext context) throws Exception { PortletRequestContext portletReqContext = (PortletRequestContext) context; if (portletReqContext.getApplicationMode() == PortletMode.VIEW) { if (getChild(UIBreadcumbs.class) == null) { if (getChild(UISettingEditModeForm.class) != null) removeChild(UISettingEditModeForm.class); addChild(UIBreadcumbs.class, null, null); addChild(UIForumActionBar.class, null, null).setRendered(!UserHelper.isAnonim()); UICategoryContainer categoryContainer = addChild(UICategoryContainer.class, null, null).setRendered(isCategoryRendered); addChild(UIForumContainer.class, null, null).setRendered(isForumRendered); addChild(UITopicsTag.class, null, null).setRendered(isTagRendered); addChild(UISearchForm.class, null, null).setRendered(isSearchRendered); addChild(UIForumLinks.class, null, null).setRendered(isJumpRendered); updateIsRendered(ForumUtils.CATEGORIES); categoryContainer.updateIsRender(true); } } else if (portletReqContext.getApplicationMode() == PortletMode.EDIT) { if (getChild(UISettingEditModeForm.class) == null) { UISettingEditModeForm editModeForm = addChild(UISettingEditModeForm.class, null, null); editModeForm.setUserProfile(getUserProfile()); if (getChild(UIBreadcumbs.class) != null) { removeChild(UIBreadcumbs.class); removeChild(UIForumActionBar.class); removeChild(UICategoryContainer.class); removeChild(UIForumContainer.class); removeChild(UITopicsTag.class); removeChild(UISearchForm.class); removeChild(UIForumLinks.class); } } } try { renderComponentByURL(context); } catch (Exception e) { log.error("Can not open component by url, view exception: ", e); } super.processRender(app, context); } public void renderComponentByURL(WebuiRequestContext context) throws Exception { PortalRequestContext portalContext = Util.getPortalRequestContext(); String url = ((HttpServletRequest) portalContext.getRequest()).getRequestURL().toString(); String old = url; String isAjax = portalContext.getRequestParameter("ajaxRequest"); if (isAjax != null && Boolean.parseBoolean(isAjax)) return; String portalName = Util.getUIPortal().getName(); url = (url.contains(portalName)) ? url.substring(url.lastIndexOf(portalName)) : url; url = (url.contains(Utils.FORUM_SERVICE)) ? url.substring(url.lastIndexOf(Utils.FORUM_SERVICE)) : ((url.contains(Utils.CATEGORY)) ? url.substring(url.lastIndexOf(Utils.CATEGORY)) : ((url.contains(Utils.TOPIC)) ? url.substring(url.lastIndexOf(Utils.TOPIC)) : ((url.contains(Utils.FORUM) && ((url.lastIndexOf(Utils.FORUM) + 5) < url.length())) ? url.substring(url.lastIndexOf(Utils.FORUM)) : url))); if (url.indexOf(portalName) >= 0) return; if (url.equals(old)) { if (getForumIdOfSpace() != null) url = getForumIdOfSpace(); else return; } calculateRenderComponent(url, context); context.addUIComponentToUpdateByAjax(this); } private String getForumIdOfSpace() { try { PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance(); PortletPreferences pref = pcontext.getRequest().getPreferences(); if (pref.getValue("SPACE_URL", null) != null) { String url = pref.getValue("SPACE_URL", null); SpaceService sService = (SpaceService) PortalContainer.getInstance().getComponentInstanceOfType(SpaceService.class); Space space = sService.getSpaceByUrl(url); String forumId = Utils.FORUM_SPACE_ID_PREFIX + space.getId(); return forumId; } return null; } catch (Exception e) { return null; } } public void updateIsRendered(String selected) throws Exception { if (selected.equals(ForumUtils.CATEGORIES)) { isCategoryRendered = true; isForumRendered = false; isTagRendered = false; isSearchRendered = false; } else if (selected.equals(ForumUtils.FORUM)) { isForumRendered = true; isCategoryRendered = false; isTagRendered = false; isSearchRendered = false; } else if (selected.equals(ForumUtils.TAG)) { isTagRendered = true; isForumRendered = false; isCategoryRendered = false; isSearchRendered = false; } else { isTagRendered = false; isForumRendered = false; isCategoryRendered = false; isSearchRendered = true; } if (!isShowForumActionBar) { if (!isCategoryRendered || isSearchRendered) { getChild(UIForumActionBar.class).setRendered(false); } } setRenderForumLink(); getChild(UIForumContainer.class).setRendered(isForumRendered); getChild(UITopicsTag.class).setRendered(isTagRendered); getChild(UISearchForm.class).setRendered(isSearchRendered); if (!isForumRendered) { try { this.setRenderQuickReply(); } catch (Exception e) { } } } public void rederForumHome() throws Exception { updateIsRendered(ForumUtils.CATEGORIES); UICategoryContainer categoryContainer = getChild(UICategoryContainer.class); categoryContainer.updateIsRender(true); categoryContainer.getChild(UICategories.class).setIsRenderChild(false); getChild(UIForumLinks.class).setUpdateForumLinks(); getChild(UIBreadcumbs.class).setUpdataPath(Utils.FORUM_SERVICE); } public void setRenderForumLink() throws Exception { if (userProfile == null) updateUserProfileInfo(); if (isShowForumJump) { isJumpRendered = this.userProfile.getIsShowForumJump(); } else { isJumpRendered = false; } UICategoryContainer categoryContainer = getChild(UICategoryContainer.class).setRendered(isCategoryRendered); categoryContainer.setIsRenderJump(isJumpRendered); if (!isCategoryRendered) { getChild(UIForumLinks.class).setRendered(isJumpRendered); } } public void setRenderQuickReply() { PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance(); ActionResponse actionRes = (ActionResponse) pcontext.getResponse(); ForumParameter param = new ForumParameter(); param.setRenderQuickReply(false); param.setRenderPoll(false); param.setRenderModerator(false); param.setRenderRule(false); actionRes.setEvent(new QName("QuickReplyEvent"), param); actionRes.setEvent(new QName("ForumPollEvent"), param); actionRes.setEvent(new QName("ForumModerateEvent"), param); actionRes.setEvent(new QName("ForumRuleEvent"), param); } public void loadPreferences() throws Exception { PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance(); PortletPreferences portletPref = pcontext.getRequest().getPreferences(); invisibleCategories.clear(); invisibleForums.clear(); try { isShowForumActionBar = Boolean.parseBoolean(portletPref.getValue("showForumActionBar", ForumUtils.EMPTY_STR)); dayForumNewPost = Integer.parseInt(portletPref.getValue("forumNewPost", ForumUtils.EMPTY_STR)); useAjax = Boolean.parseBoolean(portletPref.getValue("useAjax", ForumUtils.EMPTY_STR)); enableIPLogging = Boolean.parseBoolean(portletPref.getValue("enableIPLogging", ForumUtils.EMPTY_STR)); enableBanIP = Boolean.parseBoolean(portletPref.getValue("enableIPFiltering", ForumUtils.EMPTY_STR)); isShowForumJump = Boolean.parseBoolean(portletPref.getValue("isShowForumJump", ForumUtils.EMPTY_STR)); isShowPoll = Boolean.parseBoolean(portletPref.getValue("isShowPoll", ForumUtils.EMPTY_STR)); isShowModerators = Boolean.parseBoolean(portletPref.getValue("isShowModerators", ForumUtils.EMPTY_STR)); isShowRules = Boolean.parseBoolean(portletPref.getValue("isShowRules", ForumUtils.EMPTY_STR)); isShowQuickReply = Boolean.parseBoolean(portletPref.getValue("isShowQuickReply", ForumUtils.EMPTY_STR)); isShowStatistics = Boolean.parseBoolean(portletPref.getValue("isShowStatistics", ForumUtils.EMPTY_STR)); isShowIconsLegend = Boolean.parseBoolean(portletPref.getValue("isShowIconsLegend", ForumUtils.EMPTY_STR)); invisibleCategories.addAll(getListInValus(portletPref.getValue("invisibleCategories", ForumUtils.EMPTY_STR))); invisibleForums.addAll(getListInValus(portletPref.getValue("invisibleForums", ForumUtils.EMPTY_STR))); } catch (Exception e) { log.error("Fail to load preference: " + e.getCause()); } if (invisibleCategories.size() == 1 && invisibleCategories.get(0).equals(" ")) invisibleCategories.clear(); } private List<String> getListInValus(String value) throws Exception { List<String> list = new ArrayList<String>(); if (!ForumUtils.isEmpty(value)) { list.addAll(Arrays.asList(ForumUtils.addStringToString(value, value))); } return list; } public String[] getImportJSTagCode() { return new String[] { "shCore", "shBrushBash", "shBrushCpp", "shBrushCSharp", "shBrushCss", "shBrushDelphi", "shBrushGroovy", "shBrushJava", "shBrushJScript", "shBrushPhp", "shBrushPython", "shBrushRuby", "shBrushScala", "shBrushSql", "shBrushVb", "shBrushXml" }; } public List<String> getInvisibleForums() { return invisibleForums; } public List<String> getInvisibleCategories() { return invisibleCategories; } public boolean isEnableIPLogging() { return enableIPLogging; } public boolean isEnableBanIp() { return enableBanIP; } public boolean isShowForumActionBar() { return isShowForumActionBar; } public boolean isShowPoll() { return isShowPoll; } public boolean isShowModerators() { return isShowModerators; } public boolean isShowRules() { return isShowRules; } public boolean isShowIconsLegend() { return isShowIconsLegend; } public boolean isShowQuickReply() { return isShowQuickReply; } public boolean isShowStatistics() { return isShowStatistics; } public boolean isUseAjax() { return useAjax; } public int getDayForumNewPost() { return dayForumNewPost; } public void renderPopupMessages() throws Exception { UIPopupMessages popupMess = getUIPopupMessages(); if (popupMess == null) return; WebuiRequestContext context = RequestContext.getCurrentInstance(); popupMess.processRender(context); } public void cancelAction() throws Exception { WebuiRequestContext context = RequestContext.getCurrentInstance(); UIPopupAction popupAction = getChild(UIPopupAction.class); popupAction.deActivate(); context.addUIComponentToUpdateByAjax(popupAction); } public UserProfile getUserProfile() throws Exception { if (this.userProfile == null) updateUserProfileInfo(); return this.userProfile; } public void updateAccessTopic(String topicId) throws Exception { String userId = userProfile.getUserId(); if (userId != null && userId.length() > 0) { try { forumService.updateTopicAccess(userId, topicId); } catch (Exception e) { } } userProfile.setLastTimeAccessTopic(topicId, TimeConvertUtils.getInstanceTempCalendar().getTimeInMillis()); } public void updateAccessForum(String forumId) throws Exception { String userId = userProfile.getUserId(); if (userId != null && userId.length() > 0) { try { forumService.updateForumAccess(userId, forumId); } catch (Exception e) { } } userProfile.setLastTimeAccessForum(forumId, TimeConvertUtils.getInstanceTempCalendar().getTimeInMillis()); } public void updateUserProfileInfo() throws Exception { String userId = ForumUtils.EMPTY_STR; try { userId = UserHelper.getCurrentUser(); } catch (Exception e) { log.error("user is unknown: " + e.getCause()); } try { if (enableBanIP) { userProfile = forumService.getDefaultUserProfile(userId, WebUIUtils.getRemoteIP()); } else { userProfile = forumService.getDefaultUserProfile(userId, null); } if (!ForumUtils.isEmpty(userId)) userProfile.setEmail(UserHelper.getUserByUserId(userId).getEmail()); if (userProfile.getIsBanned()) userProfile.setUserRole((long) 3); } catch (Exception e) { userProfile = new UserProfile(); } } public String getPortletLink() { if (ForumUtils.isEmpty(linkUserInfo)) try { linkUserInfo = this.event("ViewPublicUserInfo", "userName"); } catch (Exception e) { log.debug("Failed to set link to view info user.", e); } return linkUserInfo; } private CommonContact getPersonalContact(String userId) throws Exception { CommonContact contact = ForumSessionUtils.getPersonalContact(userId); if (contact == null) { contact = new CommonContact(); } return contact; } protected String getCometdContextName() { String cometdContextName = "cometd"; try { EXoContinuationBayeux bayeux = (EXoContinuationBayeux) PortalContainer.getInstance().getComponentInstanceOfType(AbstractBayeux.class); return (bayeux == null ? "cometd" : bayeux.getCometdContextName()); } catch (Exception e) { } return cometdContextName; } public String getUserToken() throws Exception { try { ContinuationService continuation = (ContinuationService) PortalContainer.getInstance().getComponentInstanceOfType(ContinuationService.class); return continuation.getUserToken(userProfile.getUserId()); } catch (Exception e) { log.error("Could not retrieve continuation token for user " + userProfile.getUserId(), e); } return ForumUtils.EMPTY_STR; } private boolean isArrayNotNull(String[] strs) { if (strs != null && strs.length > 0 && !strs[0].equals(" ")) return true;// private else return false; } public boolean checkForumHasAddTopic(String categoryId, String forumId) throws Exception { if (userProfile == null) updateUserProfileInfo(); if (userProfile.getUserRole() == 0) return true; try { Forum forum = (Forum) forumService.getObjectNameById(forumId, Utils.FORUM); if (forum.getIsClosed() || forum.getIsLock()) return false; Category cate = (Category) forumService.getObjectNameById(categoryId, Utils.CATEGORY); boolean isAdd = true; if(!Utils.isEmpty(cate.getUserPrivate())) { isAdd = ForumServiceUtils.hasPermission(cate.getUserPrivate(), userProfile.getUserId()); } if(isAdd) { if (userProfile.getUserRole() > 1 || (userProfile.getUserRole() == 1 && !ForumServiceUtils.hasPermission(forum.getModerators(), userProfile.getUserId()))) { String[] canCreadTopic = ForumUtils.arraysMerge(forum.getCreateTopicRole(), cate.getCreateTopicRole()); if (!Utils.isEmpty(canCreadTopic) && !canCreadTopic[0].equals(" ")) { return ForumServiceUtils.hasPermission(canCreadTopic, userProfile.getUserId()); } } } else return false; } catch (Exception e) { throw e; } return true; } public boolean checkForumHasAddPost(String categoryId, String forumId, String topicId) throws Exception { if (userProfile == null) updateUserProfileInfo(); if (userProfile.getUserRole() == 0) return true; try { Topic topic = (Topic) forumService.getObjectNameById(topicId, Utils.TOPIC); if (topic.getIsClosed() || topic.getIsLock()) return false; Forum forum = (Forum) forumService.getObjectNameById(forumId, Utils.FORUM); if (forum.getIsClosed() || forum.getIsLock()) return false; Category cate = (Category) forumService.getObjectNameById(categoryId, Utils.CATEGORY); boolean isAdd = true; if(!Utils.isEmpty(cate.getUserPrivate())) { isAdd = ForumServiceUtils.hasPermission(cate.getUserPrivate(), userProfile.getUserId()); } if(isAdd) { if (userProfile.getUserRole() > 1 || (userProfile.getUserRole() == 1 && !ForumServiceUtils.hasPermission(forum.getModerators(), userProfile.getUserId()))) { if (!topic.getIsActive() || !topic.getIsActiveByForum()) return false; String[] canCreadPost = ForumUtils.arraysMerge(cate.getCreateTopicRole(), ForumUtils.arraysMerge(topic.getCanPost(), forum.getCreateTopicRole())); if (!ForumUtils.isArrayEmpty(canCreadPost)) { return ForumServiceUtils.hasPermission(canCreadPost, userProfile.getUserId()); } } } else return false; } catch (Exception e) { throw e; } return true; } public boolean checkCanView(Category cate, Forum forum, Topic topic) throws Exception { if (userProfile == null) updateUserProfileInfo(); String userId = userProfile.getUserId(); if (userProfile.getUserRole() == 0) return true; List<String> userBound = UserHelper.getAllGroupAndMembershipOfUser(userId); String[] viewer = cate.getUserPrivate(); if (isArrayNotNull(viewer)) { if (!Utils.hasPermission(Arrays.asList(viewer), userBound)) return false; } if (forum != null) { if (isArrayNotNull(forum.getModerators())) { if (Utils.hasPermission(Arrays.asList(forum.getModerators()), userBound)) return true; } else if (forum.getIsClosed()) return false; } if (topic != null) { List<String> list = new ArrayList<String>(); list = ForumUtils.addArrayToList(list, topic.getCanView()); list = ForumUtils.addArrayToList(list, forum.getViewer()); list = ForumUtils.addArrayToList(list, cate.getViewer()); // if (topic.getOwner() != null) // list = ForumUtils.addArrayToList(list, new String[] {topic.getOwner()}); if (!list.isEmpty() && topic.getOwner() != null) list.add(topic.getOwner()); if (topic.getIsClosed() || !topic.getIsActive() || !topic.getIsActiveByForum() || !topic.getIsApproved() || topic.getIsWaiting() || (!list.isEmpty() && !Utils.hasPermission(list, userBound))) return false; } return true; } public void calculateRenderComponent(String path, WebuiRequestContext context) throws Exception { UIApplication uiApp = (UIApplication) this; ResourceBundle res = context.getApplicationResourceBundle(); if (path.equals(Utils.FORUM_SERVICE)) { rederForumHome(); } else if (path.indexOf(ForumUtils.FIELD_SEARCHFORUM_LABEL) >= 0) { updateIsRendered(ForumUtils.FIELD_SEARCHFORUM_LABEL); UISearchForm searchForm = getChild(UISearchForm.class); searchForm.setUserProfile(getUserProfile()); searchForm.setSelectType(path.replaceFirst(ForumUtils.FIELD_SEARCHFORUM_LABEL, "")); searchForm.setPath(ForumUtils.EMPTY_STR); path = ForumUtils.FIELD_EXOFORUM_LABEL; } else if (path.lastIndexOf(Utils.TAG) >= 0) { updateIsRendered(ForumUtils.TAG); getChild(UIForumLinks.class).setValueOption(ForumUtils.EMPTY_STR); getChild(UITopicsTag.class).setIdTag(path); } else if (path.lastIndexOf(Utils.TOPIC) >= 0) { boolean isReply = false, isQuote = false; if (path.indexOf("/true") > 0) { isQuote = true; path = path.replaceFirst("/true", ForumUtils.EMPTY_STR); } else if (path.indexOf("/false") > 0) { isReply = true; path = path.replaceFirst("/false", ForumUtils.EMPTY_STR); } if(path.indexOf(Utils.CATEGORY) > 0) { path = path.substring(path.indexOf(Utils.CATEGORY)); } String[] id = path.split(ForumUtils.SLASH); String postId = "top"; int page = 0; if (path.indexOf(Utils.POST) > 0) { postId = id[id.length - 1]; path = path.substring(0, path.lastIndexOf(ForumUtils.SLASH)); id = path.split(ForumUtils.SLASH); } else if (id.length > 1) { try { page = Integer.parseInt(id[id.length - 1]); } catch (Exception e) { } if (page > 0) { path = path.replace(ForumUtils.SLASH + id[id.length - 1], ForumUtils.EMPTY_STR); id = path.split(ForumUtils.SLASH); } else page = 0; } try { Topic topic; if (id.length > 1) { topic = this.forumService.getTopicByPath(path, false); } else { topic = (Topic) this.forumService.getObjectNameById(path, Utils.TOPIC); path = topic.getPath(); path = path.substring(path.indexOf(Utils.CATEGORY)); id = path.split(ForumUtils.SLASH); } if (topic != null) { Category category = this.forumService.getCategory(id[0]); Forum forum = this.forumService.getForum(id[0], id[1]); if (this.checkCanView(category, forum, topic)) { this.updateIsRendered(ForumUtils.FORUM); UIForumContainer uiForumContainer = this.getChild(UIForumContainer.class); UITopicDetailContainer uiTopicDetailContainer = uiForumContainer.getChild(UITopicDetailContainer.class); uiForumContainer.setIsRenderChild(false); uiForumContainer.getChild(UIForumDescription.class).setForum(forum); UITopicDetail uiTopicDetail = uiTopicDetailContainer.getChild(UITopicDetail.class); uiTopicDetail.setIsEditTopic(true); uiTopicDetail.setUpdateForum(forum); uiTopicDetail.initInfoTopic(id[0], id[1], topic, page); uiTopicDetailContainer.getChild(UITopicPoll.class).updateFormPoll(id[0], id[1], topic.getId()); this.getChild(UIForumLinks.class).setValueOption((id[0] + ForumUtils.SLASH + id[1] + " ")); uiTopicDetail.setIdPostView(postId); uiTopicDetail.setLastPostId((postId.equals("top")?"":postId)); if (isReply || isQuote) { if (uiTopicDetail.getCanPost()) { uiTopicDetail.setIdPostView("top"); try { UIPopupAction popupAction = this.getChild(UIPopupAction.class); UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null); UIPostForm postForm = popupContainer.addChild(UIPostForm.class, null, null); boolean isMod = ForumServiceUtils.hasPermission(forum.getModerators(), this.userProfile.getUserId()); postForm.setPostIds(id[0], id[1], topic.getId(), topic); postForm.setMod(isMod); if (isQuote) { // uiTopicDetail.setLastPostId(postId) ; Post post = this.forumService.getPost(id[0], id[1], topic.getId(), postId); if (post != null) { postForm.updatePost(postId, true, false, post); popupContainer.setId("UIQuoteContainer"); } else { uiApp.addMessage(new ApplicationMessage("UIBreadcumbs.msg.post-no-longer-exist", null, ApplicationMessage.WARNING)); context.addUIComponentToUpdateByAjax(uiApp.getUIPopupMessages()); uiTopicDetail.setIdPostView("normal"); } } else { postForm.updatePost(ForumUtils.EMPTY_STR, false, false, null); popupContainer.setId("UIAddPostContainer"); } popupAction.activate(popupContainer, 900, 500); context.addUIComponentToUpdateByAjax(popupAction); } catch (Exception e) { log.error(e); } } else { uiApp.addMessage(new ApplicationMessage("UIPostForm.msg.no-permission", null, ApplicationMessage.WARNING)); } } if (!UserHelper.isAnonim()) { this.forumService.updateTopicAccess(UserHelper.getCurrentUser(), topic.getId()); this.getUserProfile().setLastTimeAccessTopic(topic.getId(), TimeConvertUtils.getInstanceTempCalendar().getTimeInMillis()); } } else { uiApp.addMessage(new ApplicationMessage("UIBreadcumbs.msg.do-not-permission", new String[] { topic.getTopicName(), res.getString("UIForumPortlet.label.topic").toLowerCase() }, ApplicationMessage.WARNING)); rederForumHome(); path = Utils.FORUM_SERVICE; } } } catch (Exception e) { uiApp.addMessage(new ApplicationMessage("UIShowBookMarkForm.msg.link-not-found", null, ApplicationMessage.WARNING)); rederForumHome(); path = Utils.FORUM_SERVICE; } } else if ((path.lastIndexOf(Utils.FORUM) == 0 && path.lastIndexOf(Utils.CATEGORY) < 0) || (path.lastIndexOf(Utils.FORUM) > 0)) { try { Forum forum; String cateId = null; int page = 0; if (path.indexOf(ForumUtils.SLASH) >= 0) { path = path.substring(path.indexOf(Utils.CATEGORY)); String[] arr = path.split(ForumUtils.SLASH); try { page = Integer.parseInt(arr[arr.length - 1]); } catch (Exception e) { } if (arr[0].indexOf(Utils.CATEGORY) == 0) { cateId = arr[0]; forum = this.forumService.getForum(cateId, arr[1]); } else { forum = (Forum) this.forumService.getObjectNameById(arr[0], Utils.FORUM); } } else { forum = (Forum) this.forumService.getObjectNameById(path, Utils.FORUM); } path = forum.getPath(); if (cateId == null) { cateId = path.substring(path.indexOf(Utils.CATEGORY), path.lastIndexOf(Utils.FORUM) - 1); } path = path.substring(path.indexOf(Utils.CATEGORY)); Category category = this.forumService.getCategory(cateId); if (this.checkCanView(category, forum, null)) { this.updateIsRendered(ForumUtils.FORUM); UIForumContainer forumContainer = this.findFirstComponentOfType(UIForumContainer.class); forumContainer.setIsRenderChild(true); forumContainer.getChild(UIForumDescription.class).setForum(forum); forumContainer.getChild(UITopicContainer.class).setUpdateForum(cateId, forum, page); } else { uiApp.addMessage(new ApplicationMessage("UIBreadcumbs.msg.do-not-permission", new String[] { forum.getForumName(), res.getString("UIForumPortlet.label.forum").toLowerCase() }, ApplicationMessage.WARNING)); rederForumHome(); path = Utils.FORUM_SERVICE; } } catch (Exception e) { uiApp.addMessage(new ApplicationMessage("UIShowBookMarkForm.msg.link-not-found", new String[] { res.getString("UIForumPortlet.label.forum") }, ApplicationMessage.WARNING)); rederForumHome(); path = Utils.FORUM_SERVICE; } } else if (path.indexOf(Utils.CATEGORY) >= 0 && path.indexOf(ForumUtils.SLASH) < 0) { UICategoryContainer categoryContainer = this.getChild(UICategoryContainer.class); try { Category category = this.forumService.getCategory(path); if (this.checkCanView(category, null, null)) { categoryContainer.getChild(UICategory.class).updateByLink(category); categoryContainer.updateIsRender(false); this.updateIsRendered(ForumUtils.CATEGORIES); } else { uiApp.addMessage(new ApplicationMessage("UIBreadcumbs.msg.do-not-permission", new String[] { category.getCategoryName(), res.getString("UIForumPortlet.label.category").toLowerCase() }, ApplicationMessage.WARNING)); rederForumHome(); path = Utils.FORUM_SERVICE; } } catch (Exception e) { uiApp.addMessage(new ApplicationMessage("UIShowBookMarkForm.msg.link-not-found", null, ApplicationMessage.WARNING)); rederForumHome(); path = Utils.FORUM_SERVICE; } } else { uiApp.addMessage(new ApplicationMessage("UIShowBookMarkForm.msg.link-not-found", null, ApplicationMessage.WARNING)); rederForumHome(); path = Utils.FORUM_SERVICE; } getChild(UIBreadcumbs.class).setUpdataPath(path); getChild(UIForumLinks.class).setValueOption(path); } static public class ReLoadPortletEventActionListener extends EventListener<UIForumPortlet> { public void execute(Event<UIForumPortlet> event) throws Exception { UIForumPortlet forumPortlet = event.getSource(); ForumParameter params = (ForumParameter) event.getRequestContext().getAttribute(PortletApplication.PORTLET_EVENT_VALUE); if (params.getTopicId() != null) { forumPortlet.userProfile.setLastTimeAccessTopic(params.getTopicId(), TimeConvertUtils.getInstanceTempCalendar().getTimeInMillis()); UITopicDetail topicDetail = forumPortlet.findFirstComponentOfType(UITopicDetail.class); topicDetail.setIdPostView("lastpost"); } if (params.isRenderPoll()) { UITopicDetailContainer topicDetailContainer = forumPortlet.findFirstComponentOfType(UITopicDetailContainer.class); topicDetailContainer.getChild(UITopicDetail.class).setIsEditTopic(true); topicDetailContainer.getChild(UITopicPoll.class).setEditPoll(true); } event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet); } } static public class OpenLinkActionListener extends EventListener<UIForumPortlet> { public void execute(Event<UIForumPortlet> event) throws Exception { UIForumPortlet forumPortlet = event.getSource(); String path = event.getRequestContext().getRequestParameter(OBJECTID); if (ForumUtils.isEmpty(path)) { ForumParameter params = (ForumParameter) event.getRequestContext().getAttribute(PortletApplication.PORTLET_EVENT_VALUE); path = params.getPath(); } if (ForumUtils.isEmpty(path)) return; forumPortlet.calculateRenderComponent(path, event.getRequestContext()); event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet); } } static public class ViewPublicUserInfoActionListener extends EventListener<UIForumPortlet> { public void execute(Event<UIForumPortlet> event) throws Exception { UIForumPortlet forumPortlet = event.getSource(); String userId = event.getRequestContext().getRequestParameter(OBJECTID); UIPopupAction popupAction = forumPortlet.getChild(UIPopupAction.class); UIViewUserProfile viewUserProfile = popupAction.createUIComponent(UIViewUserProfile.class, null, null); try { UserProfile selectProfile = forumPortlet.forumService.getUserInformations(forumPortlet.forumService.getQuickProfile(userId.trim())); viewUserProfile.setUserProfileViewer(selectProfile); } catch (Exception e) { log.error("Fail to set user profile: \n", e); } viewUserProfile.setUserProfile(forumPortlet.userProfile); CommonContact contact = forumPortlet.getPersonalContact(userId.trim()); viewUserProfile.setContact(contact); popupAction.activate(viewUserProfile, 670, 400, true); event.getRequestContext().addUIComponentToUpdateByAjax(popupAction); } } static public class PrivateMessageActionListener extends EventListener<UIForumPortlet> { public void execute(Event<UIForumPortlet> event) throws Exception { UIForumPortlet forumPortlet = event.getSource(); ; if (forumPortlet.userProfile.getIsBanned()) { String[] args = new String[] {}; throw new MessageException(new ApplicationMessage("UITopicDetail.msg.userIsBannedCanNotSendMail", args, ApplicationMessage.WARNING)); } String userId = event.getRequestContext().getRequestParameter(OBJECTID); int t = userId.indexOf(Utils.DELETED); if (t > 0) { String[] args = new String[] { userId.substring(0, t) }; throw new MessageException(new ApplicationMessage("UITopicDetail.msg.userIsDeleted", args, ApplicationMessage.WARNING)); } UIPopupAction popupAction = forumPortlet.getChild(UIPopupAction.class); UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null); UIPrivateMessageForm messageForm = popupContainer.addChild(UIPrivateMessageForm.class, null, null); messageForm.setFullMessage(false); messageForm.setUserProfile(forumPortlet.userProfile); messageForm.setSendtoField(userId); popupContainer.setId("PrivateMessageForm"); popupAction.activate(popupContainer, 650, 480); event.getRequestContext().addUIComponentToUpdateByAjax(popupAction); } } static public class ViewPostedByUserActionListener extends EventListener<UIForumPortlet> { public void execute(Event<UIForumPortlet> event) throws Exception { String userId = event.getRequestContext().getRequestParameter(OBJECTID); UIForumPortlet forumPortlet = event.getSource(); UIPopupAction popupAction = forumPortlet.getChild(UIPopupAction.class); UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null); UIViewPostedByUser viewPostedByUser = popupContainer.addChild(UIViewPostedByUser.class, null, null); viewPostedByUser.setUserProfile(userId); popupContainer.setId("ViewPostedByUser"); popupAction.activate(popupContainer, 760, 370); event.getRequestContext().addUIComponentToUpdateByAjax(popupAction); } } static public class ViewThreadByUserActionListener extends EventListener<UIForumPortlet> { public void execute(Event<UIForumPortlet> event) throws Exception { String userId = event.getRequestContext().getRequestParameter(OBJECTID); UIForumPortlet forumPortlet = event.getSource(); UIPopupAction popupAction = forumPortlet.getChild(UIPopupAction.class); UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null); UIViewTopicCreatedByUser topicCreatedByUser = popupContainer.addChild(UIViewTopicCreatedByUser.class, null, null); topicCreatedByUser.setUserId(userId); popupContainer.setId("ViewTopicCreatedByUser"); popupAction.activate(popupContainer, 760, 450); event.getRequestContext().addUIComponentToUpdateByAjax(popupAction); } } }