You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by kn...@apache.org on 2008/12/01 00:03:12 UTC

svn commit: r721924 - in /wicket/sandbox/knopp/experimental/wicket/src: main/java/org/apache/_wicket/ main/java/org/apache/_wicket/request/ main/java/org/apache/_wicket/request/encoder/ main/java/org/apache/_wicket/request/encoder/info/ test/java/org/a...

Author: knopp
Date: Sun Nov 30 15:03:12 2008
New Revision: 721924

URL: http://svn.apache.org/viewvc?rev=721924&view=rev
Log:
page.renderCount

Added:
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/StalePageException.java   (with props)
Modified:
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/IPage.java
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractBookmarkableEncoder.java
    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/PageInstanceEncoder.java
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/info/ComponentInfo.java
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/url-format.txt
    wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/MockPage.java
    wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/BookmarkableEncoderTest.java
    wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/MountedEncoderTest.java
    wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/PageInstanceEncoderTest.java
    wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/TestEncoderContext.java
    wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/info/ComponentInfoTest.java

Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/IPage.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/IPage.java?rev=721924&r1=721923&r2=721924&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/IPage.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/IPage.java Sun Nov 30 15:03:12 2008
@@ -43,6 +43,18 @@
 	public boolean isBookmarkable();
 
 	/**
+	 * Returns the number of times this page has been rendered. The number will be appended to
+	 * listener interface links in order to prevent invoking listeners from staled page version.
+	 * <p>
+	 * For example a same page might have been rendered in two separate tabs. Page render doesn't
+	 * change page id but it can modify component hierarchy. Listener interface links on such page
+	 * should only work in tab where the page was rendered most recently.
+	 * 
+	 * @return render count
+	 */
+	public int getRenderCount();
+
+	/**
 	 * Returns whether the page instance was created by a bookmarkable URL. Non mounted pages have
 	 * to be created using bookmarkable URL in order to have hybrid URLs later. Otherwise it would
 	 * be a potential security risk.
@@ -59,7 +71,7 @@
 	 * 
 	 * @return Whether this page is stateless
 	 */
-	 // noe that this has different semantics than Component#isStateless()
+	// noe that this has different semantics than Component#isStateless()
 	public boolean isPageStateless();
 
 	/**

Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractBookmarkableEncoder.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractBookmarkableEncoder.java?rev=721924&r1=721923&r2=721924&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractBookmarkableEncoder.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractBookmarkableEncoder.java Sun Nov 30 15:03:12 2008
@@ -53,9 +53,9 @@
 	}
 
 	private RequestHandler processHybrid(PageInfo pageInfo, Class<? extends IPage> pageClass,
-		PageParameters pageParameters)
+		PageParameters pageParameters, Integer renderCount)
 	{
-		IPage page = getPageInstance(pageInfo, pageClass, pageParameters);
+		IPage page = getPageInstance(pageInfo, pageClass, pageParameters, renderCount);
 		return new RenderPageRequestHandler(page);
 	}
 
@@ -64,8 +64,9 @@
 	{
 		PageInfo pageInfo = pageComponentInfo.getPageInfo();
 		ComponentInfo componentInfo = pageComponentInfo.getComponentInfo();
-
-		IPage page = getPageInstance(pageInfo, pageClass, pageParameters, true);
+		Integer renderCount = componentInfo != null ? componentInfo.getRenderCount() : null;
+		
+		IPage page = getPageInstance(pageInfo, pageClass, pageParameters, true, renderCount);
 		IComponent component = getComponent(page, componentInfo.getComponentPath());
 		RequestListenerInterface listenerInterface = requestListenerInterfaceFromString(componentInfo.getListenerInterface());
 
@@ -170,7 +171,7 @@
 				// if there is page instance information in the URL but no component and listener
 				// interface then this is a hybrid URL - we need to try to reuse existing page
 				// instance
-				return processHybrid(info.getPageInfo(), pageClass, pageParameters);
+				return processHybrid(info.getPageInfo(), pageClass, pageParameters, null);
 			}
 			else if (info.getComponentInfo() != null)
 			{
@@ -241,7 +242,7 @@
 			IPage page = handler.getPage();
 			PageInfo pageInfo = new PageInfo(page);
 			ComponentInfo componentInfo = new ComponentInfo(
-				requestListenerInterfaceToString(handler.getListenerInterface()),
+				page.getRenderCount(), requestListenerInterfaceToString(handler.getListenerInterface()),
 				handler.getComponent().getPath(), handler.getBehaviorIndex());
 
 			UrlInfo urlInfo = new UrlInfo(new PageComponentInfo(pageInfo, componentInfo),

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=721924&r1=721923&r2=721924&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 Sun Nov 30 15:03:12 2008
@@ -180,9 +180,10 @@
 	 * 
 	 * @param info
 	 * @param throwExpiredExceptionIfNotFound
+	 * @param renderCount
 	 * @return page instance or <code>null</code>
 	 */
