/* * 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.navigation; import java.io.StringWriter; import java.io.Writer; import java.lang.reflect.Constructor; import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import javax.portlet.MimeResponse; import javax.portlet.ResourceURL; import org.exoplatform.portal.application.PortalRequestContext; import org.exoplatform.portal.config.UserACL; import org.exoplatform.portal.config.UserPortalConfig; import org.exoplatform.portal.config.UserPortalConfigService; import org.exoplatform.portal.mop.SiteKey; import org.exoplatform.portal.mop.SiteType; import org.exoplatform.portal.mop.Visibility; import org.exoplatform.portal.mop.navigation.NavigationContext; 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.mop.user.UserPortalImpl; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.security.ConversationState; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.exoplatform.webui.application.WebuiRequestContext; /** * Created by The eXo Platform SAS * Author : Phan Le Thanh Chuong * chuong.phan@exoplatform.com, phan.le.thanh.chuong@gmail.com * Nov 21, 2008 */ public class NavigationUtils { public static final Scope ECMS_NAVIGATION_SCOPE = Scope.CHILDREN; private static ThreadLocal<Map<String, String>> gotNavigationKeeper = new ThreadLocal<Map<String, String>>(); private static Constructor<UserNavigation> userNavigationCtor = null; private static final Log LOG = ExoLogger.getLogger(NavigationUtils.class.getName()); static { try { //reflection here to get UserNavigation to avoid for using such as: //spaceNav = userPortal.getNavigation(SiteKey.group(groupId)); userNavigationCtor = UserNavigation.class.getDeclaredConstructor( new Class[] {UserPortalImpl.class, NavigationContext.class, boolean.class}); userNavigationCtor.setAccessible(true); }catch (Exception e) { if (LOG.isErrorEnabled()) { LOG.error(e); } } } //of static reflection public static boolean gotNavigation(String portal, String user) { return gotNavigation(portal, user, ""); } public static boolean gotNavigation(String portal, String user, String scope) { Map<String, String> navigations = gotNavigationKeeper.get(); if (navigations == null) return false; String navigation = navigations.get(portal + " " + user + " " + scope); return (navigation != null); } public static UserNavigation getUserNavigationOfPortal(UserPortal userPortal, String portalName) throws Exception { UserACL userACL = WCMCoreUtils.getService(UserACL.class); UserPortalConfigService userPortalConfigService = WCMCoreUtils.getService(UserPortalConfigService.class); NavigationContext portalNav = userPortalConfigService.getNavigationService(). loadNavigation(new SiteKey(SiteType.PORTAL, portalName)); if (portalNav ==null) { return null; } UserPortalConfig userPortalCfg = userPortalConfigService.getUserPortalConfig(portalName, ConversationState.getCurrent().getIdentity().getUserId(), PortalRequestContext.USER_PORTAL_CONTEXT); return userNavigationCtor.newInstance( userPortal, portalNav, userACL.hasEditPermission(userPortalCfg.getPortalConfig())); } /** * Get UserNavigation of a specified element * @param userPortal * @param siteKey Key * @return UserNavigation of group */ public static UserNavigation getUserNavigation(UserPortal userPortal, SiteKey siteKey) throws Exception { if (siteKey.getTypeName().equalsIgnoreCase(SiteType.PORTAL.getName())) { return getUserNavigationOfPortal(userPortal,siteKey.getName()); } UserACL userACL = WCMCoreUtils.getService(UserACL.class); UserPortalConfigService userPortalConfigService = WCMCoreUtils.getService(UserPortalConfigService.class); //userPortalConfigService.get NavigationContext portalNav = userPortalConfigService.getNavigationService(). loadNavigation(siteKey); if (portalNav == null) { return null; } else { return userNavigationCtor.newInstance(userPortal, portalNav, userACL.hasEditPermissionOnNavigation(siteKey)); } } public static void removeNavigationAsJson (String portalName, String username) throws Exception { for (String scope : new String[]{"single", "children", "grandchildren", "all"}) removeNavigationAsJson(portalName, username, scope); } public static void removeNavigationAsJson (String portalName, String username, String scope) throws Exception { String key = portalName + " " + username + " " + scope; Map<String, String> navigations = gotNavigationKeeper.get(); if (navigations != null) { navigations.remove(key); gotNavigationKeeper.set(navigations); } } public static String getNavigationAsJSON(String portalName, String username) throws Exception { return getNavigationAsJSON(portalName, username, null, ""); } public static String getNavigationAsJSON(String portalName, String username, Scope scope, String navigationScope) throws Exception { String key = portalName + " " + username + " " + navigationScope; Map<String, String> navigations = gotNavigationKeeper.get(); if (navigations == null) { navigations = new Hashtable<String, String>(); } else { String navigationData = navigations.get(key); if (navigationData != null) { return navigationData; } } UserPortalConfigService userPortalConfigService = WCMCoreUtils.getService(UserPortalConfigService.class); UserPortalConfig userPortalCfg = userPortalConfigService.getUserPortalConfig(portalName, username, PortalRequestContext.USER_PORTAL_CONTEXT); UserPortal userPortal = userPortalCfg.getUserPortal(); //filter nodes UserNodeFilterConfig.Builder filterConfigBuilder = UserNodeFilterConfig.builder(); filterConfigBuilder.withReadWriteCheck().withVisibility(Visibility.DISPLAYED, Visibility.TEMPORAL); filterConfigBuilder.withTemporalCheck(); UserNodeFilterConfig filterConfig = filterConfigBuilder.build(); //get nodes UserNavigation navigation = getUserNavigationOfPortal(userPortal, portalName); UserNode root = userPortal.getNode(navigation, scope == null ? ECMS_NAVIGATION_SCOPE : scope, filterConfig, null); String ret = createJsonTree(navigation, root); navigations.put(key, ret); gotNavigationKeeper.set(navigations); return ret; } private static String createJsonTree(UserNavigation navigation, UserNode rootNode) throws Exception { StringBuffer sbJsonTree = new StringBuffer(); sbJsonTree.append("["); sbJsonTree.append("{"); sbJsonTree.append("\"ownerId\":\"").append(navigation.getKey().getName()).append("\","); sbJsonTree.append("\"ownerType\":\"").append(navigation.getKey().getTypeName()).append("\","); sbJsonTree.append("\"priority\":\"").append(navigation.getPriority()).append("\","); sbJsonTree.append("\"nodes\":").append(addJsonNodes(rootNode.getChildren().iterator())); sbJsonTree.append("}"); sbJsonTree.append("]"); return sbJsonTree.toString(); } private static StringBuffer addJsonNodes(Iterator<UserNode> children) throws Exception { StringBuffer sbJsonTree = new StringBuffer(); sbJsonTree.append("["); boolean first = true; while (children.hasNext()) { UserNode child = children.next(); if (!first) { sbJsonTree.append(","); } first = false; sbJsonTree.append("{"); sbJsonTree.append("\"icon\":").append(child.getIcon() != null ? "\"" + child.getIcon() + "\"" : "null").append(","); sbJsonTree.append("\"label\":\"").append(child.getLabel()).append("\","); sbJsonTree.append("\"name\":\"").append(child.getName()).append("\","); sbJsonTree.append("\"resolvedLabel\":\"").append(child.getResolvedLabel()).append("\","); String childURI = ""; if (child.getPageRef() != null){ childURI = child.getURI(); } sbJsonTree.append("\"uri\":\"").append(childURI).append("\","); WebuiRequestContext context = WebuiRequestContext.getCurrentInstance(); MimeResponse res = context.getResponse(); ResourceURL resourceURL = res.createResourceURL(); resourceURL.setResourceID(res.encodeURL(child.getURI())); Writer w = new StringWriter(); resourceURL.write(w, true); sbJsonTree.append("\"getNodeURL\":\"").append(w.toString()).append("\","); sbJsonTree.append("\"nodes\":").append(addJsonNodes(child.getChildren().iterator())); sbJsonTree.append("}"); } sbJsonTree.append("]"); return sbJsonTree; } }