/** * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.portal.webui.navigation; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import org.exoplatform.portal.mop.SiteType; import org.exoplatform.portal.mop.Visibility; import org.exoplatform.portal.mop.navigation.NodeChange; import org.exoplatform.portal.mop.navigation.NodeChangeQueue; import org.exoplatform.portal.mop.navigation.Scope; import org.exoplatform.portal.mop.user.UserNavigation; import org.exoplatform.portal.mop.user.UserNode; import org.exoplatform.portal.mop.user.UserNodeFilterConfig; import org.exoplatform.portal.mop.user.UserPortal; import org.exoplatform.portal.webui.portal.UIPortal; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.core.UIComponent; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; /** * Created by The eXo Platform SARL Author : Dang Van Minh minhdv81@yahoo.com Jul 12, 2006 */ public class UIPortalNavigation extends UIComponent { private boolean useAJAX = true; private boolean showUserNavigation = true; private TreeNode treeNode_; private String cssClassName = ""; private String template; private final UserNodeFilterConfig NAVIGATION_FILTER_CONFIG; private Scope navigationScope; private Log log = ExoLogger.getExoLogger(UIPortalNavigation.class); public UIPortalNavigation() { UserNodeFilterConfig.Builder filterConfigBuilder = UserNodeFilterConfig.builder(); filterConfigBuilder.withReadWriteCheck().withVisibility(Visibility.DISPLAYED, Visibility.TEMPORAL); filterConfigBuilder.withTemporalCheck(); NAVIGATION_FILTER_CONFIG = filterConfigBuilder.build(); } @Override public String getTemplate() { return template != null ? template : super.getTemplate(); } public void setTemplate(String template) { this.template = template; } public UIComponent getViewModeUIComponent() { return null; } public void setUseAjax(boolean bl) { useAJAX = bl; } public boolean isUseAjax() { return useAJAX; } public boolean isShowUserNavigation() { return showUserNavigation; } public void setShowUserNavigation(boolean showUserNavigation) { this.showUserNavigation = showUserNavigation; } public void setCssClassName(String cssClassName) { this.cssClassName = cssClassName; } public String getCssClassName() { return cssClassName; } public List<UserNode> getNavigations() throws Exception { WebuiRequestContext context = WebuiRequestContext.getCurrentInstance(); List<UserNode> nodes = new ArrayList<UserNode>(); if (context.getRemoteUser() != null) { UserNode currRootNode = getCurrentNavigation(); if (currRootNode != null) { nodes.add(currRootNode); } } else { UserPortal userPortal = Util.getPortalRequestContext().getUserPortalConfig().getUserPortal(); List<UserNavigation> navigations = userPortal.getNavigations(); for (UserNavigation userNav : navigations) { if (!showUserNavigation && userNav.getKey().getType().equals(SiteType.USER)) { continue; } UserNode rootNode = userPortal.getNode(userNav, navigationScope, NAVIGATION_FILTER_CONFIG, null); if (rootNode != null) { nodes.add(rootNode); } } } return nodes; } public void loadTreeNodes() throws Exception { treeNode_ = new TreeNode(); UserPortal userPortal = Util.getPortalRequestContext().getUserPortalConfig().getUserPortal(); List<UserNavigation> listNavigations = userPortal.getNavigations(); List<UserNode> childNodes = new LinkedList<UserNode>(); for (UserNavigation nav : rearrangeNavigations(listNavigations)) { if (!showUserNavigation && nav.getKey().getType().equals(SiteType.USER)) { continue; } try { UserNode rootNode = userPortal.getNode(nav, navigationScope, NAVIGATION_FILTER_CONFIG, null); if (rootNode != null) { childNodes.addAll(rootNode.getChildren()); } } catch (Exception ex) { log.error(ex.getMessage(), ex); } } treeNode_.setChildren(childNodes); } public UserNode resolvePath(String path) throws Exception { WebuiRequestContext context = WebuiRequestContext.getCurrentInstance(); UserPortal userPortal = Util.getPortalRequestContext().getUserPortalConfig().getUserPortal(); UserNode node; if (context.getRemoteUser() != null) { node = userPortal.resolvePath(Util.getUIPortal().getUserNavigation(), NAVIGATION_FILTER_CONFIG, path); } else { node = userPortal.resolvePath(NAVIGATION_FILTER_CONFIG, path); } if (node != null && !node.getURI().equals(path)) { // Node has been deleted return null; } return updateNode(node); } public UserNode updateNode(UserNode node) { if (node == null) { return null; } UserPortal userPortal = Util.getPortalRequestContext().getUserPortalConfig().getUserPortal(); NodeChangeQueue<UserNode> queue = new NodeChangeQueue<UserNode>(); userPortal.updateNode(node, navigationScope, queue); for (NodeChange<UserNode> change : queue) { if (change instanceof NodeChange.Removed) { UserNode deletedNode = ((NodeChange.Removed<UserNode>) change).getTarget(); if (hasRelationship(deletedNode, node)) { // Node has been deleted return null; } } } return node; } private boolean hasRelationship(UserNode parent, UserNode userNode) { if (parent.getId().equals(userNode.getId())) { return true; } for (UserNode child : parent.getChildren()) { if (hasRelationship(child, userNode)) { return true; } } return false; } /** * * @param listNavigation * @return */ private List<UserNavigation> rearrangeNavigations(List<UserNavigation> listNavigation) { List<UserNavigation> returnNavs = new ArrayList<UserNavigation>(); List<UserNavigation> portalNavs = new ArrayList<UserNavigation>(); List<UserNavigation> groupNavs = new ArrayList<UserNavigation>(); List<UserNavigation> userNavs = new ArrayList<UserNavigation>(); for (UserNavigation nav : listNavigation) { SiteType siteType = nav.getKey().getType(); switch (siteType) { case PORTAL: portalNavs.add(nav); break; case GROUP: groupNavs.add(nav); break; case USER: userNavs.add(nav); break; } } returnNavs.addAll(portalNavs); returnNavs.addAll(groupNavs); returnNavs.addAll(userNavs); return returnNavs; } public TreeNode getTreeNodes() { return treeNode_; } public UserNode getSelectedNode() throws Exception { UIPortal uiPortal = Util.getUIPortal(); if (uiPortal != null) { return uiPortal.getSelectedUserNode(); } return null; } private UserNode getCurrentNavigation() throws Exception { UserPortal userPortal = Util.getPortalRequestContext().getUserPortalConfig().getUserPortal(); UserNavigation userNavigation = Util.getUIPortal().getUserNavigation(); try { UserNode rootNode = userPortal.getNode(userNavigation, navigationScope, NAVIGATION_FILTER_CONFIG, null); return rootNode; } catch (Exception ex) { log.error("Navigation has been deleted"); } return null; } public void setScope(Scope scope) { this.navigationScope = scope; } public static class CollapseNodeActionListener extends EventListener<UIPortalNavigation> { public void execute(Event<UIPortalNavigation> event) throws Exception { // get URI String treePath = event.getRequestContext().getRequestParameter(OBJECTID); UIPortalNavigation uiNavigation = event.getSource(); TreeNode rootNode = uiNavigation.getTreeNodes(); TreeNode collapseTree = rootNode.findNodes(treePath); if (collapseTree != null) { collapseTree.setExpanded(false); } Util.getPortalRequestContext().setResponseComplete(true); } } public static class CollapseAllNodeActionListener extends EventListener<UIPortalNavigation> { public void execute(Event<UIPortalNavigation> event) throws Exception { UIPortalNavigation uiNavigation = event.getSource(); uiNavigation.loadTreeNodes(); event.getRequestContext().addUIComponentToUpdateByAjax(uiNavigation); } } }