-	protected IPage getPageInstance(PageInfo info, boolean throwExpiredExceptionIfNotFound)
+	protected IPage getPageInstance(PageInfo info, boolean throwExpiredExceptionIfNotFound, Integer renderCount)
 	{
 		if (info == null)
 		{
@@ -194,6 +195,11 @@
 		{
 			throw new PageExpiredException("Page expired.");
 		}
+		
+		if (page != null && renderCount != null && page.getRenderCount() != renderCount)
+		{
+			throw new StalePageException(page);
+		}
 
 		return page;
 	}
@@ -203,11 +209,12 @@
 	 * instance {@link PageExpiredException} is thrown.
 	 * 
 	 * @param info
+	 * @param renderCount
 	 * @return page instance
 	 */
-	protected IPage getPageInstance(PageInfo info)
+	protected IPage getPageInstance(PageInfo info, Integer renderCount)
 	{
-		return getPageInstance(info, true);
+		return getPageInstance(info, true, renderCount);
 	}
 
 	/**
@@ -363,13 +370,14 @@
 	 * @param pageInfo
 	 * @param pageClass
 	 * @param pageParameters
+	 * @param renderCount
 	 * 
 	 * @return page instance
 	 */
 	protected IPage getPageInstance(PageInfo pageInfo, Class<? extends IPage> pageClass,
-		PageParameters pageParameters)
+		PageParameters pageParameters, Integer renderCount)
 	{
-		return getPageInstance(pageInfo, pageClass, pageParameters, false);
+		return getPageInstance(pageInfo, pageClass, pageParameters, false, renderCount);
 	}
 
 	/**
@@ -386,11 +394,12 @@
 	 * @param pageClass
 	 * @param pageParameters
 	 * @param prepareForRenderNewPage
+	 * @param renderCount
 	 * 
 	 * @return page instance
 	 */
 	protected IPage getPageInstance(PageInfo pageInfo, Class<? extends IPage> pageClass,
-		PageParameters pageParameters, boolean prepareForRenderNewPage)
+		PageParameters pageParameters, boolean prepareForRenderNewPage, Integer renderCount)
 	{
 		if (pageInfo == null)
 		{
@@ -421,6 +430,10 @@
 		}
 		else
 		{
+			if (renderCount != null && page.getRenderCount() != renderCount)
+			{
+				throw new StalePageException(page);
+			}
 			page.getPageParameters().assign(pageParameters);
 		}
 		return page;

Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInstanceEncoder.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInstanceEncoder.java?rev=721924&r1=721923&r2=721924&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInstanceEncoder.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInstanceEncoder.java Sun Nov 30 15:03:12 2008
@@ -65,7 +65,10 @@
 			PageComponentInfo info = getPageComponentInfo(url);
 			if (info != null && info.getPageInfo().getPageId() != null)
 			{
-				IPage page = getPageInstance(info.getPageInfo());
+				Integer renderCount = info.getComponentInfo() != null ? info.getComponentInfo().getRenderCount() : null;
+				
+				IPage page = getPageInstance(info.getPageInfo(), renderCount);
+				
 				if (info.getComponentInfo() == null)
 				{
 					// render page
@@ -106,7 +109,7 @@
 
 			PageInfo pageInfo = new PageInfo(page);
 			ComponentInfo componentInfo = new ComponentInfo(
-				requestListenerInterfaceToString(listenerInterface), componentPath,
+				page.getRenderCount(), requestListenerInterfaceToString(listenerInterface), componentPath,
 				handler.getBehaviorIndex());
 			info = new PageComponentInfo(pageInfo, componentInfo);
 		}

Added: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/StalePageException.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/StalePageException.java?rev=721924&view=auto
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/StalePageException.java (added)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/StalePageException.java Sun Nov 30 15:03:12 2008
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache._wicket.request.encoder;
+
+import org.apache._wicket.IPage;
+import org.apache.wicket.WicketRuntimeException;
+
+/**
+ * Exception invoked when when stale link has been clicked. The page should then be rerendered
+ * with an explanatory error message.
+ * 
+ * @author Matej Knopp
+ */
+public class StalePageException extends WicketRuntimeException
+{
+	private static final long serialVersionUID = 1L;
+
+	private final IPage page;
+
+	/**
+	 * 
+	 * Construct.
+	 * @param page
+	 */
+	public StalePageException(IPage page)
+	{
+		this.page = page;
+	}
+	
+	/**
+	 * 
+	 * @return page instance
+	 */
+	public IPage getPage()
+	{
+		return page;
+	}
+}

Propchange: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/StalePageException.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/info/ComponentInfo.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/info/ComponentInfo.java?rev=721924&r1=721923&r2=721924&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/info/ComponentInfo.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/info/ComponentInfo.java Sun Nov 30 15:03:12 2008
@@ -20,7 +20,8 @@
 
 /**
  * Encodes listener inteface and component path in form of
- * &lt;listenerInterface&gt-&lt;componentPath&gt; or &lt;listenerInterface&gt.&lt;behaviorIndex&gt;-&lt;componentPath&gt;
+ * &lt;listenerInterface&gt-&lt;componentPath&gt; or
+ * &lt;listenerInterface&gt.&lt;behaviorIndex&gt;-&lt;componentPath&gt;
  * <p>
  * Component path is escaped (':' characters are replaced by '-')
  * 
@@ -31,6 +32,7 @@
 	private final String listenerInterface;
 	private final String componentPath;
 	private final Integer behaviorIndex;
+	private final Integer renderCount;
 
 	private static final char BEHAVIOR_INDEX_SEPARATOR = '.';
 	private static final char SEPARATOR = '-';
@@ -38,11 +40,13 @@
 	/**
 	 * Construct.
 	 * 
+	 * @param renderCount
 	 * @param listenerInterface
 	 * @param componentPath
 	 * @param behaviorIndex
 	 */
-	public ComponentInfo(String listenerInterface, String componentPath, Integer behaviorIndex)
+	public ComponentInfo(Integer renderCount, String listenerInterface, String componentPath,
+		Integer behaviorIndex)
 	{
 		if (listenerInterface == null)
 		{
@@ -55,6 +59,7 @@
 		this.listenerInterface = listenerInterface;
 		this.componentPath = componentPath;
 		this.behaviorIndex = behaviorIndex;
+		this.renderCount = renderCount;
 	}
 
 	/**
@@ -80,6 +85,15 @@
 	{
 		return behaviorIndex;
 	}
+	
+	/**
+	 * 
+	 * @return render count
+	 */
+	public Integer getRenderCount()
+	{
+		return renderCount;
+	}
 
 	private static final String TMP_PLACEHOLDER = "[[[[[[[WICKET[[TMP]]DASH]]" + Math.random() +
 		"]]]]";
@@ -118,7 +132,13 @@
 	public String toString()
 	{
 		StringBuilder result = new StringBuilder();
-
+		
+		if (renderCount != null)
+		{
+			result.append(renderCount);
+			result.append(BEHAVIOR_INDEX_SEPARATOR);
+		}
+		
 		result.append(listenerInterface);
 
 		if (behaviorIndex != null)
@@ -133,6 +153,28 @@
 	}
 
 	/**
+	 * Method that rigidly checks if the string consists of digits only.
+	 * 
+	 * @param string
+	 * @return whether the string consists of digits only
+	 */
+	private static boolean isNumber(String string)
+	{
+		if (string == null || string.length() == 0)
+		{
+			return false;
+		}
+		for (int i = 0; i < string.length(); ++i)
+		{
+			if (Character.isDigit(string.charAt(i)) == false)
+			{
+				return false;
+			}
+		}
+		return true;
+	}
+	
+	/**
 	 * Parses the given string.
 	 * 
 	 * @param string
@@ -164,22 +206,42 @@
 			}
 
 			Integer behaviorIndex = null;
-			i = listenerInterface.indexOf(BEHAVIOR_INDEX_SEPARATOR);
-			if (i != -1)
-			{				
-				String behavior = listenerInterface.substring(i + 1);
-				listenerInterface = listenerInterface.substring(0, i);
-				try
+			Integer renderCount = null;
+			
+			String listenerParts[] = Strings.split(listenerInterface, BEHAVIOR_INDEX_SEPARATOR);
+			if (listenerParts.length == 2)
+			{
+				if (isNumber(listenerParts[0]))
+				{
+					renderCount = Integer.valueOf(listenerParts[0]);
+					listenerInterface = listenerParts[1];
+				}
+				else if (isNumber(listenerParts[1]))
 				{
-					behaviorIndex = Integer.valueOf(behavior);
+					listenerInterface = listenerParts[0];
+					behaviorIndex = Integer.valueOf(listenerParts[1]);									
 				}
-				catch (Exception e)
+				else
 				{
 					return null;
 				}
 			}
+			else if (listenerParts.length == 3)
+			{
+				if (!isNumber(listenerParts[0]) && !isNumber(listenerParts[1]))
+				{
+					return null;
+				}
+				renderCount = Integer.valueOf(listenerParts[0]);
+				listenerInterface = listenerParts[1];
+				behaviorIndex = Integer.valueOf(listenerParts[2]);
+			}
+			else if (listenerParts.length != 1)
+			{
+				return null;
+			}
 
-			return new ComponentInfo(listenerInterface, componentPath, behaviorIndex);
+			return new ComponentInfo(renderCount, listenerInterface, componentPath, behaviorIndex);
 		}
 	}
 

Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/url-format.txt
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/url-format.txt?rev=721924&r1=721923&r2=721924&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/url-format.txt (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/url-format.txt Sun Nov 30 15:03:12 2008
@@ -27,8 +27,8 @@
 /wicket/bookmarkable/org.apache.wicket.MyPage?2
 
 Page Instance - Bookmarkable Listener (BookmarkableListenerInterfaceRequestHandler)
-/wicket/bookmarkable/org.apache.wicket.MyPage?2-click-foo-bar-baz
-/wicket/bookmarkable/org.apache.wicket.MyPage?2-click.1-foo-bar-baz (1 is behavior index)
+/wicket/bookmarkable/org.apache.wicket.MyPage?2-5.click-foo-bar-baz (5 is renderCount)
+/wicket/bookmarkable/org.apache.wicket.MyPage?2-5.click.1-foo-bar-baz (5 is renderCount, 1 is behavior index)
 (these will redirect to hybrid if page is not stateless)
 
 BOOKMARKABLE - MOUNTED

Modified: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/MockPage.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/MockPage.java?rev=721924&r1=721923&r2=721924&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/MockPage.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/MockPage.java Sun Nov 30 15:03:12 2008
@@ -142,4 +142,19 @@
 		return this;
 	}
 
+	private int renderCount;
+	
+	public int getRenderCount()
+	{
+		return renderCount;
+	}
+	
+	/**
+	 * Sets the render count
+	 * @param renderCount
+	 */
+	public void setRenderCount(int renderCount)
+	{
+		this.renderCount = renderCount;
+	}
 }

Modified: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/BookmarkableEncoderTest.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/BookmarkableEncoderTest.java?rev=721924&r1=721923&r2=721924&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/BookmarkableEncoderTest.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/BookmarkableEncoderTest.java Sun Nov 30 15:03:12 2008
@@ -172,6 +172,7 @@
 		assertEquals("c", p.getNamedParameter("b").toString());
 	}
 	
+	
 	/**
 	 * 
 	 */
@@ -191,6 +192,48 @@
 		assertEquals("foo:bar", h.getComponent().getPath());
 		assertEquals((Object)4, h.getBehaviorIndex());
 	}
