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

Reply via email to