/* * Copyright (C) 2003-2008 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.services.wcm.publication.lifecycle.stageversion.ui; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle; import org.apache.commons.lang.StringUtils; import org.exoplatform.portal.mop.user.UserNavigation; import org.exoplatform.portal.mop.user.UserNode; import org.exoplatform.portal.mop.user.UserPortal; import org.exoplatform.portal.webui.container.UIContainer; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.portal.webui.workspace.UIPortalApplication; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.resources.LocaleConfig; import org.exoplatform.services.resources.LocaleConfigService; import org.exoplatform.services.wcm.core.WCMService; import org.exoplatform.services.wcm.navigation.NavigationUtils; import org.exoplatform.services.wcm.publication.lifecycle.stageversion.ui.UIPublicationTree.TreeNode; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.lifecycle.Lifecycle; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; /** * Created by The eXo Platform SAS Author : Hoa Pham hoa.pham@exoplatform.com * Sep 9, 2008 */ @ComponentConfig(lifecycle = Lifecycle.class, template = "classpath:groovy/wcm/webui/publication/lifecycle/stageversion/ui/UIPortalNavigationExplorer.gtmpl", events = { @EventConfig(listeners = UIPortalNavigationExplorer.ChangeNodeActionListener.class) }) public class UIPortalNavigationExplorer extends UIContainer { /** The portal name. */ private String portalName; /** The running portals. */ private List<String> runningPortals = new ArrayList<String>(); /** The current node. */ private TreeNode currentNode = null; /** * Instantiates a new uI portal navigation explorer. * * @throws Exception the exception */ public UIPortalNavigationExplorer() throws Exception { } /** * Inits the. * * @param portalName the portal name * @param runningPortals the running portals * * @throws Exception the exception */ public void init(String portalName, List<String> runningPortals) throws Exception { this.portalName = portalName; this.runningPortals = runningPortals; List<TreeNode> list = new ArrayList<TreeNode>(); UIPortalApplication portalApplication = Util.getUIPortalApplication(); LocaleConfig localeConfig = getApplicationComponent(LocaleConfigService.class). getLocaleConfig(portalApplication.getLocale().getLanguage()); WCMService wcmService = getApplicationComponent(WCMService.class); SessionProvider sessionProvider =WCMCoreUtils.getSystemSessionProvider(); if (wcmService.isSharedPortal(sessionProvider, portalName)) { UIPublicationTree tree = addChild(UIPublicationTree.class, null, "UIPortalTree"); for (String portal : this.runningPortals) { UserPortal userPortal = Util.getPortalRequestContext().getUserPortalConfig().getUserPortal(); UserNavigation userNavigation = NavigationUtils.getUserNavigationOfPortal(userPortal, portalName); UserNode userNode = userPortal.getNode(userNavigation, NavigationUtils.ECMS_NAVIGATION_SCOPE, null, null); ResourceBundle res = localeConfig.getNavigationResourceBundle(userNavigation.getKey().getTypeName(), userNavigation.getKey().getName()); TreeNode treeNode = new TreeNode(portal, userNavigation, res, false); if (userNode != null) treeNode.setChildrenByUserNodes(userNode.getChildren()); list.add(treeNode); } tree.setSibbling(list); tree.setBeanIdField("uri"); tree.setBeanLabelField("resolvedLabel"); tree.setIcon("DefaultPageIcon"); tree.setSelectedIcon("DefaultPageIcon"); } else { UIPublicationTree tree = addChild(UIPublicationTree.class, null, "UIPageNodeTree"); UserPortal userPortal = Util.getPortalRequestContext().getUserPortalConfig().getUserPortal(); UserNavigation userNavigation = NavigationUtils.getUserNavigationOfPortal(userPortal, portalName); UserNode userNode = userPortal.getNode(userNavigation, NavigationUtils.ECMS_NAVIGATION_SCOPE, null, null); ResourceBundle res = localeConfig.getNavigationResourceBundle(userNavigation.getKey().getTypeName(), userNavigation.getKey().getName()); TreeNode treeNode = new TreeNode(portalName, userNavigation, res, true); if(userNode != null) treeNode.setChildrenByUserNodes(userNode.getChildren()); tree.setSibbling(treeNode.getTreeNodeChildren()); tree.setBeanIdField("uri"); tree.setBeanLabelField("resolvedLabel"); tree.setIcon("DefaultPageIcon"); tree.setSelectedIcon("DefaultPageIcon"); } } /** * Select tree node by uri. * * @param uri the uri * * @throws Exception the exception */ @SuppressWarnings("unchecked") public void selectTreeNodeByUri(String uri) throws Exception { UIPublicationTree tree = getChild(UIPublicationTree.class); if (currentNode == null) { List<TreeNode> sibbling = (List<TreeNode>) tree.getSibbling(); for (TreeNode childNode : sibbling) { if (childNode.getUri().equals(uri)) { currentNode = childNode; break; } } tree.setSelected(currentNode); List<TreeNode> listChildNode = currentNode.getTreeNodeChildren(); tree.setChildren(listChildNode); tree.setParentSelected(null); tree.setSibbling(sibbling); return; } if (tree.getId().equals("UIPortalTree")) { if (!uri.startsWith(currentNode.getUri())) { List<TreeNode> sibbling = (List<TreeNode>) tree.getSibbling(); for (TreeNode childNode : sibbling) { if (childNode.getUri().equals(uri)) { currentNode = childNode; break; } } tree.setSelected(currentNode); List<TreeNode> listChildNode = currentNode.getTreeNodeChildren(); tree.setChildren(listChildNode); tree.setParentSelected(null); tree.setSibbling(sibbling); } } TreeNode selected = currentNode.searchTreeNodeByURI(uri); if (selected == null) return; String parentURI = StringUtils.substringBeforeLast(uri, "/"); TreeNode parent = currentNode.searchTreeNodeByURI(parentURI); if (!selected.isPageNode()) { if (!tree.getId().equals("UIPortalTree")) return; List<TreeNode> list = new ArrayList<TreeNode>(); for (String portal : this.runningPortals) { UserPortal userPortal = Util.getPortalRequestContext().getUserPortalConfig().getUserPortal(); UserNavigation userNavigation = NavigationUtils.getUserNavigationOfPortal(userPortal, portalName); UserNode userNode = userPortal.getNode(userNavigation, NavigationUtils.ECMS_NAVIGATION_SCOPE, null, null); UIPortalApplication portalApplication = Util.getUIPortalApplication(); LocaleConfig localeConfig = getApplicationComponent(LocaleConfigService.class). getLocaleConfig(portalApplication.getLocale().getLanguage()); ResourceBundle res = localeConfig.getNavigationResourceBundle(userNavigation.getKey().getTypeName(), userNavigation.getKey().getName()); TreeNode treeNode = new TreeNode(portal, userNavigation, res, false); if(userNode != null) treeNode.setChildrenByUserNodes(userNode.getChildren()); list.add(treeNode); } tree.setSibbling(list); tree.setSelected(selected); List<TreeNode> listChildNode = selected.getTreeNodeChildren(); if (listChildNode == null) tree.setChildren(null); tree.setChildren(listChildNode); tree.setParentSelected(null); currentNode = selected; return; } if (parent.isPageNode()) { tree.setSelected(selected); tree.setChildren(selected.getTreeNodeChildren()); tree.setParentSelected(parent); List<TreeNode> sibling = parent.getTreeNodeChildren(); if (sibling != null) tree.setSibbling(sibling); currentNode = selected; } else if (!parent.isPageNode()) { tree.setSelected(selected); tree.setChildren(selected.getTreeNodeChildren()); currentNode = selected; tree.setParentSelected(parent); List<TreeNode> sibbling = parent.getTreeNodeChildren(); if (sibbling != null) tree.setSibbling(sibbling); } } /** * The listener interface for receiving changeNodeAction events. The class * that is interested in processing a changeNodeAction event implements this * interface, and the object created with that class is registered with a * component using the component's * <code>addChangeNodeActionListener</code> method. When * the changeNodeAction event occurs, that object's appropriate * method is invoked. */ public static class ChangeNodeActionListener extends EventListener<UIPortalNavigationExplorer> { /* * (non-Javadoc) * @see * org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui * .event.Event) */ public void execute(Event<UIPortalNavigationExplorer> event) throws Exception { String uri = event.getRequestContext().getRequestParameter(OBJECTID); UIPortalNavigationExplorer portalNavigationExplorer = event.getSource(); portalNavigationExplorer.selectTreeNodeByUri(uri); UIPublicationContainer publicationContainer = portalNavigationExplorer. getAncestorOfType(UIPublicationContainer.class); UIPublicationPagesContainer publicationPagesContainer = portalNavigationExplorer. getAncestorOfType(UIPublicationPagesContainer.class); publicationContainer.setActiveTab(publicationPagesContainer, event.getRequestContext()); } } /** * Gets the selected node. * * @return the selected node */ public TreeNode getSelectedNode() { return currentNode; } /** * Sets the selected node. * * @param selectedNode the new selected node */ public void setSelectedNode(TreeNode selectedNode) { this.currentNode = selectedNode; } }