Author: knopp
Date: Fri Aug  3 10:30:12 2007
New Revision: 562528

URL: http://svn.apache.org/viewvc?view=rev&rev=562528
Log:
WICKET-30 encoding/decoding improvements

Modified:
    
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/HybridUrlCodingStrategy.java

Modified: 
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/HybridUrlCodingStrategy.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/HybridUrlCodingStrategy.java?view=diff&rev=562528&r1=562527&r2=562528
==============================================================================
--- 
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/HybridUrlCodingStrategy.java
 (original)
+++ 
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/coding/HybridUrlCodingStrategy.java
 Fri Aug  3 10:30:12 2007
@@ -44,13 +44,13 @@
  * the state is preserved on refresh.
  * <p>
  * The url with [EMAIL PROTECTED] HybridUrlCodingStrategy} looks like
- * /mount/path/param1/value1|3| or /mount/path/param1/value1|3:2| where 3 is
- * page Id and 2 is version number.
+ * /mount/path/param1/value1.3. or /mount/path/param1/value1.3.2 where 3 is 
page
+ * Id and 2 is version number.
  * <p>
  * Also to preserve state on refresh with ajax-only pages the
  * [EMAIL PROTECTED] HybridUrlCodingStrategy} does an immediate redirect after 
hitting
  * bookmarkable URL, e.g. it immediately redirects from /mount/path to
- * /mount/path|3| where 3 is the next page id. This preserves the page instance
+ * /mount/path.3 where 3 is the next page id. This preserves the page instance
  * on subsequent page refresh.
  * 
  * @author Matej Knopp
@@ -177,8 +177,9 @@
                        // bookmarkable page request
                        return new 
HybridBookmarkablePageRequestTarget(pageMapName, (Class)pageClassRef.get(),
                                        parameters, 
originalUrlTrailingSlashesCount, isRedirectOnBookmarkableRequest());
-//                     return new BookmarkablePageRequestTarget(pageMapName, 
(Class)pageClassRef.get(),
-//                                     parameters);
+// return new BookmarkablePageRequestTarget(pageMapName,
+// (Class)pageClassRef.get(),
+// parameters);
                }
                else
                // hybrid url
@@ -471,7 +472,7 @@
                                        
lastSubstring.startsWith(getBeginSeparator()) &&
                                        
