/*************************************************************************** * 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.List; import javax.portlet.ActionResponse; import javax.xml.namespace.QName; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.forum.ForumUtils; 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.Tag; import org.exoplatform.forum.service.Topic; import org.exoplatform.forum.service.UserProfile; import org.exoplatform.forum.service.Utils; import org.exoplatform.portal.account.UIAccountSetting; import org.exoplatform.portal.webui.portal.UIPortal; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.portal.webui.workspace.UIMaskWorkspace; import org.exoplatform.portal.webui.workspace.UIPortalApplication; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; 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.UIContainer; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; /** * Created by The eXo Platform SARL * Author : Hung Nguyen * hung.nguyen@exoplatform.com * Aus 01, 2007 2:48:18 PM */ @ComponentConfig( template = "app:/templates/forum/webui/UIBreadcumbs.gtmpl" , events = { @EventConfig(listeners = UIBreadcumbs.ChangePathActionListener.class), @EventConfig(listeners = UIBreadcumbs.AccountSettingsActionListener.class), @EventConfig(listeners = UIBreadcumbs.RssActionListener.class) } ) @SuppressWarnings("unused") public class UIBreadcumbs extends UIContainer { private static Log log = ExoLogger.getExoLogger(UIBreadcumbs.class); private boolean useAjax = true; private ForumService forumService; private List<String> breadcumbs_ = new ArrayList<String>(); private List<String> path_ = new ArrayList<String>(); private String QUICK_SEARCH = "QuickSearchForm"; public static final String FORUM_SERVICE = Utils.FORUM_SERVICE; private boolean isLink = false; private boolean isOpen = true; private String tooltipLink = Utils.FORUM_SERVICE; private UserProfile userProfile; public UIBreadcumbs() throws Exception { forumService = (ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ForumService.class); breadcumbs_.add(ForumUtils.FIELD_EXOFORUM_LABEL); path_.add(FORUM_SERVICE); addChild(UIQuickSearchForm.class, null, QUICK_SEARCH); } private void setIsUseAjax() throws Exception { UIForumPortlet forumPortlet = this.getAncestorOfType(UIForumPortlet.class); userProfile = forumPortlet.getUserProfile(); useAjax = forumPortlet.isUseAjax(); } public void setUpdataPath(String path) throws Exception { isLink = false; setRenderForumLink(path); if (!ForumUtils.isEmpty(path) && !path.equals(FORUM_SERVICE)) { String temp[] = path.split(ForumUtils.SLASH); if (path.indexOf(ForumUtils.FIELD_EXOFORUM_LABEL) >= 0) { if(!ForumUtils.FIELD_EXOFORUM_LABEL.equals(path)) { path_.clear(); breadcumbs_.clear(); path_.add(FORUM_SERVICE); tooltipLink = FORUM_SERVICE; breadcumbs_.add(ForumUtils.FIELD_EXOFORUM_LABEL); } breadcumbs_.add(ForumUtils.FIELD_SEARCHFORUM_LABEL); path_.add(ForumUtils.SLASH + ForumUtils.FIELD_EXOFORUM_LABEL); } else { path_.clear(); breadcumbs_.clear(); path_.add(FORUM_SERVICE); tooltipLink = FORUM_SERVICE; breadcumbs_.add(ForumUtils.FIELD_EXOFORUM_LABEL); String tempPath = ForumUtils.EMPTY_STR; int i = 0; try { for (String string : temp) { if (!ForumUtils.isEmpty(tempPath)) tempPath = tempPath + ForumUtils.SLASH + string; else tempPath = string; Object obj = forumService.getObjectNameByPath(tempPath); if (obj == null) { if (i == 0) { isLink = true; } break; } if (obj instanceof Category) { Category category = (Category) obj; tempPath = string; breadcumbs_.add(category.getCategoryName()); tooltipLink = ForumUtils.CATEGORY; } else if (obj instanceof Forum) { Forum forum = (Forum) obj; breadcumbs_.add(forum.getForumName()); tooltipLink = ForumUtils.FORUM; } else if (obj instanceof Topic) { Topic topic = (Topic) obj; breadcumbs_.add(topic.getTopicName()); tooltipLink = ForumUtils.TOPIC; } else if (obj instanceof Tag) { Tag tag = (Tag) obj; breadcumbs_.add(tag.getName()); tooltipLink = ForumUtils.TAG; } path_.add(tempPath); ++i; } } catch (Exception e) { } } } else { path_.clear(); breadcumbs_.clear(); path_.add(FORUM_SERVICE); breadcumbs_.add(ForumUtils.FIELD_EXOFORUM_LABEL); tooltipLink = FORUM_SERVICE; } } private void setRenderForumLink(String path) throws Exception { try { PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance(); ActionResponse actionRes = (ActionResponse) pcontext.getResponse(); ForumParameter param = new ForumParameter(); if (userProfile.getIsShowForumJump() && !path.equals(FORUM_SERVICE)) { if (path.indexOf(Utils.TOPIC) > 0) { path = path.substring(0, path.lastIndexOf(ForumUtils.SLASH)); } param.setRenderForumLink(true); param.setPath(path); } else { param.setRenderForumLink(false); } actionRes.setEvent(new QName("ForumLinkEvent"), param); } catch (Exception e) { } } public boolean isOpen() { return isOpen; } public void setOpen(boolean isOpen) { this.isOpen = isOpen; } private String getToolTip() { return tooltipLink; } private boolean isLink() { return this.isLink; } public String getLastPath() { if (this.path_.size() > 0) { String str = path_.get(this.path_.size() - 1); return ((ForumUtils.SLASH + ForumUtils.FIELD_EXOFORUM_LABEL).equals(str)) ? Utils.FORUM_SERVICE : str; } else{ return Utils.FORUM_SERVICE; } } private String getPath(int index) { return this.path_.get(index); } private int getMaxPath() { return breadcumbs_.size(); } private List<String> getBreadcumbs() throws Exception { return breadcumbs_; } private boolean isArrayNotNull(String[] strs) { if (strs != null && strs.length > 0 && !strs[0].equals(" ")) return true;// private else return false; } private String getType(String id) { return (id.indexOf(Utils.FORUM_SERVICE) >= 0) ? Utils.FORUM_SERVICE : ((id.indexOf(Utils.CATEGORY) >= 0) ? ForumUtils.CATEGORY : ((id.indexOf(Utils.FORUM) >= 0) ? ForumUtils.FORUM : ((id.indexOf(Utils.TOPIC) >= 0) ? ForumUtils.TOPIC : (ForumUtils.EMPTY_STR)))); } private boolean checkLinkPrivate(String id) throws Exception { boolean isPrivate = false; if (id.indexOf(Utils.TOPIC) >= 0) { try { Topic topic = (Topic) this.forumService.getObjectNameById(id, Utils.TOPIC); if (topic != null) { if (topic.getIsClosed() || !topic.getIsActiveByForum() || !topic.getIsActive() || topic.getIsWaiting() || (isArrayNotNull(topic.getCanView()))) { isPrivate = true; } if (!isPrivate) { String path = topic.getPath(); id = path.substring(path.lastIndexOf(Utils.FORUM), path.indexOf(Utils.TOPIC) - 1); Forum forum = (Forum) this.forumService.getObjectNameById(id, Utils.FORUM); if (forum.getIsClosed()) isPrivate = true; if (!isPrivate) { id = path.substring(path.indexOf(Utils.CATEGORY), path.lastIndexOf(Utils.FORUM) - 1); Category cate = (Category) this.forumService.getObjectNameById(id, Utils.CATEGORY); if (isArrayNotNull(cate.getUserPrivate())) { isPrivate = true; } } } } } catch (Exception e) { log.error("\nThe " + id + " must exist: " + e.getMessage(), e); } } else if (id.indexOf(Utils.CATEGORY) == 0) { try { Category cate = (Category) this.forumService.getObjectNameById(id, Utils.CATEGORY); if (isArrayNotNull(cate.getUserPrivate())) { isPrivate = true; } } catch (Exception e) { } } else if (id.indexOf(Utils.FORUM) == 0) { try { Forum forum = (Forum) this.forumService.getObjectNameById(id, Utils.FORUM); if (forum.getIsClosed()) isPrivate = true; if (!isPrivate) { String path = forum.getPath(); path = path.substring(path.indexOf(Utils.CATEGORY), path.lastIndexOf(Utils.FORUM) - 1); Category cate = (Category) this.forumService.getObjectNameById(path, Utils.CATEGORY); if (isArrayNotNull(cate.getUserPrivate())) { isPrivate = true; } } } catch (Exception e) { } } return isPrivate; } static public class ChangePathActionListener extends EventListener<UIBreadcumbs> { public void execute(Event<UIBreadcumbs> event) throws Exception { UIBreadcumbs breadcums = event.getSource(); if (breadcums.isOpen()) { String path = event.getRequestContext().getRequestParameter(OBJECTID); UIForumPortlet forumPortlet = breadcums.getAncestorOfType(UIForumPortlet.class); forumPortlet.calculateRenderComponent(path, event.getRequestContext()); event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet); } else { breadcums.isOpen = true; } } } static public class RssActionListener extends EventListener<UIBreadcumbs> { public void execute(Event<UIBreadcumbs> event) throws Exception { UIForumPortlet forumPortlet = event.getSource().getAncestorOfType(UIForumPortlet.class); UICategoryContainer categoryContainer = forumPortlet.getChild(UICategoryContainer.class); categoryContainer.updateIsRender(true); forumPortlet.updateIsRendered(ForumUtils.CATEGORIES); event.getSource().setUpdataPath(FORUM_SERVICE); event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet); } } static public class AccountSettingsActionListener extends EventListener<UIBreadcumbs> { public void execute(Event<UIBreadcumbs> event) throws Exception { UIPortal uiPortal = Util.getUIPortal(); UIPortalApplication uiApp = uiPortal.getAncestorOfType(UIPortalApplication.class); UIMaskWorkspace uiMaskWS = uiApp.getChildById(UIPortalApplication.UI_MASK_WS_ID); UIAccountSetting uiAccountForm = uiMaskWS.createUIComponent(UIAccountSetting.class, null, null); uiMaskWS.setUIComponent(uiAccountForm); uiMaskWS.setShow(true); event.getRequestContext().addUIComponentToUpdateByAjax(uiMaskWS); } } }