Author: knopp
Date: Fri Sep 19 17:21:50 2008
New Revision: 697296

URL: http://svn.apache.org/viewvc?rev=697296&view=rev
Log:
added support for parameter placeholder

Modified:
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractEncoder.java
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/MountedEncoder.java
    
wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/MountedEncoderTest.java

Modified: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractEncoder.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractEncoder.java?rev=697296&r1=697295&r2=697296&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractEncoder.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractEncoder.java
 Fri Sep 19 17:21:50 2008
@@ -76,8 +76,21 @@
                return 
getContext().requestListenerInterfaceFromString(interfaceName);
        }
 
+       protected static String getPlaceholder(String s)
+       {
+               if (s == null || s.length() < 4 || !s.startsWith("${") || 
!s.endsWith("}"))
+               {
+                       return null;
+               }
+               else
+               {
+                       return s.substring(2, s.length() - 1);
+               }               
+       }
+               
        /**
-        * Returns true if the given url starts with specified segments
+        * Returns true if the given url starts with specified segments. 
Segments that contain
+        * placelhoders are not compared.
         * 
         * @param url
         * @param segments
@@ -100,7 +113,8 @@
                        {
                                for (int i = 0; i < segments.length; ++i)
                                {
-                                       if 
(segments[i].equals(url.getSegments().get(i)) == false)
+                                       if 
(segments[i].equals(url.getSegments().get(i)) == false &&
+                                               getPlaceholder(segments[i]) == 
null)
                                        {
                                                return false;
                                        }

Modified: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/MountedEncoder.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/MountedEncoder.java?rev=697296&r1=697295&r2=697296&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/MountedEncoder.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/MountedEncoder.java
 Fri Sep 19 17:21:50 2008
@@ -107,7 +107,7 @@
                // to the mounted URL
                if (redirectFromHomePage() && checkHomePage(url))
                {
-                       UrlInfo info = new UrlInfo(null, 
getContext().getHomePageClass(), new PageParameters());
+                       UrlInfo info = new UrlInfo(null, 
getContext().getHomePageClass(), newPageParameters());
                        return info;
                }
                // check if the URL is long enough and starts with the proper 
segments
@@ -122,6 +122,18 @@
                        // extract the PageParameters from URL if there are any
                        PageParameters pageParameters = 
extractPageParameters(url,
                                request.getRequestParameters(), 
mountSegments.length, pageParametersEncoder);
+                       
+                       // check if there are placeholders in mount segments
+                       for (int i = 0; i < mountSegments.length; ++i)
+                       {
+                               String placeholder = 
getPlaceholder(mountSegments[i]);
+                               if (placeholder != null)
+                               {
+                                       // extract the parameter from URL
+                                       
pageParameters.addNamedParameter(placeholder, url.getSegments().get(i));
+                               }
+                       }
+                       
                        return new UrlInfo(info, pageClass, pageParameters);
                }
                else
@@ -129,6 +141,11 @@
                        return null;
                }
        }
+       
+       protected PageParameters newPageParameters()
+       {
+               return new PageParameters();
+       }
 
        @Override
        protected Url buildUrl(UrlInfo info)
@@ -139,7 +156,20 @@
                        url.getSegments().add(s);                       
                }               
                encodePageComponentInfo(url, info.getPageComponentInfo());
-               return encodePageParameters(url, info.getPageParameters(), 
pageParametersEncoder);              
+               
+               PageParameters copy = new 
PageParameters(info.getPageParameters());
+               
+               for (int i = 0; i < mountSegments.length; ++i)
+               {
+                       String placeholder = getPlaceholder(mountSegments[i]);
+                       if (placeholder != null)
+                       {
+                               url.getSegments().set(i, 
copy.getNamedParameter(placeholder).toString());
+                               copy.removeNamedParameter(placeholder);
+                       }
+               }
+               
+               return encodePageParameters(url, copy, pageParametersEncoder);  
        
        }
 
        /**

Modified: 
wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/MountedEncoderTest.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/MountedEncoderTest.java?rev=697296&r1=697295&r2=697296&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/MountedEncoderTest.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/MountedEncoderTest.java
 Fri Sep 19 17:21:50 2008
@@ -52,6 +52,15 @@
                }
        };
 
+       private MountedEncoder placeholderEncoder = new 
MountedEncoder("/some/${param1}/path/${param2}", MockPage.class)
+       {
+               @Override
+               protected EncoderContext getContext()
+               {
+                       return context;
+               }
+       };
+       
        /**
         * 
         */
@@ -397,4 +406,62 @@
                        // ok
                }
        }
+       
+       /**
+        * 
+        */
+       public void testPlaceholderDecode1()
+       {
+               Url url = Url.parse("some/p1/path/p2");
+               RequestHandler handler = 
placeholderEncoder.decode(getRequest(url));
+
+               assertTrue(handler instanceof RenderPageRequestHandler);
+               IPage page = ((RenderPageRequestHandler)handler).getPage();
+
+               assertEquals(0, 
page.getPageParameters().getIndexedParamsCount());
+               
assertTrue(page.getPageParameters().getNamedParameterKeys().size() == 2);
+               assertEquals("p1", 
page.getPageParameters().getNamedParameter("param1").toString());
+               assertEquals("p2", 
page.getPageParameters().getNamedParameter("param2").toString());
+       }
+
+       /**
+        * 
+        */
+       public void testPlaceholderDecode2()
+       {
+               Url url = Url.parse("some/p1/path/p2/indexed1?a=b&b=c");
+               RequestHandler handler = 
placeholderEncoder.decode(getRequest(url));
+
+               assertTrue(handler instanceof RenderPageRequestHandler);
+               IPage page = ((RenderPageRequestHandler)handler).getPage();
+
+               PageParameters p = page.getPageParameters();
+               assertEquals(1, p.getIndexedParamsCount());
+               assertEquals("indexed1", p.getIndexedParameter(0).toString());
+
+               assertEquals(4, p.getNamedParameterKeys().size());
+               assertEquals("b", p.getNamedParameter("a").toString());
+               assertEquals("c", p.getNamedParameter("b").toString());         
+               assertEquals("p1", 
page.getPageParameters().getNamedParameter("param1").toString());
+               assertEquals("p2", 
page.getPageParameters().getNamedParameter("param2").toString());
+       }
+       
+       /**
+        * 
+        */
+       public void testPlaceholderEncode2()
+       {
+               PageParameters parameters = new PageParameters();
+               parameters.setIndexedParameter(0, "i1");
+               parameters.setIndexedParameter(1, "i2");
+               parameters.setNamedParameter("a", "b");
+               parameters.setNamedParameter("b", "c");
+               parameters.setNamedParameter("param1", "p1");
+               parameters.setNamedParameter("param2", "p2");
+               
+               RequestHandler handler = new 
BookmarkablePageRequestHandler(MockPage.class, null,
+                       parameters);
+               Url url = placeholderEncoder.encode(handler);
+               assertEquals("some/p1/path/p2/i1/i2?a=b&b=c", url.toString());
+       }
 }


Reply via email to