From: <jbo...@li...> - 2006-03-31 14:48:31
|
Author: adamw Date: 2006-03-31 09:48:09 -0500 (Fri, 31 Mar 2006) New Revision: 3367 Added: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/Entry.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/EntryFactory.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/FreezoneEntry.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/LinkEntry.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/Menu.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/PageEntry.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ProjectFreezoneEntry.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ProjectMenuEntry.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ProjectPageEntry.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ProjectsMenuEntry.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/SeparatorEntry.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/SpecialLinkEntry.java Removed: trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/Entry.java trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/Menu.java Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/elements/ElementDescriptor.java trunk/forge/portal-extensions/forge-freezone/src/java/org/jboss/forge/projects/freezone/Freezone.java trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/NavigationDescriptor.java trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/NavigationTools.java Log: http://jira.jboss.com/jira/browse/JBLAB-635 OO navigation Copied: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/Entry.java (from rev 3334, trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/Entry.java) =================================================================== --- trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/Entry.java 2006-03-29 13:27:21 UTC (rev 3334) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/Entry.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -0,0 +1,210 @@ +/* + * JBoss, Home of Professional Open Source + * Copyright 2005, JBoss Inc., and individual contributors as indicated + * by the @authors tag. See the copyright.txt in the distribution for a + * full listing of individual contributors. + * + * 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.jboss.forge.common.navigation; + +import java.util.HashSet; +import java.util.Set; + +import org.jboss.forge.common.ForgeHelper; +import org.jboss.forge.common.XmlTools; +import org.jboss.forge.common.Constants; +import org.jboss.portal.common.context.DelegateContext; +import org.jboss.portal.core.model.User; +import org.jboss.portlet.JBossRenderRequest; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/** + * A class representing a single menu entry. + * @author Adam Warski (ad...@as...) + */ +public abstract class Entry { + private final static String CONTENT_ATTRIBUTE = "content"; + private final static String DISPLAY_ATTRIBUTE = "display"; + + private final static String FOLDABLE_ATTRIBUTE = "foldable"; + private final static String PERMISSION_ATTRIBUTE = "permission"; + + public static String NO_PROJECT_PARAM = Constants.PARAM_NO_PROJECT + "=" + + Constants.TRUE_VALUE; + + /** + * Link held by this entry. + */ + private String link; + /** + * Display text of the link held by this entry. + */ + private String display; + + /** + * A sub-menu, or null, if no such menu is present. + */ + private Menu menu; + + /** + * True if sub-menu of this entry are foldable, + * that is, should be shown only when this entry is selected. + */ + private boolean foldable; + + /** + * Role that the user is required to have to display + * this entry, or null if + */ + private String permission; + + private String portalName; + + private Set<String> allLinks; + + public Entry(String portalName, Node root) { + this.portalName = portalName; + + allLinks = new HashSet<String>(); + + String content = XmlTools.getAttributeValue(root, CONTENT_ATTRIBUTE); + permission = XmlTools.getAttributeValue(root, PERMISSION_ATTRIBUTE); + display = XmlTools.getAttributeValue(root, DISPLAY_ATTRIBUTE); + foldable = Constants.TRUE_VALUE.equals( + XmlTools.getAttributeValue(root, FOLDABLE_ATTRIBUTE)); + + NodeList nodes = root.getChildNodes(); + + for (int i = 0; i < nodes.getLength(); i++) { + Node n = nodes.item(i); + + if ((n.getNodeType() == Node.ELEMENT_NODE) && + (Menu.MENU_ELEMENT.equals(n.getNodeName()))) { + // Creating a sub-menu. + menu = new Menu(portalName, n); + } + } + + if ((menu == null) && (content == null)) { + // The content hasn't been yet set, and it can be in the tag body. + content = XmlTools.unmarshallText(root); + } + + // Generating the link basing on the node's content and gathering + // information about links that are in this entry or below + // this entry. + link = generateLink(content); + + collectAllLinks(allLinks); + } + + /** + * To the given set, add all links that are in this or any of the sub-menus. + * @param toFill Set to fill. + */ + public void collectAllLinks(Set<String> toFill) { + // Adding the link that this menu represents. + toFill.add(link); + + // Adding links from the sub-menu, if one exists. + if (menu != null) { + menu.collectAllLinks(toFill); + } + } + + protected abstract String generateLink(String content); + + protected abstract void innerFillContext(JBossRenderRequest request, + DelegateContext context, String currentLink, + String projectId, String levelId); + + protected DelegateContext getNextEntryContext(DelegateContext context) { + return context.next("entries"); + } + + protected void setEntryTypeInContext(DelegateContext context, String type) { + context.put("type", type); + } + + protected void commonFillContext(JBossRenderRequest request, + DelegateContext context, String currentLink, + String projectId, String levelId) { + boolean selected = allLinks.contains(currentLink); + + if (selected) { + context.next("selected"); + } + + if (foldable) { + context.put("foldable", "true"); + } + + if ((menu != null) && ((foldable && selected) || (!foldable))) { + menu.fillContext(request, context, currentLink, projectId, levelId); + } + } + + public void fillContext(JBossRenderRequest request, + DelegateContext context, String currentLink, + String projectId, String levelId) { + if (permission != null) { + // Checking for role. + User user = request.getUser(); + + if ((user == null) || + (!user.getRoleNames().contains(permission))) + // The user doesn't have the given role. + return; + } + + innerFillContext(request, context, currentLink, projectId, levelId); + } + + protected String prepareLinkForContext(String link) { + if (link == null) + return link; + + // To each link, adding a noproject param, unless it's a project link. + if ((!link.contains(NO_PROJECT_PARAM)) && + (!ForgeHelper.isOutsideLink(link))) { + // Checking if this is a first parameter. + if (link.contains("?")) + return link + "&" + NO_PROJECT_PARAM; + else + return link + "?" + NO_PROJECT_PARAM; + } + + return link; + } + + /* + * GETTERS + */ + + protected String getLink() { + return link; + } + + protected String getDisplay() { + return display; + } + + protected String getPortalName() { + return portalName; + } +} Added: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/EntryFactory.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/EntryFactory.java 2006-03-31 12:45:14 UTC (rev 3366) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/EntryFactory.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -0,0 +1,62 @@ +package org.jboss.forge.common.navigation; + +import org.w3c.dom.Node; + +/** + * @author Adam Warski (ad...@as...) + */ +public class EntryFactory { + private final static String SEPARATOR = "separator"; + private final static String SPECIAL_LINK = "special-link"; + private final static String PROJECTS_MENU = "projects-menu"; + private final static String PROJECT_MENU = "project-menu"; + private final static String PAGE = "page"; + private final static String LINK = "link"; + private final static String FREEZONE = "freezone"; + + // This class cannot be instatiated. + private EntryFactory() { + + } + + public static Entry getEntry(String portalName, String type, + Node node, boolean project) { + if (PAGE.equals(type)) { + if (project) { + return new ProjectPageEntry(null, portalName, node); + } else { + return new PageEntry(portalName, node); + } + } + + if (LINK.equals(type)) { + return new LinkEntry(portalName, node); + } + + if (FREEZONE.equals(type)) { + if (project) { + return new ProjectFreezoneEntry(null, portalName, node); + } else { + return new FreezoneEntry(portalName, node); + } + } + + if (SEPARATOR.equals(type)) { + return new SeparatorEntry(portalName, node); + } + + if (SPECIAL_LINK.equals(type)) { + return new SpecialLinkEntry(portalName, node); + } + + if (PROJECTS_MENU.equals(type)) { + return new ProjectsMenuEntry(portalName, node); + } + + if (PROJECT_MENU.equals(type)) { + return new ProjectMenuEntry(portalName, node); + } + + return null; + } +} Added: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/FreezoneEntry.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/FreezoneEntry.java 2006-03-31 12:45:14 UTC (rev 3366) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/FreezoneEntry.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -0,0 +1,17 @@ +package org.jboss.forge.common.navigation; + +import org.w3c.dom.Node; +import org.jboss.forge.common.ForgeHelper; + +/** + * @author Adam Warski (ad...@as...) + */ +public class FreezoneEntry extends LinkEntry { + public FreezoneEntry(String portalName, Node root) { + super(portalName, root); + } + + protected String generateLink(String content) { + return ForgeHelper.createFreezonePageLink(getPortalName(), content); + } +} Added: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/LinkEntry.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/LinkEntry.java 2006-03-31 12:45:14 UTC (rev 3366) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/LinkEntry.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -0,0 +1,29 @@ +package org.jboss.forge.common.navigation; + +import org.w3c.dom.Node; +import org.jboss.portlet.JBossRenderRequest; +import org.jboss.portal.common.context.DelegateContext; + +/** + * @author Adam Warski (ad...@as...) + */ +public class LinkEntry extends Entry { + public LinkEntry(String portalName, Node root) { + super(portalName, root); + } + + protected String generateLink(String content) { + return content; + } + + protected void innerFillContext(JBossRenderRequest request, DelegateContext context, + String currentLink, String projectId, String levelId) { + DelegateContext toFill = getNextEntryContext(context); + + setEntryTypeInContext(toFill, "normal"); + toFill.put("link", prepareLinkForContext(getLink())); + toFill.put("display", getDisplay()); + + commonFillContext(request, toFill, currentLink, projectId, levelId); + } +} Copied: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/Menu.java (from rev 3334, trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/Menu.java) =================================================================== --- trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/Menu.java 2006-03-29 13:27:21 UTC (rev 3334) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/Menu.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -0,0 +1,120 @@ +/* + * JBoss, Home of Professional Open Source + * Copyright 2005, JBoss Inc., and individual contributors as indicated + * by the @authors tag. See the copyright.txt in the distribution for a + * full listing of individual contributors. + * + * 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.jboss.forge.common.navigation; + +import java.util.List; +import java.util.ArrayList; +import java.util.Set; +import java.util.HashSet; + +import org.jboss.portal.common.context.DelegateContext; +import org.jboss.portlet.JBossRenderRequest; +import org.jboss.forge.common.XmlTools; +import org.jboss.logging.Logger; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/** + * A class holding other menu entries. + * @author Adam Warski (ad...@as...) + */ +public class Menu { + private static final Logger log = Logger.getLogger(Menu.class); + + public final static String MENU_ELEMENT = "menu"; + + private final static String JSP_ATTRIBUTE = "jsp"; + + public final static String LEVEL_ATTRIBUTE = "level"; + + /** + * A list of entries in this menu. + */ + private List<Entry> entries; + /** + * A jsp page associated with this menu - should be set only if this is a + * top-level menu. + */ + private String jsp; + + private Set<String> allLinks; + + public Menu(String portalName, Node root) { + jsp = XmlTools.getAttributeValue(root, JSP_ATTRIBUTE); + + entries = new ArrayList<Entry>(); + + NodeList nodes = root.getChildNodes(); + + for (int i = 0; i < nodes.getLength(); i++) { + Node n = nodes.item(i); + + if (n.getNodeType() == Node.ELEMENT_NODE) { + // Trying to parse and add a new entry. + Entry e = EntryFactory.getEntry(portalName, n.getNodeName(), + n, false); + + if (e != null) { + entries.add(e); + } else { + log.warn("Unknown entry name: " + n.getNodeName()); + } + } + } + + allLinks = new HashSet<String>(); + collectAllLinks(allLinks); + } + + /** + * To the given set, add all links that are in this or any of the sub-menus. + * @param toFill Set to fill. + */ + public void collectAllLinks(Set<String> toFill) { + for (Entry e : entries) { + e.collectAllLinks(toFill); + } + } + + /** + * Fills the given context with menu information. + * @param request Request for which the context is to be filled. + * @param context Context to fill. + * @param currentLink Currently selected link. + * @param projectId + * @param levelId + */ + public void fillContext(JBossRenderRequest request, DelegateContext context, + String currentLink, String projectId, String levelId) { + for (Entry e : entries) { + e.innerFillContext(request, context, currentLink, projectId, levelId); + } + } + + public String getJsp() { + return jsp; + } + + public boolean containsLink(String link) { + return allLinks.contains(link); + } +} Added: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/PageEntry.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/PageEntry.java 2006-03-31 12:45:14 UTC (rev 3366) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/PageEntry.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -0,0 +1,17 @@ +package org.jboss.forge.common.navigation; + +import org.w3c.dom.Node; +import org.jboss.forge.common.ForgeHelper; + +/** + * @author Adam Warski (ad...@as...) + */ +public class PageEntry extends LinkEntry { + public PageEntry(String portalName, Node root) { + super(portalName, root); + } + + protected String generateLink(String content) { + return ForgeHelper.createPageLink(getPortalName(), content); + } +} Added: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ProjectFreezoneEntry.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ProjectFreezoneEntry.java 2006-03-31 12:45:14 UTC (rev 3366) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ProjectFreezoneEntry.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -0,0 +1,22 @@ +package org.jboss.forge.common.navigation; + +import org.w3c.dom.Node; +import org.jboss.forge.common.projects.ProjectsHelper; + +/** + * @author Adam Warski (ad...@as...) + */ +public class ProjectFreezoneEntry extends FreezoneEntry { + private String projectId; + + public ProjectFreezoneEntry(String portalName, String projectId, Node root) { + super(portalName, root); + + this.projectId = projectId; + } + + protected String generateLink(String content) { + return ProjectsHelper.createFreezonePageLink(getPortalName(), + projectId, content); + } +} Added: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ProjectMenuEntry.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ProjectMenuEntry.java 2006-03-31 12:45:14 UTC (rev 3366) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ProjectMenuEntry.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -0,0 +1,47 @@ +package org.jboss.forge.common.navigation; + +import org.w3c.dom.Node; +import org.jboss.portlet.JBossRenderRequest; +import org.jboss.portal.common.context.DelegateContext; +import org.jboss.forge.common.projects.Projects; +import org.jboss.forge.common.projects.ProjectsHelper; +import org.jboss.forge.common.projects.permissions.PermissionsChecker; +import org.jboss.forge.common.projects.permissions.RenderRequestPermissionsChecker; + +import java.util.Set; + +/** + * @author Adam Warski (ad...@as...) + */ +public class ProjectMenuEntry extends Entry { + public ProjectMenuEntry(String portalName, Node root) { + super(portalName, root); + } + + protected String generateLink(String content) { + return null; + } + + public void collectAllLinks(Set<String> toFill) { + // No links in a separator. + } + + protected void innerFillContext(JBossRenderRequest request, DelegateContext context, + String currentLink, String projectId, String levelId) { + if (projectId == null) { + // We can't display a null project ... + return; + } + + Projects projects = ProjectsHelper.getProjects(getPortalName()); + PermissionsChecker pc = new RenderRequestPermissionsChecker(request); + + DelegateContext prjContext = projects.getProjectContext(pc, projectId); + + DelegateContext toFill = getNextEntryContext(context); + setEntryTypeInContext(toFill, "project-menu"); + toFill.append("project-menu", prjContext); + + commonFillContext(request, toFill, currentLink, projectId, levelId); + } +} \ No newline at end of file Added: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ProjectPageEntry.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ProjectPageEntry.java 2006-03-31 12:45:14 UTC (rev 3366) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ProjectPageEntry.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -0,0 +1,22 @@ +package org.jboss.forge.common.navigation; + +import org.w3c.dom.Node; +import org.jboss.forge.common.projects.ProjectsHelper; + +/** + * @author Adam Warski (ad...@as...) + */ +public class ProjectPageEntry extends LinkEntry { + private String projectId; + + public ProjectPageEntry(String portalName, String projectId, Node root) { + super(portalName, root); + + this.projectId = projectId; + } + + protected String generateLink(String content) { + return ProjectsHelper.createPageLink(getPortalName(), + projectId, content); + } +} Added: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ProjectsMenuEntry.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ProjectsMenuEntry.java 2006-03-31 12:45:14 UTC (rev 3366) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/ProjectsMenuEntry.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -0,0 +1,62 @@ +package org.jboss.forge.common.navigation; + +import org.w3c.dom.Node; +import org.jboss.portlet.JBossRenderRequest; +import org.jboss.portal.common.context.DelegateContext; +import org.jboss.forge.common.projects.Projects; +import org.jboss.forge.common.projects.ProjectsHelper; +import org.jboss.forge.common.projects.permissions.PermissionsChecker; +import org.jboss.forge.common.projects.permissions.RenderRequestPermissionsChecker; +import org.jboss.forge.common.XmlTools; + +import java.util.Set; + +/** + * @author Adam Warski (ad...@as...) + */ +public class ProjectsMenuEntry extends Entry { + private final static String LEVEL_ATTRIBUTE = "level"; + private final static String CURRENT_LEVEL_ATTR_VALUE = "${selected}"; + + private String level; + private boolean selectedLevel; + + public ProjectsMenuEntry(String portalName, Node root) { + super(portalName, root); + + level = XmlTools.getAttributeValue(root, LEVEL_ATTRIBUTE); + selectedLevel = CURRENT_LEVEL_ATTR_VALUE.equals(level); + } + + protected String generateLink(String content) { + return null; + } + + public void collectAllLinks(Set<String> toFill) { + // No links in a separator. + } + + protected void innerFillContext(JBossRenderRequest request, DelegateContext context, + String currentLink, String projectId, String levelId) { + if (selectedLevel && (levelId == null)) { + // We can't display the current level if there is no level selected. + return; + } + + Projects projects = ProjectsHelper.getProjects(getPortalName()); + PermissionsChecker pc = new RenderRequestPermissionsChecker(request); + + DelegateContext prjContext = projects.getLevelContext(pc, + selectedLevel ? levelId : level); + + // Appending the project's context only if there are any projects + // in it. + if (prjContext.childIterator("projects").hasNext()) { + DelegateContext toFill = getNextEntryContext(context); + setEntryTypeInContext(toFill, "projects-menu"); + toFill.append("projects-menu", prjContext); + + commonFillContext(request, toFill, currentLink, projectId, levelId); + } + } +} Added: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/SeparatorEntry.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/SeparatorEntry.java 2006-03-31 12:45:14 UTC (rev 3366) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/SeparatorEntry.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -0,0 +1,29 @@ +package org.jboss.forge.common.navigation; + +import org.jboss.portlet.JBossRenderRequest; +import org.jboss.portal.common.context.DelegateContext; +import org.w3c.dom.Node; + +import java.util.Set; + +/** + * @author Adam Warski (ad...@as...) + */ +public class SeparatorEntry extends Entry { + public SeparatorEntry(String portalName, Node root) { + super(portalName, root); + } + + protected void innerFillContext(JBossRenderRequest request, DelegateContext context, + String currentLink, String projectId, String levelId) { + setEntryTypeInContext(getNextEntryContext(context), "separator"); + } + + public void collectAllLinks(Set<String> toFill) { + // No links in a separator. + } + + protected String generateLink(String content) { + return null; + } +} Added: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/SpecialLinkEntry.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/SpecialLinkEntry.java 2006-03-31 12:45:14 UTC (rev 3366) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/navigation/SpecialLinkEntry.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -0,0 +1,32 @@ +package org.jboss.forge.common.navigation; + +import org.w3c.dom.Node; +import org.jboss.portlet.JBossRenderRequest; +import org.jboss.portal.common.context.DelegateContext; +import org.jboss.forge.common.XmlTools; + +/** + * @author Adam Warski (ad...@as...) + */ +public class SpecialLinkEntry extends LinkEntry { + private final static String TYPE_ATTRIBUTE = "type"; + private final static String TYPE_LOGOUT = "logout"; + + private String type; + + public SpecialLinkEntry(String portalName, Node root) { + super(portalName, root); + + type = XmlTools.getAttributeValue(root, TYPE_ATTRIBUTE); + } + + protected void innerFillContext(JBossRenderRequest request, DelegateContext context, + String currentLink, String projectId, String levelId) { + if (TYPE_LOGOUT.equals(type)) { + if (request.getRemoteUser() != null) { + super.innerFillContext(request, context, currentLink, + projectId, levelId); + } + } + } +} Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/elements/ElementDescriptor.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/elements/ElementDescriptor.java 2006-03-31 12:45:14 UTC (rev 3366) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/elements/ElementDescriptor.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -306,7 +306,6 @@ // Checking if any of the required permissions are satisfied. for (String permission : properties.get(PROP_EDIT_PERM).getAllValues()) { - System.out.println("Checking perm ... " + permission + "; " + id); if (pc.hasPermission(permission)) { System.out.println("Found!"); return true; Modified: trunk/forge/portal-extensions/forge-freezone/src/java/org/jboss/forge/projects/freezone/Freezone.java =================================================================== --- trunk/forge/portal-extensions/forge-freezone/src/java/org/jboss/forge/projects/freezone/Freezone.java 2006-03-31 12:45:14 UTC (rev 3366) +++ trunk/forge/portal-extensions/forge-freezone/src/java/org/jboss/forge/projects/freezone/Freezone.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -36,8 +36,6 @@ import org.jboss.shotoku.aop.Inject; import org.jboss.shotoku.aop.CacheItem; import org.jboss.shotoku.exceptions.ResourceDoesNotExist; -import org.jboss.shotoku.exceptions.ResourceAlreadyExists; -import org.jboss.shotoku.exceptions.NameFormatException; import org.jboss.shotoku.exceptions.SaveException; import org.jboss.shotoku.tools.Tools; Deleted: trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/Entry.java =================================================================== --- trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/Entry.java 2006-03-31 12:45:14 UTC (rev 3366) +++ trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/Entry.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -1,275 +0,0 @@ -/* - * JBoss, Home of Professional Open Source - * Copyright 2005, JBoss Inc., and individual contributors as indicated - * by the @authors tag. See the copyright.txt in the distribution for a - * full listing of individual contributors. - * - * 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.jboss.forge.navigation; - -import java.util.HashSet; -import java.util.Set; - -import org.jboss.forge.common.ForgeHelper; -import org.jboss.forge.common.XmlTools; -import org.jboss.forge.common.projects.AbstractDescriptor; -import org.jboss.forge.common.projects.Projects; -import org.jboss.forge.common.projects.ProjectsHelper; -import org.jboss.forge.common.projects.permissions.PermissionsChecker; -import org.jboss.forge.common.projects.permissions.RenderRequestPermissionsChecker; -import org.jboss.portal.common.context.DelegateContext; -import org.jboss.portal.core.model.User; -import org.jboss.portlet.JBossRenderRequest; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -/** - * A class representing a single menu entry. - * @author Adam Warski (ad...@as...) - */ -public class Entry extends AbstractDescriptor { - private final static String LINK_ELEMENT = "link"; - private final static String DISPLAY_ELEMENT = "display"; - - private final static String SEPARATOR_ATTRIBUTE = "separator"; - private final static String FOLDABLE_ATTRIBUTE = "foldable"; - private final static String SPECIAL_LINK_ATTRIBUTE = "special-link"; - private final static String PROJECTS_MENU_ATTRIBUTE = "projects-menu"; - private final static String PROJECT_MENU_ATTRIBUTE = "project-menu"; - private final static String LEVEL_ATTRIBUTE = "level"; - private final static String PERMISSION_ATTRIBUTE = "permission"; - - private final static String TRUE_ATTR_VALUE = "true"; - private final static String CURRENT_LEVEL_ATTR_VALUE = "${selected}"; - - /** - * Link held by this entry. - */ - private String link; - /** - * Display text of the link held by this entry. - */ - private String display; - - /** - * A sub-menu, or null, if no such menu is present. - */ - private Menu menu; - - /** - * True if this entry is just a separator between menu groups. - */ - private boolean separator; - /** - * True if sub-menu of this entry are foldable, - * that is, should be shown only when this entry is selected. - */ - private boolean foldable; - /** - * True iff this entry is just a dummy entry - * for inserting a projects menu. - */ - private boolean projectsMenu; - /** - * True iff this entry is just a dummy entry - * for inserting a project menu. - */ - private boolean projectMenu; - /** - * Valid only if <code>projectsMenu == true</code>. - * Indicates the level of projects that should be shown. - */ - private String level; - /** - * Valid only if <code>projectsMenu == true</code>. - * Indicates if the <code>level</code> variable denotes a "selected" level. - */ - private boolean selectedLevel; - /** - * Name of a special link or null, if this entry - * is not a special link. - */ - private String specialLink; - /** - * Role that the user is required to have to display - * this entry, or null if - */ - private String permission; - - private String portalName; - - private Set<String> allLinks; - - public Entry(String portalName, Node root) { - allLinks = new HashSet<String>(); - this.portalName = portalName; - - separator = TRUE_ATTR_VALUE.equals( - XmlTools.getAttributeValue(root, SEPARATOR_ATTRIBUTE)); - - permission = XmlTools.getAttributeValue(root, PERMISSION_ATTRIBUTE); - - projectMenu = TRUE_ATTR_VALUE.equals( - XmlTools.getAttributeValue(root, PROJECT_MENU_ATTRIBUTE)); - - projectsMenu = TRUE_ATTR_VALUE.equals( - XmlTools.getAttributeValue(root, PROJECTS_MENU_ATTRIBUTE)); - - if (projectsMenu) { - level = XmlTools.getAttributeValue(root, LEVEL_ATTRIBUTE); - selectedLevel = CURRENT_LEVEL_ATTR_VALUE.equals(level); - } - - specialLink = XmlTools.getAttributeValue(root, SPECIAL_LINK_ATTRIBUTE); - foldable = TRUE_ATTR_VALUE.equals( - XmlTools.getAttributeValue(root, FOLDABLE_ATTRIBUTE)); - - NodeList nodes = root.getChildNodes(); - - for (int i = 0; i < nodes.getLength(); i++) { - Node n = nodes.item(i); - - if (n.getNodeType() == Node.ELEMENT_NODE) { - String nodeName = n.getNodeName(); - - if (LINK_ELEMENT.equals(nodeName)) { - link = ForgeHelper.createLink(portalName, n); - } else if (DISPLAY_ELEMENT.equals(nodeName)) { - display = XmlTools.unmarshallText(n); - } else if (Menu.MENU_ELEMENT.equals(nodeName)) { - // Creating a sub-menu. - menu = new Menu(portalName, n); - } - } - } - - // Gathering information about links that are in this entry or below - // this entry. - collectAllLinks(allLinks); - } - - /** - * To the given set, add all links that are in this or any of the sub-menus. - * @param toFill Set to fill. - */ - void collectAllLinks(Set<String> toFill) { - if (projectsMenu || projectMenu || separator) { - // No links for a project's menu or a separator. - return; - } - - // Adding the link that this menu represents. - toFill.add(link); - - // Adding links from the sub-menu, if one exists. - if (menu != null) { - menu.collectAllLinks(toFill); - } - } - - void fillContext(JBossRenderRequest request, DelegateContext context, String currentLink, - String projectId, String levelId) { - if (specialLink != null) { - // Checking if we can show this link. - if ("logout".equals(specialLink)) { - if (request.getRemoteUser() == null) - return; - } else - // Unsupported special link. - return; - } - - if (permission != null) { - // Checking for role. - User user = request.getUser(); - - if ((user == null) || - (!user.getRoleNames().contains(permission))) - // The user doesn't have the given role. - return; - } - - if (projectsMenu) { - if (selectedLevel && (levelId == null)) { - // We can't display the current level if there is no level selected. - return; - } - - Projects projects = ProjectsHelper.getProjects(portalName); - PermissionsChecker pc = new RenderRequestPermissionsChecker(request); - - DelegateContext prjContext = projects.getLevelContext(pc, - selectedLevel ? levelId : level); - - // Appending the project's context only if there are any projects - // in it. - if (prjContext.childIterator("projects").hasNext()) { - DelegateContext toFill = context.next("entries"); - toFill.append("projects-menu", prjContext); - toFill.put("type", "projects-menu"); - - if (foldable) { - toFill.put("foldable", "true"); - } - } - - return; - } - - if (projectMenu) { - if (projectId == null) { - // We can't display a null project ... - return; - } - - Projects projects = ProjectsHelper.getProjects(portalName); - PermissionsChecker pc = new RenderRequestPermissionsChecker(request); - - DelegateContext prjContext = projects.getProjectContext(pc, projectId); - - DelegateContext toFill = context.next("entries"); - toFill.append("project-menu", prjContext); - toFill.put("type", "project-menu"); - - return; - } - - // Creating a context that will be filled, now that we know that we do - // add a new entry. - DelegateContext toFill = context.next("entries"); - - if (separator) { - toFill.put("type", "separator"); - return; - } - - toFill.put("type", "normal"); - - boolean selected = allLinks.contains(currentLink); - - if (selected) { - toFill.next("selected"); - } - - toFill.put("link", NavigationTools.prepareLinkForDisplay(link)); - toFill.put("display", display); - - if ((menu != null) && ((foldable && selected) || (!foldable))) { - menu.fillContext(request, toFill, currentLink, projectId, levelId); - } - } -} Deleted: trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/Menu.java =================================================================== --- trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/Menu.java 2006-03-31 12:45:14 UTC (rev 3366) +++ trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/Menu.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -1,111 +0,0 @@ -/* - * JBoss, Home of Professional Open Source - * Copyright 2005, JBoss Inc., and individual contributors as indicated - * by the @authors tag. See the copyright.txt in the distribution for a - * full listing of individual contributors. - * - * 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.jboss.forge.navigation; - -import java.util.List; -import java.util.ArrayList; -import java.util.Set; -import java.util.HashSet; - -import org.jboss.portal.common.context.DelegateContext; -import org.jboss.portlet.JBossRenderRequest; -import org.jboss.forge.common.XmlTools; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -/** - * A class holding other menu entries. - * @author Adam Warski (ad...@as...) - */ -public class Menu { - final static String MENU_ELEMENT = "menu"; - private final static String ENTRY_ELEMENT = "entry"; - - private final static String JSP_ATTRIBUTE = "jsp"; - final static String LEVEL_ATTRIBUTE = "level"; - - /** - * A list of entries in this menu. - */ - private List<Entry> entries; - /** - * A jsp page associated with this menu - should be set only if this is a - * top-level menu. - */ - private String jsp; - - private Set<String> allLinks; - - public Menu(String portalName, Node root) { - jsp = XmlTools.getAttributeValue(root, JSP_ATTRIBUTE); - - entries = new ArrayList<Entry>(); - - NodeList nodes = root.getChildNodes(); - - for (int i = 0; i < nodes.getLength(); i++) { - Node n = nodes.item(i); - - if ((n.getNodeType() == Node.ELEMENT_NODE) - && (n.getNodeName().equals(ENTRY_ELEMENT))) { - // Parsing and adding a new entry. - entries.add(new Entry(portalName, n)); - } - } - - allLinks = new HashSet<String>(); - collectAllLinks(allLinks); - } - - /** - * To the given set, add all links that are in this or any of the sub-menus. - * @param toFill Set to fill. - */ - void collectAllLinks(Set<String> toFill) { - for (Entry e : entries) { - e.collectAllLinks(toFill); - } - } - - /** - * Fills the given context with menu information. - * @param request Request for which the context is to be filled. - * @param context Context to fill. - * @param currentLink Currently selected link. - * @param projectId - * @param levelId - */ - void fillContext(JBossRenderRequest request, DelegateContext context, - String currentLink, String projectId, String levelId) { - for (Entry e : entries) { - e.fillContext(request, context, currentLink, projectId, levelId); - } - } - - String getJsp() { - return jsp; - } - - boolean containsLink(String link) { - return allLinks.contains(link); - } -} Modified: trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/NavigationDescriptor.java =================================================================== --- trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/NavigationDescriptor.java 2006-03-31 12:45:14 UTC (rev 3366) +++ trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/NavigationDescriptor.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -28,6 +28,7 @@ import org.jboss.forge.common.ForgeHelper; import org.jboss.forge.common.Constants; import org.jboss.forge.common.XmlTools; +import org.jboss.forge.common.navigation.Menu; import org.jboss.forge.common.projects.ProjectsHelper; import org.jboss.forge.common.projects.Projects; import org.jboss.forge.common.projects.permissions.PermissionsChecker; Modified: trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/NavigationTools.java =================================================================== --- trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/NavigationTools.java 2006-03-31 12:45:14 UTC (rev 3366) +++ trunk/forge/portal-extensions/forge-navigation/src/java/org/jboss/forge/navigation/NavigationTools.java 2006-03-31 14:48:09 UTC (rev 3367) @@ -23,6 +23,7 @@ import org.jboss.forge.common.Constants; import org.jboss.forge.common.ForgeHelper; +import org.jboss.forge.common.navigation.Entry; import org.jboss.shotoku.aop.CacheItem; /** @@ -49,26 +50,6 @@ return conf.get(portalName); } - private static String NO_PROJECT_PARAM = Constants.PARAM_NO_PROJECT + "=" + - Constants.TRUE_VALUE; - - static String prepareLinkForDisplay(String link) { - if (link == null) - return link; - - // To each link, adding a noproject param, unless it's a project link. - if ((!link.contains(NO_PROJECT_PARAM)) && - (!ForgeHelper.isOutsideLink(link))) { - // Checking if this is a first parameter. - if (link.contains("?")) - return link + "&" + NO_PROJECT_PARAM; - else - return link + "?" + NO_PROJECT_PARAM; - } - - return link; - } - static String prepareLinkForChecking(String portalName, String link) { if (link == null) return link; @@ -80,9 +61,9 @@ // Deleting the noproject parameter, as it is not present in the generated links. // There are three possibilites: it is the first parameter and there are no more // parameters, there are more parameters, or it is a not-first parameter. - link = link.replace("?" + NO_PROJECT_PARAM + "&", "?"); - link = link.replace("?" + NO_PROJECT_PARAM, ""); - link = link.replace("&" + NO_PROJECT_PARAM, ""); + link = link.replace("?" + Entry.NO_PROJECT_PARAM + "&", "?"); + link = link.replace("?" + Entry.NO_PROJECT_PARAM, ""); + link = link.replace("&" + Entry.NO_PROJECT_PARAM, ""); return link; } |