/*************************************************************************** * 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.forum.ForumUtils; import org.exoplatform.forum.info.ForumParameter; import org.exoplatform.forum.info.UIForumLinkPortlet; import org.exoplatform.forum.service.Category; import org.exoplatform.forum.service.Forum; import org.exoplatform.forum.service.ForumLinkData; import org.exoplatform.forum.service.UserProfile; import org.exoplatform.forum.service.Utils; import org.exoplatform.ks.common.UserHelper; 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.core.model.SelectItemOption; 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( lifecycle = UIFormLifecycle.class, template = "app:/templates/forum/webui/UIForumLinks.gtmpl", events = { @EventConfig(listeners = UIForumLinks.SelectActionListener.class) } ) public class UIForumLinks extends BaseForumForm { public static final String FIELD_FORUMLINK_SELECTBOX = "forumLink"; public static final String FIELD_FORUMHOMEPAGE_LABEL = "forumHomePage"; private String path = Utils.FORUM_SERVICE; private List<ForumLinkData> forumLinks = null; public UIForumLinks() throws Exception { } private String getStrQuery(List<String> list, String property) { StringBuffer strQuery = new StringBuffer(); int t = 0; for (String string : list) { if (t == 0) strQuery.append("(").append(property).append("='").append(string).append("'"); else strQuery.append(" or ").append(property).append("='").append(string).append("'"); ++t; } if (t > 0) strQuery.append(")"); return strQuery.toString(); } public void setUpdateForumLinks() throws Exception { UIForumPortlet forumPortlet = this.getAncestorOfType(UIForumPortlet.class); try { this.userProfile = forumPortlet.getUserProfile(); } catch (Exception e) { String userName = UserHelper.getCurrentUser(); if (userName != null) { try { userProfile = getForumService().getQuickProfile(userName); } catch (Exception ex) { userProfile = new UserProfile(); } } } String strQueryCate = ForumUtils.EMPTY_STR; String strQueryForum = ForumUtils.EMPTY_STR; List<String> listUser = UserHelper.getAllGroupAndMembershipOfUser(this.userProfile.getUserId()); if (this.userProfile.getUserRole() > 0) { // set Query for Forum strQueryForum = getStrQuery(listUser, "@exo:moderators"); if (!ForumUtils.isEmpty(strQueryForum)) strQueryForum = "(@exo:isClosed='false' or " + strQueryForum + ")"; else strQueryForum = "@exo:isClosed='false'"; // set Query for Category listUser.add(" "); strQueryCate = getStrQuery(listUser, "@exo:userPrivate"); } List<String> listCateIdScope = forumPortlet.getInvisibleCategories(); List<String> listForumIdScope = forumPortlet.getInvisibleForums(); if (!listForumIdScope.isEmpty() && !listForumIdScope.get(0).equals(" ")) { String s = getStrQuery(listForumIdScope, "fn:name()"); if (!ForumUtils.isEmpty(strQueryForum)) strQueryForum = strQueryForum + " and " + s; else strQueryForum = s; } if (!listCateIdScope.isEmpty() && !listCateIdScope.get(0).equals(" ")) { String s = getStrQuery(listCateIdScope, "fn:name()"); if (!ForumUtils.isEmpty(strQueryCate)) strQueryCate = strQueryCate + " and " + s; else strQueryCate = s; } if (!ForumUtils.isEmpty(strQueryForum)) strQueryForum = "[" + strQueryForum + "]"; if (!ForumUtils.isEmpty(strQueryCate)) strQueryCate = "[" + strQueryCate + "]"; this.forumLinks = getForumService().getAllLink(strQueryCate, strQueryForum); List<SelectItemOption<String>> list = new ArrayList<SelectItemOption<String>>(); list.add(new SelectItemOption<String>(this.getLabel(FIELD_FORUMHOMEPAGE_LABEL) + ForumUtils.SLASH + FIELD_FORUMHOMEPAGE_LABEL, Utils.FORUM_SERVICE)); String space = "    ", type = "/categoryLink"; for (ForumLinkData linkData : forumLinks) { if (linkData.getType().equals(Utils.FORUM)) { type = ForumUtils.SLASH + FIELD_FORUMLINK_SELECTBOX; space = "        "; } if (linkData.getType().equals(Utils.CATEGORY)) { type = "/categoryLink"; space = "    "; } if (linkData.getType().equals(Utils.TOPIC)) continue; list.add(new SelectItemOption<String>(space + linkData.getName() + type, linkData.getPath())); } UIFormSelectBoxForum forumLink; if (getChild(UIFormSelectBoxForum.class) != null) { forumLink = this.getChild(UIFormSelectBoxForum.class).setOptions(list); if (ForumUtils.isEmpty(path)) forumLink.setValue(Utils.FORUM_SERVICE); else forumLink.setValue(path.trim()); } else { forumLink = new UIFormSelectBoxForum(FIELD_FORUMLINK_SELECTBOX, FIELD_FORUMLINK_SELECTBOX, list); if (ForumUtils.isEmpty(path)) forumLink.setValue(Utils.FORUM_SERVICE); else forumLink.setValue(path.trim()); addUIFormInput(forumLink); } } public UIFormSelectBoxForum getUIFormSelectBoxForum(String name) { return findComponentById(name); } public List<ForumLinkData> getForumLinks() throws Exception { return this.forumLinks; } public void setValueOption(String path) throws Exception { this.path = path; } static public class SelectActionListener extends EventListener<UIForumLinks> { public void execute(Event<UIForumLinks> event) throws Exception { UIForumLinks uiForm = event.getSource(); UIFormSelectBoxForum selectBoxForum = uiForm.getUIFormSelectBoxForum(FIELD_FORUMLINK_SELECTBOX); String path = selectBoxForum.getValue(); try { UIForumPortlet forumPortlet = uiForm.getAncestorOfType(UIForumPortlet.class); boolean isErro = false; if (!path.equals(uiForm.path)) { if (path.lastIndexOf(Utils.FORUM) > 0) { String id[] = path.trim().split(ForumUtils.SLASH); Forum forum = uiForm.getForumService().getForum(id[0], id[1]); ; if (forum != null) { UIForumContainer forumContainer = forumPortlet.findFirstComponentOfType(UIForumContainer.class); forumContainer.getChild(UIForumDescription.class).setForum(forum); forumContainer.getChild(UITopicContainer.class).updateByBreadcumbs(id[0], id[1], true, 0); forumContainer.setIsRenderChild(true); forumPortlet.updateIsRendered(ForumUtils.FORUM); } else isErro = true; } else if (path.indexOf(Utils.CATEGORY) >= 0) { Category category = uiForm.getForumService().getCategory(path.trim()); if (category != null) { UICategoryContainer categoryContainer = forumPortlet.getChild(UICategoryContainer.class); categoryContainer.getChild(UICategory.class).update(category, null); categoryContainer.updateIsRender(false); forumPortlet.updateIsRendered(ForumUtils.CATEGORIES); } else isErro = true; } if (isErro) { uiForm.warning("UIShowBookMarkForm.msg.link-not-found"); path = Utils.FORUM_SERVICE; } if (path.indexOf(Utils.FORUM_SERVICE) >= 0) { UICategoryContainer categoryContainer = forumPortlet.getChild(UICategoryContainer.class); categoryContainer.updateIsRender(true); categoryContainer.getChild(UICategories.class).setIsRenderChild(false); forumPortlet.updateIsRendered(ForumUtils.CATEGORIES); } uiForm.path = path; forumPortlet.getChild(UIBreadcumbs.class).setUpdataPath(path.trim()); event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet); } } catch (Exception e) { try { if (!path.equals(uiForm.path)) { uiForm.path = path; UIForumLinkPortlet linkPortlet = uiForm.getParent(); if (path.equals(Utils.FORUM_SERVICE)) { linkPortlet.setRenderChild(false); } else { linkPortlet.setRenderChild(true); } ActionResponse actionRes = event.getRequestContext().getResponse(); ForumParameter param = new ForumParameter(); param.setPath(path); actionRes.setEvent(new QName("OpenLink"), param); event.getRequestContext().addUIComponentToUpdateByAjax(linkPortlet); } } catch (Exception ex) { uiForm.log.error("Rendering " + uiForm.getParent() + " uicomponent fail: " + ex.getMessage() + "\n" + ex.getCause()); } } } } }