Author: rwatler Date: Tue Dec 22 20:51:45 2009 New Revision: 893311 URL: http://svn.apache.org/viewvc?rev=893311&view=rev Log: add '@0', '@1'..'@N', and '@$' current path patterns support for menu options: used to make menu options relative to current portal page path
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/main/java/org/apache/jetspeed/portalsite/impl/MenuImpl.java portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/main/java/org/apache/jetspeed/portalsite/view/SiteView.java portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/test/java/org/apache/jetspeed/portalsite/TestPortalSite.java portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/test/resources/webapp/WEB-INF/pages/folder.metadata Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/main/java/org/apache/jetspeed/portalsite/impl/MenuImpl.java URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/main/java/org/apache/jetspeed/portalsite/impl/MenuImpl.java?rev=893311&r1=893310&r2=893311&view=diff ============================================================================== --- portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/main/java/org/apache/jetspeed/portalsite/impl/MenuImpl.java (original) +++ portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/main/java/org/apache/jetspeed/portalsite/impl/MenuImpl.java Tue Dec 22 20:51:45 2009 @@ -166,7 +166,7 @@ } // set relative element flag if options path is relative - this.elementRelative = (this.elementRelative || !options.startsWith(Folder.PATH_SEPARATOR)); + this.elementRelative = (this.elementRelative || !options.startsWith(Folder.PATH_SEPARATOR) || options.contains(SiteView.ALT_CURRENT_PAGE_PATH)); } // menu defined only with menu definition options @@ -632,7 +632,7 @@ } // set relative element flag if path is relative - elementRelative = (elementRelative || !optionPath.startsWith(Folder.PATH_SEPARATOR)); + elementRelative = (elementRelative || !optionPath.startsWith(Folder.PATH_SEPARATOR) || options.contains(SiteView.ALT_CURRENT_PAGE_PATH)); } } Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/main/java/org/apache/jetspeed/portalsite/view/SiteView.java URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/main/java/org/apache/jetspeed/portalsite/view/SiteView.java?rev=893311&r1=893310&r2=893311&view=diff ============================================================================== --- portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/main/java/org/apache/jetspeed/portalsite/view/SiteView.java (original) +++ portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/main/java/org/apache/jetspeed/portalsite/view/SiteView.java Tue Dec 22 20:51:45 2009 @@ -65,6 +65,8 @@ * ALT_CURRENT_PAGE_PATH - alternate expression used to match the current page */ public final static String ALT_CURRENT_PAGE_PATH = "@"; + public final static char ALT_CURRENT_PAGE_PATH_CHAR = '@'; + public final static String ALT_CURRENT_PAGE_PATH_0 = "@0"; /** * STANDARD_*_MENU_NAME - standard menu names @@ -705,6 +707,15 @@ return currentPage; } + // match current node path + if (currentPath.equals(ALT_CURRENT_PAGE_PATH_0)) + { + // return current node, (assume viewable) + List proxies = new ArrayList(1); + proxies.add(currentNode); + return currentNode; + } + // convert absolute path to a root relative search // and default current folder if (currentPath.startsWith(Folder.PATH_SEPARATOR)) @@ -850,6 +861,79 @@ return null; } } + + // convert pattern with indexed current node path expressions + if (currentNode != null) + { + // match current node path + if (currentRegexpPath.equals(ALT_CURRENT_PAGE_PATH_0)) + { + // return current node, (assume viewable) + List proxies = new ArrayList(1); + proxies.add(currentNode); + return proxies; + } + + // match current node path expression + int currentNodePathIndex = currentRegexpPath.indexOf(ALT_CURRENT_PAGE_PATH_CHAR); + String [] currentNodePathElements = null; + while (currentNodePathIndex != -1) + { + if (currentNodePathIndex+1 < currentRegexpPath.length()) + { + String currentNodePathElement = null; + char currentNodePathElementIndexChar = currentRegexpPath.charAt(currentNodePathIndex+1); + if ((currentNodePathElementIndexChar >= '0') && (currentNodePathElementIndexChar <= '9')) + { + // valid current node path pattern + int currentNodePathElementIndex = (int)(currentNodePathElementIndexChar-'0'); + if (currentNodePathElementIndex > 0) + { + // use indexed current node path element + if (currentNodePathElements == null) + { + // note: leading '/' in path makes index one based + currentNodePathElements = currentNode.getPath().split(Folder.PATH_SEPARATOR); + } + if (currentNodePathElementIndex < currentNodePathElements.length) + { + currentNodePathElement = currentNodePathElements[currentNodePathElementIndex]; + } + } + else + { + // use full current node path trimmed of separators + currentNodePathElement = currentNode.getPath(); + if (currentNodePathElement.endsWith(Folder.PATH_SEPARATOR)) + { + currentNodePathElement = currentNodePathElement.substring(0, currentNodePathElement.length()-1); + } + if (currentNodePathElement.startsWith(Folder.PATH_SEPARATOR)) + { + currentNodePathElement = currentNodePathElement.substring(1); + } + } + } + else if (currentNodePathElementIndexChar == '$') + { + // use last current node path element + if (currentNodePathElements == null) + { + // note: leading '/' in path makes index one based + currentNodePathElements = currentNode.getPath().split(Folder.PATH_SEPARATOR); + } + currentNodePathElement = currentNodePathElements[currentNodePathElements.length-1]; + } + // replace current node path expression + if (currentNodePathElement != null) + { + currentRegexpPath = currentRegexpPath.substring(0, currentNodePathIndex)+currentNodePathElement+currentRegexpPath.substring(currentNodePathIndex+2); + currentNodePathIndex += currentNodePathElement.length()-1; + } + } + currentNodePathIndex = currentRegexpPath.indexOf(ALT_CURRENT_PAGE_PATH_CHAR, currentNodePathIndex+1); + } + } // convert absolute path to a root relative search // and default current folder Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/test/java/org/apache/jetspeed/portalsite/TestPortalSite.java URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/test/java/org/apache/jetspeed/portalsite/TestPortalSite.java?rev=893311&r1=893310&r2=893311&view=diff ============================================================================== --- portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/test/java/org/apache/jetspeed/portalsite/TestPortalSite.java (original) +++ portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/test/java/org/apache/jetspeed/portalsite/TestPortalSite.java Tue Dec 22 20:51:45 2009 @@ -275,7 +275,7 @@ assertEquals("/page0.psml", extractFileSystemPathFromId(rootPage0Proxy.getId())); List rootPage0ProxyMenus = rootPage0Proxy.getMenuDefinitions(); assertNotNull(rootPage0ProxyMenus); - assertEquals(3 + aggregateView.getStandardMenuNames().size(), rootPage0ProxyMenus.size()); + assertEquals(5 + aggregateView.getStandardMenuNames().size(), rootPage0ProxyMenus.size()); Iterator menusIter = rootPage0ProxyMenus.iterator(); MenuDefinition rootPage0ProxyTemplateTestMenu = (MenuDefinition)menusIter.next(); assertEquals("template-test", rootPage0ProxyTemplateTestMenu.getName()); @@ -289,6 +289,10 @@ assertEquals("bread-crumbs", rootPage0ProxyBreadCrumbMenu.getName()); assertEquals("./", rootPage0ProxyBreadCrumbMenu.getOptions()); assertEquals(true, rootPage0ProxyBreadCrumbMenu.isPaths()); + MenuDefinition rootPage0ProxyCurrentPageTestMenu = (MenuDefinition)menusIter.next(); + assertEquals("current-page-test", rootPage0ProxyCurrentPageTestMenu.getName()); + MenuDefinition rootPage0ProxyCurrentPathTestMenu = (MenuDefinition)menusIter.next(); + assertEquals("current-path-test", rootPage0ProxyCurrentPathTestMenu.getName()); for (int i = 0; (i < aggregateView.getStandardMenuNames().size()); i++) { assertTrue(aggregateView.getStandardMenuNames().contains(((MenuDefinition)menusIter.next()).getName())); @@ -300,7 +304,7 @@ assertEquals("/_user/user/page2.psml", extractFileSystemPathFromId(rootPage2Proxy.getId())); List rootPage2ProxyMenus = rootPage2Proxy.getMenuDefinitions(); assertNotNull(rootPage2ProxyMenus); - assertEquals(3 + aggregateView.getStandardMenuNames().size(), rootPage2ProxyMenus.size()); + assertEquals(5 + aggregateView.getStandardMenuNames().size(), rootPage2ProxyMenus.size()); menusIter = rootPage2ProxyMenus.iterator(); MenuDefinition rootPage2ProxyTopMenu = (MenuDefinition)menusIter.next(); assertEquals("top", rootPage2ProxyTopMenu.getName()); @@ -311,6 +315,10 @@ MenuDefinition rootPage2ProxyTemplateTestMenu = (MenuDefinition)menusIter.next(); assertEquals("template-test", rootPage2ProxyTemplateTestMenu.getName()); assertEquals("/page0.psml", rootPage2ProxyTemplateTestMenu.getOptions()); + MenuDefinition rootPage2ProxyCurrentPageTestMenu = (MenuDefinition)menusIter.next(); + assertEquals("current-page-test", rootPage0ProxyCurrentPageTestMenu.getName()); + MenuDefinition rootPage2ProxyCurrentPathTestMenu = (MenuDefinition)menusIter.next(); + assertEquals("current-path-test", rootPage0ProxyCurrentPathTestMenu.getName()); for (int i = 0; (i < aggregateView.getStandardMenuNames().size()); i++) { assertTrue(aggregateView.getStandardMenuNames().contains(((MenuDefinition)menusIter.next()).getName())); @@ -687,10 +695,12 @@ assertNotNull(requestContext); Set customMenuNames = requestContext.getCustomMenuNames(); assertNotNull(customMenuNames); - assertEquals(3, customMenuNames.size()); + assertEquals(5, customMenuNames.size()); assertTrue(customMenuNames.contains("top")); assertTrue(customMenuNames.contains("bread-crumbs")); assertTrue(customMenuNames.contains("template-test")); + assertTrue(customMenuNames.contains("current-page-test")); + assertTrue(customMenuNames.contains("current-path-test")); Menu topMenu = requestContext.getMenu("top"); assertNotNull(topMenu); assertEquals(MenuElement.MENU_ELEMENT_TYPE, topMenu.getElementType()); @@ -800,6 +810,21 @@ assertEquals(1, templateTestElements.size()); assertTrue(templateTestElements.get(0) instanceof MenuOption); assertEquals("/page1.psml", ((MenuOption)templateTestElements.get(0)).getUrl()); + Menu currentPageTestMenu = requestContext.getMenu("current-page-test"); + assertEquals("current-page-test", currentPageTestMenu.getName()); + assertFalse(currentPageTestMenu.isEmpty()); + List currentPageTestElements = currentPageTestMenu.getElements(); + assertNotNull(currentPageTestElements); + assertEquals(1, currentPageTestElements.size()); + assertTrue(currentPageTestElements.get(0) instanceof MenuOption); + assertEquals("/page2.psml", ((MenuOption)currentPageTestElements.get(0)).getUrl()); + assertTrue(currentPageTestMenu.isSelected(requestContext)); + assertTrue(((MenuOption)currentPageTestElements.get(0)).isSelected(requestContext)); + Menu currentPathTestMenu = requestContext.getMenu("current-path-test"); + assertEquals("current-path-test", currentPathTestMenu.getName()); + assertTrue(currentPathTestMenu.isEmpty()); + List currentPathTestElements = currentPathTestMenu.getElements(); + assertNull(currentPathTestElements); // second request at /folder0 locator = new JetspeedProfileLocator(); @@ -842,7 +867,27 @@ Menu navigationsMenu = requestContext.getMenu("navigations"); assertNotNull(navigationsMenu); assertTrue(navigationsMenu.isEmpty()); - + currentPageTestMenu = requestContext.getMenu("current-page-test"); + assertEquals("current-page-test", currentPageTestMenu.getName()); + assertFalse(currentPageTestMenu.isEmpty()); + currentPageTestElements = currentPageTestMenu.getElements(); + assertNotNull(currentPageTestElements); + assertEquals(1, currentPageTestElements.size()); + assertTrue(currentPageTestElements.get(0) instanceof MenuOption); + assertEquals("/folder0/page0.psml", ((MenuOption)currentPageTestElements.get(0)).getUrl()); + assertTrue(currentPageTestMenu.isSelected(requestContext)); + assertTrue(((MenuOption)currentPageTestElements.get(0)).isSelected(requestContext)); + currentPathTestMenu = requestContext.getMenu("current-path-test"); + assertEquals("current-path-test", currentPathTestMenu.getName()); + assertFalse(currentPathTestMenu.isEmpty()); + currentPathTestElements = currentPathTestMenu.getElements(); + assertNotNull(currentPathTestElements); + assertEquals(1, currentPathTestElements.size()); + assertTrue(currentPathTestElements.get(0) instanceof MenuOption); + assertEquals("/folder0/page0.psml", ((MenuOption)currentPathTestElements.get(0)).getUrl()); + assertTrue(currentPathTestMenu.isSelected(requestContext)); + assertTrue(((MenuOption)currentPathTestElements.get(0)).isSelected(requestContext)); + // third request at /page1.psml locator = new JetspeedProfileLocator(); locator.init(null, "/page1.psml"); Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/test/resources/webapp/WEB-INF/pages/folder.metadata URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/test/resources/webapp/WEB-INF/pages/folder.metadata?rev=893311&r1=893310&r2=893311&view=diff ============================================================================== --- portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/test/resources/webapp/WEB-INF/pages/folder.metadata (original) +++ portals/jetspeed-2/portal/trunk/components/jetspeed-portal-site/src/test/resources/webapp/WEB-INF/pages/folder.metadata Tue Dec 22 20:51:45 2009 @@ -35,4 +35,6 @@ <menu name="bread-crumbs" options="./" paths="true"/> <menu name="template-test" options="/page0.psml"/> + <menu name="current-page-test" options="~"/> + <menu name="current-path-test" regexp="true" options="/@1/*.psml"/> </folder> --------------------------------------------------------------------- To unsubscribe, e-mail: jetspeed-dev-unsubscr...@portals.apache.org For additional commands, e-mail: jetspeed-dev-h...@portals.apache.org