+	
+	/**
+	 * 
+	 */
+	public void testDecode8()
+	{
+		Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME +
+			"/i1/i2?15-5.ILinkListener-foo-bar&a=b&b=c");
+		
+		context.setNextPageRenderCount(5);
+		
+		RequestHandler handler = encoder.decode(getRequest(url));
+
+		assertTrue(handler instanceof ListenerInterfaceRequestHandler);
+		ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler;
+
+		IPage page = h.getPage();
+		assertEquals(page.getRenderCount(), 5);
+	}
+	
+	/**
+	 * 
+	 */
+	public void testDecode9()
+	{
+		Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME +
+			"/i1/i2?15-5.ILinkListener-foo-bar&a=b&b=c");
+		
+		context.setNextPageRenderCount(6);
+		
+		try
+		{
+			RequestHandler handler = encoder.decode(getRequest(url));
+			
+			// should never get here
+			assertFalse(true);
+		} 
+		catch (StalePageException e)
+		{
+			
+		}
+	}
 
 	/**
 	 * 
@@ -302,7 +345,7 @@
 		Url url = encoder.encode(handler);
 
 		assertEquals("wicket/bookmarkable/" + PAGE_CLASS_NAME +
-			"/i1/i2?15-ILinkListener-foo-bar&a=b&b=c", url.toString());
+			"/i1/i2?15-0.ILinkListener-foo-bar&a=b&b=c", url.toString());
 	}
 	
 	/**
@@ -328,7 +371,7 @@
 		Url url = encoder.encode(handler);
 
 		assertEquals("wicket/bookmarkable/" + PAGE_CLASS_NAME +
-			"/i1/i2?15-ILinkListener.4-foo-bar&a=b&b=c", url.toString());
+			"/i1/i2?15-0.ILinkListener.4-foo-bar&a=b&b=c", url.toString());
 	}
 
 	

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=721924&r1=721923&r2=721924&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 Sun Nov 30 15:03:12 2008
@@ -223,6 +223,44 @@
 	/**
 	 * 
 	 */
