/* * Copyright (C) 2003-2012 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.exoplatform.wcm.connector.collaboration; import java.util.Iterator; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.dom.DOMSource; import org.exoplatform.portal.application.PortalRequestContext; import org.exoplatform.portal.config.UserPortalConfig; import org.exoplatform.portal.config.UserPortalConfigService; import org.exoplatform.portal.mop.SiteKey; import org.exoplatform.portal.mop.Visibility; 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.services.rest.resource.ResourceContainer; import org.exoplatform.services.security.ConversationState; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * Created by The eXo Platform SAS * Author : Nguyen The Vinh From ECM Of eXoPlatform * vinh_nguyen@exoplatform.com * 29 May 2012 */ @Path("/content/") public class NavigationConnector implements ResourceContainer{ private static ThreadLocal<Boolean> gotNavigationKeeper = new ThreadLocal<Boolean>(); /** * Return a JsonString include all navigation node * * @param portalName: Destination portal to get the navigation tree * @return * @throws Exception */ @GET @Path("/getFullNavigation/") public Response getFullNavigation ( @QueryParam("portalName") String portalName) throws Exception { String userName = ConversationState.getCurrent().getIdentity().getUserId(); Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); Element element = document.createElement("navigationXML"); element.setTextContent(getNavigationAsJSON(portalName, userName)); document.appendChild(element); return Response.ok(new DOMSource(document), MediaType.TEXT_XML).build(); } private String getNavigationAsJSON(String portalName, String username) throws Exception { 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 = userPortal.getNavigation(SiteKey.portal(portalName)); UserNode root = userPortal.getNode(navigation, Scope.ALL, filterConfig, null); //set gotNavigation=true gotNavigationKeeper.set(true); return createJsonTree(navigation, root); } /** * Return a JsonString include all navigation node, serve for getNavigationAsJSON method * * @param navigation: Navigation information to create Json tree * @param rootNode : Root node of navigation * @return A String as Json tree * @throws Exception */ private 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(); } /** * Build JsonTree for children nodes of navigation * * @param children * @return StringBuffer contain Json tree of children */ private StringBuffer addJsonNodes(Iterator<UserNode> children) { StringBuffer sbJsonTree = new StringBuffer(); String resovleLabel = ""; 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("\","); try { resovleLabel = child.getResolvedLabel(); } catch (NullPointerException npe) { resovleLabel = ""; } sbJsonTree.append("\"resolvedLabel\":\"").append(resovleLabel).append("\","); sbJsonTree.append("\"uri\":\"").append(child.getURI()).append("\","); sbJsonTree.append("\"getNodeURL\":\"").append(child.getURI().toString()).append("\","); sbJsonTree.append("\"nodes\":").append(addJsonNodes(child.getChildren().iterator())); sbJsonTree.append("}"); } sbJsonTree.append("]"); return sbJsonTree; } }