/* * Copyright (C) 2003-2009 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.wcm.webui.category; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.List; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.portlet.PortletPreferences; import javax.servlet.http.HttpServletRequestWrapper; import org.apache.commons.lang.StringUtils; import org.exoplatform.ecm.resolver.JCRResourceResolver; import org.exoplatform.ecm.webui.utils.Utils; import org.exoplatform.portal.mop.SiteType; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.resolver.ResourceResolver; import org.exoplatform.services.cms.impl.DMSConfiguration; import org.exoplatform.services.cms.taxonomy.TaxonomyService; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.wcm.friendly.FriendlyService; import org.exoplatform.services.wcm.portal.LivePortalManagerService; import org.exoplatform.web.url.navigation.NavigationResource; import org.exoplatform.web.url.navigation.NodeURL; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.application.portlet.PortletRequestContext; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIRightClickPopupMenu; import org.exoplatform.webui.core.UITree; /** * Created by The eXo Platform SAS * Author : eXoPlatform * chuong.phan@exoplatform.com, phan.le.thanh.chuong@gmail.com * Comment: Change objId from node's path to category's path * Jun 30, 2009 */ @ComponentConfig( events = @EventConfig(listeners = UITree.ChangeNodeActionListener.class) ) public class UICategoryNavigationTreeBase extends UITree { private static final Log LOG = ExoLogger.getLogger(UICategoryNavigationTreeBase.class.getName()); /* (non-Javadoc) * @see org.exoplatform.webui.core.UITree#renderNode(java.lang.Object) */ public String renderNode(Object obj) throws Exception { Node node = (Node) obj; String nodeTypeIcon = Utils.getNodeTypeIcon(node,"16x16Icon"); String nodeIcon = this.getExpandIcon(); String iconGroup = this.getIcon(); String note = "" ; if(isSelected(obj)) { nodeIcon = getColapseIcon(); iconGroup = getSelectedIcon(); note = " NodeSelected" ; } String beanIconField = getBeanIconField(); if(beanIconField != null && beanIconField.length() > 0) { if(getFieldValue(obj, beanIconField) != null) iconGroup = (String)getFieldValue(obj, beanIconField); } renderCategoryLink(node); String objId = String.valueOf(getId(obj)); StringBuilder builder = new StringBuilder(); if (nodeIcon.equals(getExpandIcon())) { builder.append(" <a class=\"") .append(nodeIcon) .append(" ") .append(nodeTypeIcon) .append("\" href=\"") .append(objId) .append("\">"); } else { builder.append(" <a class=\"") .append(nodeIcon) .append(" ") .append(nodeTypeIcon) .append("\" onclick=\"eXo.portal.UIPortalControl.collapseTree(this)") .append("\">"); } UIRightClickPopupMenu popupMenu = getUiPopupMenu(); String beanLabelField = getBeanLabelField(); String className="NodeIcon"; boolean flgSymlink = false; if (Utils.isSymLink(node)) { flgSymlink = true; className = "NodeIconLink"; } if (popupMenu == null) { builder.append(" <div class=\"") .append(className) .append(" ") .append(iconGroup) .append(" ") .append(nodeTypeIcon) .append(note) .append("\"") .append(" title=\"") .append(getFieldValue(obj, beanLabelField)) .append("\"") .append(">"); if (flgSymlink) { builder.append(" <div class=\"LinkSmall\">") .append(getFieldValue(obj, beanLabelField)) .append("</div>"); } else { builder.append(getFieldValue(obj, beanLabelField)); } builder.append("</div>"); } else { builder.append(" <div class=\"") .append(className) .append(" ") .append(iconGroup) .append(" ") .append(nodeTypeIcon) .append(note) .append("\" ") .append(popupMenu.getJSOnclickShowPopup(objId, null)) .append(" title=\"") .append(getFieldValue(obj, beanLabelField)) .append("\"") .append(">"); if (flgSymlink) { builder.append(" <div class=\"LinkSmall\">") .append(getFieldValue(obj, beanLabelField)) .append("</div>"); } else { builder.append(getFieldValue(obj, beanLabelField)); } builder.append("</div>"); } builder.append(" </a>"); return builder.toString(); } /* (non-Javadoc) * @see org.exoplatform.webui.core.UIComponent#getTemplate() */ public String getTemplate() { return UICategoryNavigationUtils.getPortletPreferences() .getValue(UICategoryNavigationConstant.PREFERENCE_TEMPLATE_PATH, null); } /* * (non-Javadoc) * @see * org.exoplatform.webui.core.UIComponent#getTemplateResourceResolver(org. * exoplatform.webui.application.WebuiRequestContext, java.lang.String) */ public ResourceResolver getTemplateResourceResolver(WebuiRequestContext context, String template) { DMSConfiguration dmsConfiguration = getApplicationComponent(DMSConfiguration.class); String workspace = dmsConfiguration.getConfig().getSystemWorkspace(); return new JCRResourceResolver(workspace); } /* (non-Javadoc) * @see org.exoplatform.webui.core.UITree#getActionLink() */ public String getActionLink() throws Exception { PortletRequestContext porletRequestContext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance(); HttpServletRequestWrapper requestWrapper = (HttpServletRequestWrapper) porletRequestContext.getRequest(); String requestURI = requestWrapper.getRequestURI(); PortletPreferences portletPreferences = UICategoryNavigationUtils.getPortletPreferences(); String preferenceTreeName = portletPreferences.getValue(UICategoryNavigationConstant.PREFERENCE_TREE_NAME, ""); String preferenceTargetPage = portletPreferences.getValue(UICategoryNavigationConstant.PREFERENCE_TARGET_PAGE, ""); String backPath = requestURI.substring(0, requestURI.lastIndexOf("/")); if (backPath.endsWith(preferenceTargetPage) || requestURI.endsWith(Util.getUIPortal().getSelectedUserNode().getURI())) backPath = "javascript:void(0)"; else if (backPath.endsWith(preferenceTreeName)) backPath = backPath.substring(0, backPath.lastIndexOf("/")); return backPath; } /* (non-Javadoc) * @see org.exoplatform.webui.core.UITree#isSelected(java.lang.Object) */ public boolean isSelected(Object obj) throws Exception { Node selectedNode = this.getSelected(); Node node = (Node) obj; if(selectedNode == null) return false; return selectedNode.getPath().equals(node.getPath()); } public boolean isMovedTreeToTrash(String rootCategory) throws Exception { Node categoryNode = getCategoryNode(rootCategory); if (Utils.isInTrash(categoryNode)) return true; return false; } /** * Gets the subcategories. * * @param categoryPath the category path * * @return the subcategories * * @throws Exception the exception */ public List<Node> getSubcategories(String categoryPath) throws Exception { Node categoryNode = getCategoryNode(categoryPath); NodeIterator nodeIterator = categoryNode.getNodes(); List<Node> subcategories = new ArrayList<Node>(); while (nodeIterator.hasNext()) { Node subcategory = nodeIterator.nextNode(); if (subcategory.isNodeType("exo:taxonomy")) subcategories.add(subcategory); } return subcategories; } /** * Resolve category path by uri. * * @param context the context * * @return the string */ public String resolveCategoryPathByUri(WebuiRequestContext context) throws Exception { String parameters = null; try { // parameters: Classic/News/France/Blah/Bom parameters = URLDecoder.decode(StringUtils.substringAfter(Util.getPortalRequestContext() .getNodePath(), Util.getUIPortal() .getSelectedUserNode() .getURI()), "UTF-8"); } catch (UnsupportedEncodingException e) { if (LOG.isWarnEnabled()) { LOG.warn(e.getMessage()); } } // categoryPath: /News/France/Blah/Bom String categoryPath = parameters.indexOf("/") >= 0 ? parameters.substring(parameters.indexOf("/")) : ""; String gpath = Util.getPortalRequestContext().getRequestParameter("path"); if (gpath != null) { PortletPreferences portletPreferences = UICategoryNavigationUtils.getPortletPreferences(); String preferenceTreeName = portletPreferences.getValue(UICategoryNavigationConstant.PREFERENCE_TREE_NAME, ""); categoryPath = gpath.substring(gpath.indexOf(preferenceTreeName) + preferenceTreeName.length()); } return categoryPath; } /** * Gets the categories by uri. * * @param categoryUri the category uri * * @return the categories by uri * * @throws Exception the exception */ public List<String> getCategoriesByUri(String categoryUri) throws Exception { PortletPreferences portletPreferences = UICategoryNavigationUtils.getPortletPreferences(); String preferenceTreeName = portletPreferences.getValue(UICategoryNavigationConstant.PREFERENCE_TREE_NAME, ""); if (preferenceTreeName.equals(categoryUri)) categoryUri = ""; // categories: {"/", "News", "News/France", "News/France/Blah", "News/France/Blah/Bom"} List<String> categories = new ArrayList<String>(); String[] tempCategories = categoryUri.split("/"); StringBuffer tempCategory = new StringBuffer(); for (int i = 0; i < tempCategories.length; i++) { if (i == 0) tempCategory = new StringBuffer(""); else if (i == 1) tempCategory = new StringBuffer(tempCategories[1]); else tempCategory.append("/").append(tempCategories[i]); categories.add(tempCategory.toString()); } return categories; } /** * Render category link. * * @param node the node * * @return the string * * @throws Exception the exception */ public String renderCategoryLink(Node node) throws Exception { // preferenceTargetPage: products/presentation/pclv PortletPreferences portletPreferences = UICategoryNavigationUtils.getPortletPreferences(); String preferenceTargetPage = portletPreferences.getValue(UICategoryNavigationConstant.PREFERENCE_TARGET_PAGE, ""); LivePortalManagerService livePortalManagerService = getApplicationComponent(LivePortalManagerService.class); Node portalNode = livePortalManagerService.getLivePortalByChild(node); String preferenceTreeName = portletPreferences.getValue(UICategoryNavigationConstant.PREFERENCE_TREE_NAME, ""); String categoryPath = node.getPath().replaceFirst(portalNode.getPath(), ""); // categoryPath = categoryPath.substring(categoryPath.indexOf(preferenceTreeName) + preferenceTreeName.length()); categoryPath = categoryPath.substring(categoryPath.indexOf(preferenceTreeName)-1); NodeURL nodeURL = Util.getPortalRequestContext().createURL(NodeURL.TYPE); NavigationResource resource = new NavigationResource(SiteType.PORTAL, Util.getPortalRequestContext() .getPortalOwner(), preferenceTargetPage); nodeURL.setResource(resource).setQueryParameterValue("path", categoryPath); String link = nodeURL.toString(); FriendlyService friendlyService = getApplicationComponent(FriendlyService.class); link = friendlyService.getFriendlyUri(link); return link; } /** * get content's title if exists (from exo:title property) * * @param node The node * @return the title * @throws Exception */ public String getTitle(Node node) throws Exception { if (node.hasProperty("exo:title")) return node.getProperty("exo:title").getString(); else return node.getName(); } public String getTreeTitle() { return UICategoryNavigationUtils.getPortletPreferences().getValue(UICategoryNavigationConstant.PREFERENCE_TREE_TITLE, ""); } private Node getCategoryNode(String categoryPath) throws Exception { TaxonomyService taxonomyService = getApplicationComponent(TaxonomyService.class); PortletPreferences portletPreferences = UICategoryNavigationUtils.getPortletPreferences(); String preferenceTreeName = portletPreferences.getValue(UICategoryNavigationConstant.PREFERENCE_TREE_NAME, ""); Node treeNode = taxonomyService.getTaxonomyTree(preferenceTreeName); Node categoryNode = null; if ("".equals(categoryPath)) categoryNode = treeNode; else categoryNode = treeNode.getNode(categoryPath); return categoryNode; } }