+	public void testDecode10()
+	{
+		Url url = Url.parse("some/mount/path?15-5.ILinkListener.4-foo-bar");
+		context.setNextPageRenderCount(5);
+		RequestHandler handler = encoder.decode(getRequest(url));
+
+		assertTrue(handler instanceof ListenerInterfaceRequestHandler);
+
+		ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler;
+
+		IPage page = h.getPage();
+		assertEquals(5, page.getRenderCount());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testDecode11()
+	{
+		Url url = Url.parse("some/mount/path?15-5.ILinkListener.4-foo-bar");
+		context.setNextPageRenderCount(7);
+		
+		try
+		{
+			RequestHandler handler = encoder.decode(getRequest(url));
+			
+			// should never get here
+			assertTrue(false);
+		}
+		catch (StalePageException e)
+		{
+			
+		}
+	}
+	
+	/**
+	 * 
+	 */
 	public void testEncode1()
 	{
 		RequestHandler handler = new BookmarkablePageRequestHandler(MockPage.class, null,
@@ -316,6 +354,7 @@
 		page.getPageParameters().setIndexedParameter(1, "i2");
 		page.getPageParameters().setNamedParameter("a", "b");
 		page.getPageParameters().setNamedParameter("b", "c");
+		page.setRenderCount(4);
 
 		// shouldn't make any difference for BookmarkableListenerInterfaceRequestHandler,
 		// as this explicitely says the url must be bookmarkable
@@ -328,7 +367,7 @@
 
 		Url url = encoder.encode(handler);
 
-		assertEquals("some/mount/path/i1/i2?15-ILinkListener-foo-bar&a=b&b=c", url.toString());
+		assertEquals("some/mount/path/i1/i2?15-4.ILinkListener-foo-bar&a=b&b=c", url.toString());
 	}
 
 	/**
@@ -341,6 +380,7 @@
 		page.getPageParameters().setIndexedParameter(1, "i2");
 		page.getPageParameters().setNamedParameter("a", "b");
 		page.getPageParameters().setNamedParameter("b", "c");
+		page.setRenderCount(5);
 
 		// shouldn't make any difference for BookmarkableListenerInterfaceRequestHandler,
 		// as this explicitely says the url must be bookmarkable
@@ -353,7 +393,7 @@
 
 		Url url = encoder.encode(handler);
 
-		assertEquals("some/mount/path/i1/i2?15-ILinkListener.4-foo-bar&a=b&b=c",
+		assertEquals("some/mount/path/i1/i2?15-5.ILinkListener.4-foo-bar&a=b&b=c",
 			url.toString());
 	}
 
@@ -374,7 +414,7 @@
 
 		assertEquals("some/mount/path", url.toString());
 	}
-
+	
 	/**
 	 * 
 	 */

Modified: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/PageInstanceEncoderTest.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/PageInstanceEncoderTest.java?rev=721924&r1=721923&r2=721924&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/PageInstanceEncoderTest.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/PageInstanceEncoderTest.java Sun Nov 30 15:03:12 2008
@@ -135,6 +135,44 @@
 	/**
 	 * 
 	 */
+	public void testDecode7()
+	{
+		Url url = Url.parse("wicket/page?4-6.ILinkListener.5-a-b-c");
+		
+		context.setNextPageRenderCount(6);
+		
+		RequestHandler handler = encoder.decode(getRequest(url));
+		assertTrue(handler instanceof ListenerInterfaceRequestHandler);
+		
+		ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler) handler;
+		assertEquals(6, h.getPage().getRenderCount()); 			
+	}
+	
+	/**
+	 * 
+	 */
+	public void testDecode8()
+	{
+		Url url = Url.parse("wicket/page?4-6.ILinkListener.5-a-b-c");
+		
+		context.setNextPageRenderCount(8);
+		
+		try
+		{
+			RequestHandler handler = encoder.decode(getRequest(url));
+			
+			// should never get here
+			assertFalse(true);
+		}
+		catch (StalePageException e)
+		{
+			
+		}		 		
+	}
+	
+	/**
+	 * 
+	 */
 	public void testEncode1()
 	{
 		MockPage page = new MockPage(15);
@@ -151,13 +189,14 @@
 	public void testEncode2()
 	{
 		MockPage page = new MockPage(15);
+		page.setRenderCount(5);
 		
 		IComponent c = page.get("a:b:c");
 		
 		RequestHandler handler = new ListenerInterfaceRequestHandler(page, c, ILinkListener.INTERFACE);
 		
 		Url url = encoder.encode(handler);
-		assertEquals("wicket/page?15-ILinkListener-a-b-c", url.toString());
+		assertEquals("wicket/page?15-5.ILinkListener-a-b-c", url.toString());
 	}
 	
 }

Modified: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/TestEncoderContext.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/TestEncoderContext.java?rev=721924&r1=721923&r2=721924&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/TestEncoderContext.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/TestEncoderContext.java Sun Nov 30 15:03:12 2008
@@ -89,12 +89,24 @@
 		this.createdBookmarkable = createdBookmarkable;
 	}
 
