Author: ivaynberg
Date: Wed Jul  6 22:05:14 2011
New Revision: 1143577

URL: http://svn.apache.org/viewvc?rev=1143577&view=rev
Log:
add support for ".." path fragments that retreive parent containers in 
MarkupContainer.get(String)

Modified:
    
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/Component.java
    
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
    
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/MarkupContainerTest.java

Modified: 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/Component.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/Component.java?rev=1143577&r1=1143576&r2=1143577&view=diff
==============================================================================
--- 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/Component.java
 (original)
+++ 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/Component.java
 Wed Jul  6 22:05:14 2011
@@ -509,6 +509,8 @@ public abstract class Component implemen
 
        /** Separator for component paths */
        public static final char PATH_SEPARATOR = ':';
+       /** Path segment that represents this component's parent */
+       public static final String PARENT_PATH = "..";
 
        /**
         * Action used with IAuthorizationStrategy to determine whether a 
component and its children are

Modified: 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/MarkupContainer.java?rev=1143577&r1=1143576&r2=1143577&view=diff
==============================================================================
--- 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
 (original)
+++ 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
 Wed Jul  6 22:05:14 2011
@@ -302,28 +302,49 @@ public abstract class MarkupContainer ex
         * @return The component at the path
         */
        @Override
-       public final Component get(final String path)
+       public final Component get(String path_)
        {
                // Reference to this container
-               if (path == null || path.trim().equals(""))
+               if (Strings.isEmpty(path_))
                {
                        return this;
                }
 
-               // Get child's id, if any
-               final String id = Strings.firstPathComponent(path, 
Component.PATH_SEPARATOR);
+               // process parent .. references
+
+               MarkupContainer container = this;
+
+               String path = path_;
+               String id = Strings.firstPathComponent(path, 
Component.PATH_SEPARATOR);
+
+               while (Component.PARENT_PATH.equals(id))
+               {
+                       container = container.getParent();
+                       if (container == null)
+                       {
+                               return null;
+                       }
+                       path = path.length() == id.length() ? "" : 
path.substring(id.length() + 1);
+                       id = Strings.firstPathComponent(path, 
Component.PATH_SEPARATOR);
+               }
+
+               if (Strings.isEmpty(id))
+               {
+                       return container;
+               }
+
 
                // Get child by id
-               Component child = children_get(id);
+               Component child = container.children_get(id);
 
                // If the container is transparent, than ask its parent.
                // ParentResolver does something quite similar, but because of 
<head>,
                // <body>, <wicket:panel> etc. it is quite common to have 
transparent
                // components. Hence, this is little short cut for a tiny 
performance
                // optimization.
-               if ((child == null) && isTransparentResolver() && (getParent() 
!= null))
+               if ((child == null) && isTransparentResolver() && 
(container.getParent() != null))
                {
-                       child = getParent().get(path);
+                       child = container.getParent().get(path);
                }
 
                // Found child?

Modified: 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/MarkupContainerTest.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/MarkupContainerTest.java?rev=1143577&r1=1143576&r2=1143577&view=diff
==============================================================================
--- 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/MarkupContainerTest.java
 (original)
+++ 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/MarkupContainerTest.java
 Wed Jul  6 22:05:14 2011
@@ -61,4 +61,45 @@ public class MarkupContainerTest extends
        {
                executeTest(MarkupIdTestPage.class, 
"MarkupIdTestPageExpectedResult.html");
        }
+
+       public void testGet()
+       {
+               WebMarkupContainer a = new WebMarkupContainer("a");
+               WebMarkupContainer b = new WebMarkupContainer("b");
+               WebMarkupContainer c = new WebMarkupContainer("c");
+               WebMarkupContainer d = new WebMarkupContainer("d");
+               WebMarkupContainer e = new WebMarkupContainer("e");
+               WebMarkupContainer f = new WebMarkupContainer("f");
+
+               // ....A
+               // ...B....C
+               // .......D..E
+               // ...........F
+
+               a.add(b);
+               a.add(c);
+               c.add(d);
+               c.add(e);
+               e.add(f);
+
+               // basic gets
+
+               assertTrue(a.get(null) == a);
+               assertTrue(a.get("") == a);
+               assertTrue(a.get("b") == b);
+               assertTrue(a.get("c") == c);
+               assertTrue(a.get("c:d") == d);
+               assertTrue(a.get("c:e:f") == f);
+
+               assertTrue(b.get("..") == a);
+               assertTrue(e.get("..:..") == a);
+               assertTrue(d.get("..:..:c:e:f") == f);
+
+               // invalid gets
+
+               assertNull(a.get(".."));
+               assertNull(a.get("..:a"));
+               assertNull(b.get("..|.."));
+               assertNull(a.get("q"));
+       }
 }


Reply via email to