lastSubstring.endsWith(getEndSeparator()))
                        {
-                               String pageInfoString= 
lastSubstring.substring(getBeginSeparator().length(), // 
+                               String pageInfoString = 
lastSubstring.substring(getBeginSeparator().length(), // 
                                                lastSubstring.length() - 
getEndSeparator().length());
                                PageInfo info = 
PageInfo.parsePageInfo(pageInfoString);
                                last = info;
@@ -514,11 +515,11 @@
         * Possible string representation of PageInfo:
         * <ul>
         * <li>pageId
-        * <li>pageId:version
-        * <li>:pageMap
-        * <li>pageMap:pageId: (the first colon distingues between this and the
-        * previous one)
-        * <li>pageMap:pageId:version
+        * <li>pageId.version
+        * <li>pageMap (only if pageMap starts with a letter)
+        * <li>.pageMap
+        * <li>pageMap.pageId.version
+        * <li>pageMap.pageId (only if pageMap name starts with a letter)
         * </ul>
         * 
         * @author Matej Knopp
@@ -573,40 +574,70 @@
                        return pageMapName;
                }
 
-               private static char getPageInfoSeparator() {
+               private static char getPageInfoSeparator()
+               {
                        return '.';
                }
-               
+
+               /**
+                * <ul>
+                * <li>pageId
+                * <li>pageId.version
+                * <li>pageMap (only in if pagemap strats with a letter)
+                * <li>.pageMap
+                * <li>pageMap.pageId (only in if pageMap name starts with a 
letter)
+                * <li>pageMap.pageId.version
+                * </ul>
+                */
                public String toString()
                {
                        AppendingStringBuffer buffer = new 
AppendingStringBuffer(5);
-                       
 
-                       if (pageMapName != null)
+                       final boolean pmEmpty = Strings.isEmpty(pageMapName);
+                       final boolean pmStartsWithCharacter = !pmEmpty &&
+                                       
Character.isLetter(pageMapName.charAt(0));
+
+
+                       if (pageId != null && pmEmpty && 
versionNumber.intValue() == 0)
                        {
-                               if (versionNumber == null && pageId == null)
-                               {
-                                       buffer.append(getPageInfoSeparator());
-                               }
-                               buffer.append(pageMapName);
-                               if (pageId != null)
-                               {
-                                       buffer.append(getPageInfoSeparator());
-                               }
+                               // pageId
+                               buffer.append(pageId);
                        }
-                       if (pageId != null)
+                       else if (pageId != null && pmEmpty && 
versionNumber.intValue() != 0)
                        {
+                               // pageId.version
                                buffer.append(pageId);
+                               buffer.append(getPageInfoSeparator());
+                               buffer.append(versionNumber);
                        }
-                       if (pageId != null && (versionNumber == null || 
versionNumber.intValue() == 0) && pageMapName != null)
+                       else if (pageId == null && pmStartsWithCharacter)
                        {
+                               // pageMap (must start with letter)
+                               buffer.append(pageMapName);
+                       }
+                       else if (pageId == null && !pmEmpty && 
!pmStartsWithCharacter)
+                       {
+                               // .pageMap
+                               buffer.append(getPageInfoSeparator());
+                               buffer.append(pageMapName);
+                       }
+                       else if (pmStartsWithCharacter && pageId != null && 
versionNumber.intValue() == 0)
+                       {
+                               // pageMap.pageId (pageMap must start with a 
letter)
+                               buffer.append(pageMapName);
                                buffer.append(getPageInfoSeparator());
+                               buffer.append(pageId);
                        }
-                       if (versionNumber != null && versionNumber.intValue() 
!= 0)
+                       else if (!pmEmpty && pageId != null)
                        {
+                               // pageMap.pageId.pageVersion
+                               buffer.append(pageMapName);
+                               buffer.append(getPageInfoSeparator());
+                               buffer.append(pageId);
                                buffer.append(getPageInfoSeparator());
                                buffer.append(versionNumber);
                        }
+
                        return buffer.toString();
                }
 
@@ -633,6 +664,15 @@
                }
 
                /**
+                * <ul>
+                * <li>pageId
+                * <li>pageId.version
+                * <li>pageMap (only in if pagemap strats with a letter)
+                * <li>.pageMap
+                * <li>pageMap.pageId (only in if pageMap name starts with a 
letter)
+                * <li>pageMap.pageId.version
+                * </ul>
+                * 
                 * @param src
                 * @return
                 */
@@ -661,21 +701,33 @@
                                return new 
PageInfo(Integer.valueOf(segments[0]), Integer.valueOf(segments[1]),
                                                null);
                        }
+                       else if (segments.length == 1 && !isNumber(segments[0]))
+                       {
+                               // pageMap (starts with leter)
+                               return new PageInfo(null, null, segments[0]);
+                       }
                        else if (segments.length == 2 && segments[0].length() 
== 0)
                        {
-                               // :pageMapName
+                               // .pageMap
                                return new PageInfo(null, null, segments[1]);
                        }
+                       else if (segments.length == 2 && !isNumber(segments[0]))
+                       {
+                               // pageMap.pageId (pageMap starts with letter)
+                               return new 
PageInfo(Integer.valueOf(segments[1]), new Integer(0), segments[0]);
+                       }
                        else if (segments.length == 3)
                        {
                                if (segments[2].length() == 0 && 
isNumber(segments[1]))
                                {
-                                       // pageMapName:pageId:
+                                       // we don't encode it like this, but we 
still should be able
+                                       // to parse it
+                                       // pageMapName.pageId.
                                        return new 
PageInfo(Integer.valueOf(segments[1]), new Integer(0), segments[0]);
                                }
                                else if (isNumber(segments[1]) && 
isNumber(segments[2]))
                                {
-                                       // pageMapName:pageId:pageVersion
+                                       // pageMapName.pageId.pageVersion
                                        return new 
PageInfo(Integer.valueOf(segments[1]), Integer.valueOf(segments[2]),
                                                        segments[0]);
                                }
@@ -725,8 +777,8 @@
 
                public void respond(RequestCycle requestCycle)
                {
-//                     super.respond(requestCycle);
-//                     if (requestCycle.isRedirect() == false)
+// super.respond(requestCycle);
+// if (requestCycle.isRedirect() == false)
                        {
                                Page page = getPage(requestCycle);
                                if (page.isPageStateless() == false && redirect)


Reply via email to