+	private int nextPageRenderCount = 0;
+	
+	/**
+	 * 
+	 * @param nextPageRenderCount
+	 */
+	public void setNextPageRenderCount(int nextPageRenderCount)
+	{
+		this.nextPageRenderCount = nextPageRenderCount;
+	}
+	
 	public IPage getPageInstance(int pageId)
 	{
 		MockPage page = new MockPage();
 		page.setPageId(pageId);
 		page.setBookmarkable(bookmarkable);
 		page.setCreatedBookmarkable(createdBookmarkable);
+		page.setRenderCount(nextPageRenderCount);
 		return page;
 	}
 

Modified: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/info/ComponentInfoTest.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/info/ComponentInfoTest.java?rev=721924&r1=721923&r2=721924&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/info/ComponentInfoTest.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/info/ComponentInfoTest.java Sun Nov 30 15:03:12 2008
@@ -127,5 +127,32 @@
 		
 		assertEquals(s, info.toString());
 	}
+	
+	/**
+	 * 
+	 */
+	public void test9()
+	{
+		String s = "4.listener-a-b";
+		ComponentInfo info = ComponentInfo.parse(s);
+		assertEquals("listener", info.getListenerInterface());
+		assertEquals((Integer)4, info.getRenderCount());
+		
+		assertEquals(s, info.toString());
+	}
+	
+	/**
+	 * 
+	 */
+	public void test10()
+	{
+		String s = "4.listener.5-a-b";
+		ComponentInfo info = ComponentInfo.parse(s);
+		assertEquals("listener", info.getListenerInterface());
+		assertEquals((Integer)4, info.getRenderCount());
+		assertEquals((Integer)5, info.getBehaviorIndex());
+		
+		assertEquals(s, info.toString());
+	}
 
 }