You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2014/01/16 11:53:58 UTC

[1/7] git commit: Methods in interface are public implicitly

Updated Branches:
  refs/heads/master 60d3009e9 -> aa84e95ab


Methods in interface are public implicitly


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/ce702dcb
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/ce702dcb
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/ce702dcb

Branch: refs/heads/master
Commit: ce702dcb248752ada954c51a66868a4795c468cf
Parents: 5de39f4
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Mon Jan 13 15:29:56 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Mon Jan 13 15:29:56 2014 +0200

----------------------------------------------------------------------
 .../request/component/IRequestableComponent.java      | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/ce702dcb/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java b/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java
index 2566dcc..adc0c9f 100644
--- a/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java
+++ b/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java
@@ -34,21 +34,21 @@ public interface IRequestableComponent
 	 * 
 	 * @return Colon separated path to this component in the component hierarchy
 	 */
-	public String getPageRelativePath();
+	String getPageRelativePath();
 
 	/**
 	 * Gets the id of this component.
 	 * 
 	 * @return The id of this component
 	 */
-	public String getId();
+	String getId();
 
 	/**
 	 * Returns page this component belongs to.
 	 * 
 	 * @return page instance or <code>null</code>
 	 */
-	public IRequestablePage getPage();
+	IRequestablePage getPage();
 
 	/**
 	 * Gets the component at the given path.
@@ -57,7 +57,7 @@ public interface IRequestableComponent
 	 *            Path to component
 	 * @return The component at the path
 	 */
-	public IRequestableComponent get(String path);
+	IRequestableComponent get(String path);
 
 	/**
 	 * Gets a stable id for the specified behavior. The id remains stable from the point this method
@@ -66,7 +66,7 @@ public interface IRequestableComponent
 	 * @param behavior
 	 * @return a stable id for the specified behavior
 	 */
-	public int getBehaviorId(Behavior behavior);
+	int getBehaviorId(Behavior behavior);
 
 	/**
 	 * Gets the behavior for the specified id
@@ -76,7 +76,7 @@ public interface IRequestableComponent
 	 * @throws InvalidBehaviorIdException
 	 *             when behavior with this id cannot be found
 	 */
-	public Behavior getBehaviorById(int id);
+	Behavior getBehaviorById(int id);
 
 	/**
 	 * Detaches the component.
@@ -104,5 +104,5 @@ public interface IRequestableComponent
 	 * 
 	 * </p>
 	 */
-	public void detach();
+	void detach();
 }


[4/7] git commit: WICKET-4441 PageProvider should create a new Page instance if PageParameters are changed, even if a stored page exists.

Posted by mg...@apache.org.
WICKET-4441 PageProvider should create a new Page instance if PageParameters are changed, even if a stored page exists.


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/a53591f0
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/a53591f0
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/a53591f0

Branch: refs/heads/master
Commit: a53591f030b87b5d1552e567226705020dee2a62
Parents: 565346c
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Tue Jan 14 11:36:22 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Tue Jan 14 11:36:22 2014 +0200

----------------------------------------------------------------------
 .../mapper/AbstractBookmarkableMapper.java      |  7 ++++++
 .../request/mapper/BookmarkableMapperTest.java  | 25 ++++++++++++++++----
 .../core/request/mapper/MountedMapperTest.java  | 25 ++++++++++++++++----
 .../core/request/mapper/PackageMapperTest.java  | 25 ++++++++++++++++----
 4 files changed, 70 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/a53591f0/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
index 5074ac0..a1cb05f 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
@@ -246,6 +246,13 @@ public abstract class AbstractBookmarkableMapper extends AbstractComponentMapper
 		}
 		else
 		{
+			PageParameters constructionPageParameters = provider.getPageInstance().getPageParameters();
+			if (PageParameters.equals(constructionPageParameters, pageParameters) == false)
+			{
+				// create a fresh page instance because the request page parameters are different than the ones
+				// when the resolved page by id has been created
+				return new RenderPageRequestHandler(new PageProvider(pageClass, pageParameters));
+			}
 			return new RenderPageRequestHandler(provider);
 		}
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/a53591f0/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/BookmarkableMapperTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/BookmarkableMapperTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/BookmarkableMapperTest.java
index f1db41b..c8c2a0f 100644
--- a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/BookmarkableMapperTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/BookmarkableMapperTest.java
@@ -99,7 +99,11 @@ public class BookmarkableMapperTest extends AbstractMapperTest
 	}
 
 	/**
+	 * The tests resolves pages by id as if they were existed in the page store.
+	 * These pages have no page parameters (i.e. page.getPageParameters() == null).
 	 *
+	 * The request that the encoder does also has no parameters (neither in the path
+	 * nor in the query string) so the resolved page is assumed to be valid.
 	 */
 	@Test
 	public void decode3()
@@ -113,7 +117,18 @@ public class BookmarkableMapperTest extends AbstractMapperTest
 	}
 
 	/**
+	 * The tests resolves pages by id as if they were existed in the page store.
+	 * These pages have no page parameters (i.e. page.getPageParameters() == null).
 	 *
+	 * Since Wicket 7.0.0 (WICKET-4441) if a new request to hybrid url
+	 * (a url with both mount path and pageId) has different page parameters
+	 * than the resolved page then a new page instance with the new parameters
+	 * is created.
+	 * This way if a user manipulates manually the product id in url like:
+	 * /wicket/bookmarkable/my.Product?3&id=23
+	 * to
+	 * /wicket/bookmarkable/my.Product?3&id=24
+	 * then Wicket will create a new page that will show product=24
 	 */
 	@Test
 	public void decode4()
@@ -122,13 +137,15 @@ public class BookmarkableMapperTest extends AbstractMapperTest
 		IRequestHandler handler = encoder.mapRequest(getRequest(url));
 
 		assertThat(handler, instanceOf(RenderPageRequestHandler.class));
-		IRequestablePage page = ((RenderPageRequestHandler)handler).getPage();
-		checkPage(page, 15);
+		RenderPageRequestHandler h = (RenderPageRequestHandler) handler;
+		((PageProvider) h.getPageProvider()).setPageSource(context);
+		IRequestablePage page = h.getPage();
+		checkPage(page, 1);
 
 		PageParameters p = page.getPageParameters();
-		assertEquals(0, p.getIndexedCount());
+		assertEquals(2, p.getIndexedCount());
 
-		assertEquals(0, p.getNamedKeys().size());
+		assertEquals(2, p.getNamedKeys().size());
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/a53591f0/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
index 04ca930..0024874 100644
--- a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
@@ -152,7 +152,11 @@ public class MountedMapperTest extends AbstractMapperTest
 	}
 
 	/**
+	 * The tests resolves pages by id as if they were existed in the page store.
+	 * These pages have no page parameters (i.e. page.getPageParameters() == null).
 	 *
+	 * The request that the encoder does also has no parameters (neither in the path
+	 * nor in the query string) so the resolved page is assumed to be valid.
 	 */
 	@Test
 	public void decode3()
@@ -166,7 +170,18 @@ public class MountedMapperTest extends AbstractMapperTest
 	}
 
 	/**
+	 * The tests resolves pages by id as if they were existed in the page store.
+	 * These pages have no page parameters (i.e. page.getPageParameters() == null).
 	 *
+	 * Since Wicket 7.0.0 (WICKET-4441) if a new request to hybrid url
+	 * (a url with both mount path and pageId) has different page parameters
+	 * than the resolved page then a new page instance with the new parameters
+	 * is created.
+	 * This way if a user manipulates manually the product id in url like:
+	 * /products/23?3
+	 * to
+	 * /products/24?3
+	 * then Wicket will create a new page that will show product=24
 	 */
 	@Test
 	public void decode4()
@@ -175,13 +190,15 @@ public class MountedMapperTest extends AbstractMapperTest
 		IRequestHandler handler = encoder.mapRequest(getRequest(url));
 
 		assertThat(handler, instanceOf(RenderPageRequestHandler.class));
-		IRequestablePage page = ((RenderPageRequestHandler)handler).getPage();
-		checkPage(page, 15);
+		RenderPageRequestHandler h = (RenderPageRequestHandler) handler;
+		((PageProvider) h.getPageProvider()).setPageSource(context);
+		IRequestablePage page = h.getPage();
+		checkPage(page, 1);
 
 		PageParameters p = page.getPageParameters();
-		assertEquals(0, p.getIndexedCount());
+		assertEquals(2, p.getIndexedCount());
 
-		assertEquals(0, p.getNamedKeys().size());
+		assertEquals(2, p.getNamedKeys().size());
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/a53591f0/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
index 2a4635b..e469b10 100644
--- a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
@@ -167,7 +167,11 @@ public class PackageMapperTest extends AbstractMapperTest
 	}
 
 	/**
+	 * The tests resolves pages by id as if they were existed in the page store.
+	 * These pages have no page parameters (i.e. page.getPageParameters() == null).
 	 *
+	 * The request that the encoder does also has no parameters (neither in the path
+	 * nor in the query string) so the resolved page is assumed to be valid.
 	 */
 	@Test
 	public void decode3()
@@ -181,7 +185,18 @@ public class PackageMapperTest extends AbstractMapperTest
 	}
 
 	/**
+	 * The tests resolves pages by id as if they were existed in the page store.
+	 * These pages have no page parameters (i.e. page.getPageParameters() == null).
 	 *
+	 * Since Wicket 7.0.0 (WICKET-4441) if a new request to hybrid url
+	 * (a url with both mount path and pageId) has different page parameters
+	 * than the resolved page then a new page instance with the new parameters
+	 * is created.
+	 * This way if a user manipulates manually the product id in url like:
+	 * /mount/path/Products/23?3
+	 * to
+	 * /mount/path/Products/24?3
+	 * then Wicket will create a new page that will show product=24
 	 */
 	@Test
 	public void decode4()
@@ -190,13 +205,15 @@ public class PackageMapperTest extends AbstractMapperTest
 		IRequestHandler handler = encoder.mapRequest(getRequest(url));
 
 		assertThat(handler, instanceOf(RenderPageRequestHandler.class));
-		IRequestablePage page = ((RenderPageRequestHandler)handler).getPage();
-		checkPage(page, 15);
+		RenderPageRequestHandler h = (RenderPageRequestHandler) handler;
+		((PageProvider) h.getPageProvider()).setPageSource(context);
+		IRequestablePage page = h.getPage();
+		checkPage(page, 1);
 
 		PageParameters p = page.getPageParameters();
-		assertEquals(0, p.getIndexedCount());
+		assertEquals(2, p.getIndexedCount());
 
-		assertEquals(0, p.getNamedKeys().size());
+		assertEquals(2, p.getNamedKeys().size());
 	}
 
 	/**


[6/7] git commit: Merge branch 'master' into sandbox/preserve-page-parameters-and-execute-listener-interface-after-expiration

Posted by mg...@apache.org.
Merge branch 'master' into sandbox/preserve-page-parameters-and-execute-listener-interface-after-expiration


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/79ba3381
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/79ba3381
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/79ba3381

Branch: refs/heads/master
Commit: 79ba33817899b5921a1864da9fc39e5f5a97395b
Parents: 4299d74 60d3009
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Jan 16 12:51:18 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Thu Jan 16 12:51:18 2014 +0200

----------------------------------------------------------------------
 .../src/main/java/org/apache/wicket/Page.java   |  3 +
 .../wicket/ajax/res/js/wicket-event-jquery.js   | 26 +++++-
 .../ListenerInterfaceRequestHandler.java        | 98 ++++++++++----------
 .../markup/html/form/NumberTextField.java       | 16 +++-
 .../wicket/request/cycle/RequestCycle.java      |  6 +-
 .../request/resource/PackageResource.java       |  6 +-
 .../apache/wicket/settings/PageSettings.java    |  2 +-
 .../ListenerInterfaceRequestHandlerTest.java    | 31 ++++++-
 .../markup/html/form/NumberTextFieldTest.java   | 34 ++++++-
 .../wicket/request/cycle/UrlRendererTest.java   | 11 +++
 wicket-core/src/test/js/event.js                | 20 ++++
 .../ajax/markup/html/modal/res/modal.js         | 18 ++--
 .../org/apache/wicket/request/UrlRenderer.java  |  4 +-
 .../util/resource/ResourceStreamWrapper.java    |  2 +-
 14 files changed, 203 insertions(+), 74 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/79ba3381/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java
----------------------------------------------------------------------
diff --cc wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java
index 76fa264,1e24206..0ddb30b
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java
@@@ -172,68 -172,62 +172,66 @@@ public class ListenerInterfaceRequestHa
  			component = null;
  		}
  
- 		if ((component == null && freshPage) ||
- 			(component != null && getComponent().getPage() == page))
+ 		if ((component == null && !freshPage) || (component != null && component.getPage() != page))
  		{
- 			if (page instanceof Page)
- 			{
- 				// initialize the page to be able to check whether it is stateless
- 				((Page)page).internalInitialize();
- 			}
- 			final boolean isStateless = page.isPageStateless();
+ 			throw new WicketRuntimeException("Component '" + getComponentPath()
+ 				+ "' has been removed from page.");
+ 		}
+ 
+ 		if (page instanceof Page)
+ 		{
+ 			// initialize the page to be able to check whether it is stateless
+ 			((Page)page).internalInitialize();
+ 		}
+ 		final boolean isStateless = page.isPageStateless();
+ 
+ 		RedirectPolicy policy = isStateless
+ 			? RedirectPolicy.NEVER_REDIRECT
+ 			: RedirectPolicy.AUTO_REDIRECT;
+ 		final IPageProvider pageProvider = new PageProvider(page);
  
- 			RedirectPolicy policy = isStateless ? RedirectPolicy.NEVER_REDIRECT
- 				: RedirectPolicy.AUTO_REDIRECT;
- 			final IPageProvider pageProvider = new PageProvider(page);
 -		if (freshPage && (isStateless == false || component == null))
++		final boolean canCallListenerInterfaceAfterExpiry = component != null
++				? component.canCallListenerInterfaceAfterExpiry()
++				: false;
 +
- 			final boolean canCallListenerInterfaceAfterExpiry = component != null
- 					? component.canCallListenerInterfaceAfterExpiry()
- 					: false;
- 			if (!canCallListenerInterfaceAfterExpiry && freshPage && (isStateless == false || component == null))
++		if (!canCallListenerInterfaceAfterExpiry && freshPage && (isStateless == false || component == null))
+ 		{
+ 			// A listener interface is invoked on an expired page.
+ 
+ 			// If the page is stateful then we cannot assume that the listener interface is
+ 			// invoked on its initial state (right after page initialization) and that its
+ 			// component and/or behavior will be available. That's why the listener interface
+ 			// should be ignored and the best we can do is to re-paint the newly constructed
+ 			// page.
+ 
+ 			if (LOG.isDebugEnabled())
  			{
- 				// A listener interface is invoked on an expired page.
- 
- 				// If the page is stateful then we cannot assume that the listener interface is
- 				// invoked on its initial state (right after page initialization) and that its
- 				// component and/or behavior will be available. That's why the listener interface
- 				// should be ignored and the best we can do is to re-paint the newly constructed
- 				// page.
- 
- 				if (LOG.isDebugEnabled())
- 				{
- 					LOG.debug(
- 						"A ListenerInterface '{}' assigned to '{}' is executed on an expired stateful page. "
- 							+ "Scheduling re-create of the page and ignoring the listener interface...",
- 						listenerInterface, getComponentPath());
- 				}
- 
- 				if (isAjax)
- 				{
- 					policy = RedirectPolicy.ALWAYS_REDIRECT;
- 				}
- 
- 				requestCycle.scheduleRequestHandlerAfterCurrent(new RenderPageRequestHandler(
- 					pageProvider, policy));
- 				return;
+ 				LOG.debug(
+ 					"A ListenerInterface '{}' assigned to '{}' is executed on an expired stateful page. "
+ 						+ "Scheduling re-create of the page and ignoring the listener interface...",
+ 					listenerInterface, getComponentPath());
  			}
  
- 			if (isAjax == false && listenerInterface.isRenderPageAfterInvocation())
+ 			if (isAjax)
  			{
- 				// schedule page render after current request handler is done. this can be
- 				// overridden during invocation of listener
- 				// method (i.e. by calling RequestCycle#setResponsePage)
- 				requestCycle.scheduleRequestHandlerAfterCurrent(new RenderPageRequestHandler(
- 					pageProvider, policy));
+ 				policy = RedirectPolicy.ALWAYS_REDIRECT;
  			}
  
- 			invokeListener();
- 
+ 			requestCycle.scheduleRequestHandlerAfterCurrent(new RenderPageRequestHandler(
+ 				pageProvider, policy));
+ 			return;
  		}
- 		else
+ 
+ 		if (isAjax == false && listenerInterface.isRenderPageAfterInvocation())
  		{
- 			throw new WicketRuntimeException("Component " + getComponent() +
- 				" has been removed from page.");
+ 			// schedule page render after current request handler is done. this can be
+ 			// overridden during invocation of listener
+ 			// method (i.e. by calling RequestCycle#setResponsePage)
+ 			requestCycle.scheduleRequestHandlerAfterCurrent(new RenderPageRequestHandler(
+ 				pageProvider, policy));
  		}
+ 
+ 		invokeListener();
  	}
  
  	private void invokeListener()

http://git-wip-us.apache.org/repos/asf/wicket/blob/79ba3381/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java
----------------------------------------------------------------------
diff --cc wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java
index 8070359,19ddaa0..aa8a351
--- a/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java
+++ b/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java
@@@ -121,29 -115,4 +121,29 @@@ public class PageSetting
  	{
  		this.recreateMountedPagesAfterExpiry = recreateMountedPagesAfterExpiry;
  	}
 +
 +	/**
 +	 * @return {@code true} if Wicket should execute the listener interface of a component
 +	 *      which owner page is freshly created after expiration of the old one
 +	 * @see #getRecreateMountedPagesAfterExpiry()
 +	 * @see org.apache.wicket.request.component.IRequestableComponent#canCallListenerInterfaceAfterExpiry()
 +	 */
 +	public boolean getCallListenerInterfaceAfterExpiry()
 +	{
 +		return recreateMountedPagesAfterExpiry && callListenerInterfaceAfterExpiry;
 +	}
 +
 +	/**
 +	 * Sets a setting that determines whether Wicket should execute the listener interface of a component
 +	 * which owner page is freshly created after expiration of the old one
 +	 *
 +	 * @param callListenerInterfaceAfterExpiry
 +	 *          {@code true} if Wicket should execute the listener interface
- 	 * @see #setRecreateMountedPagesAfterExpiry(boolean) 
++	 * @see #setRecreateMountedPagesAfterExpiry(boolean)
 +	 * @see org.apache.wicket.request.component.IRequestableComponent#canCallListenerInterfaceAfterExpiry()
 +	 */
 +	public void setCallListenerInterfaceAfterExpiry(boolean callListenerInterfaceAfterExpiry)
 +	{
 +		this.callListenerInterfaceAfterExpiry = callListenerInterfaceAfterExpiry;
 +	}
  }


[5/7] git commit: WICKET-5068 PageParameters missing from re-created Page WICKET-5070 Optionally execute Callback Behavior on Re-construction after Expiry WICKET-5001 Recovery of bookmarkable Page after Session Expiry

Posted by mg...@apache.org.
WICKET-5068 PageParameters missing from re-created Page
WICKET-5070 Optionally execute Callback Behavior on Re-construction after Expiry
WICKET-5001 Recovery of bookmarkable Page after Session Expiry

Rename the new setting to be Java bean complaint

suggested-by: Sven Meier


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/4299d74c
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/4299d74c
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/4299d74c

Branch: refs/heads/master
Commit: 4299d74c9c1d7fcc90485af7a8f8e4a4d5c19f5b
Parents: 565346c
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Jan 16 12:41:24 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Thu Jan 16 12:41:24 2014 +0200

----------------------------------------------------------------------
 .../main/java/org/apache/wicket/Component.java  |  2 +-
 .../apache/wicket/settings/PageSettings.java    | 25 ++++++++++++++++----
 .../PageExpirationRecoveryTest.java             |  4 ++--
 3 files changed, 23 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/4299d74c/wicket-core/src/main/java/org/apache/wicket/Component.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Component.java b/wicket-core/src/main/java/org/apache/wicket/Component.java
index 62d67ac..25cb11f 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Component.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Component.java
@@ -4554,6 +4554,6 @@ public abstract class Component
 	@Override
 	public boolean canCallListenerInterfaceAfterExpiry()
 	{
-		return getApplication().getPageSettings().canCallListenerInterfaceAfterExpiry();
+		return getApplication().getPageSettings().getCallListenerInterfaceAfterExpiry();
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/4299d74c/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java b/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java
index 9fafe1d..8070359 100644
--- a/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java
+++ b/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java
@@ -48,7 +48,7 @@ public class PageSettings
 	 * determines whether component's listener interface can be executed
 	 * when its owner page is freshly created after expiration
 	 */
-	private boolean canCallListenerInterfaceAfterExpiry = false;
+	private boolean callListenerInterfaceAfterExpiry = false;
 
 	/**
 	 * Adds a component resolver to the list.
@@ -122,13 +122,28 @@ public class PageSettings
 		this.recreateMountedPagesAfterExpiry = recreateMountedPagesAfterExpiry;
 	}
 
-	public boolean canCallListenerInterfaceAfterExpiry()
+	/**
+	 * @return {@code true} if Wicket should execute the listener interface of a component
+	 *      which owner page is freshly created after expiration of the old one
+	 * @see #getRecreateMountedPagesAfterExpiry()
+	 * @see org.apache.wicket.request.component.IRequestableComponent#canCallListenerInterfaceAfterExpiry()
+	 */
+	public boolean getCallListenerInterfaceAfterExpiry()
 	{
-		return recreateMountedPagesAfterExpiry && canCallListenerInterfaceAfterExpiry;
+		return recreateMountedPagesAfterExpiry && callListenerInterfaceAfterExpiry;
 	}
 
-	public void setCanCallListenerInterfaceAfterExpiry(boolean canCallListenerInterfaceAfterExpiry)
+	/**
+	 * Sets a setting that determines whether Wicket should execute the listener interface of a component
+	 * which owner page is freshly created after expiration of the old one
+	 *
+	 * @param callListenerInterfaceAfterExpiry
+	 *          {@code true} if Wicket should execute the listener interface
+	 * @see #setRecreateMountedPagesAfterExpiry(boolean) 
+	 * @see org.apache.wicket.request.component.IRequestableComponent#canCallListenerInterfaceAfterExpiry()
+	 */
+	public void setCallListenerInterfaceAfterExpiry(boolean callListenerInterfaceAfterExpiry)
 	{
-		this.canCallListenerInterfaceAfterExpiry = canCallListenerInterfaceAfterExpiry;
+		this.callListenerInterfaceAfterExpiry = callListenerInterfaceAfterExpiry;
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/4299d74c/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/PageExpirationRecoveryTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/PageExpirationRecoveryTest.java b/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/PageExpirationRecoveryTest.java
index ef929fae..67c4b46 100644
--- a/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/PageExpirationRecoveryTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/PageExpirationRecoveryTest.java
@@ -67,7 +67,7 @@ public class PageExpirationRecoveryTest extends WicketTestCase
 	{
 		PageSettings pageSettings = tester.getApplication().getPageSettings();
 		pageSettings.setRecreateMountedPagesAfterExpiry(true); // CAN recreate
-		pageSettings.setCanCallListenerInterfaceAfterExpiry(false); // CANNOT execute listener interfaces
+		pageSettings.setCallListenerInterfaceAfterExpiry(false); // CANNOT execute listener interfaces
 
 		ExpirationRecoveryPage page = tester.startPage(ExpirationRecoveryPage.class, parameters);
 		assertEquals(parameters, page.getPageParameters());
@@ -123,7 +123,7 @@ public class PageExpirationRecoveryTest extends WicketTestCase
 	public void canExecuteListenerInterface()
 	{
 		PageSettings pageSettings = tester.getApplication().getPageSettings();
-		pageSettings.setCanCallListenerInterfaceAfterExpiry(true);
+		pageSettings.setCallListenerInterfaceAfterExpiry(true);
 		pageSettings.setRecreateMountedPagesAfterExpiry(true);
 
 		ExpirationRecoveryPage page = tester.startPage(ExpirationRecoveryPage.class, parameters);


[7/7] git commit: Merge branch 'sandbox/preserve-page-parameters-and-execute-listener-interface-after-expiration' into sandbox/WICKET-4441-create-new-page-hybrid-url-with-different-parameters

Posted by mg...@apache.org.
Merge branch 'sandbox/preserve-page-parameters-and-execute-listener-interface-after-expiration' into sandbox/WICKET-4441-create-new-page-hybrid-url-with-different-parameters


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/aa84e95a
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/aa84e95a
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/aa84e95a

Branch: refs/heads/master
Commit: aa84e95aba7b5c776395832fb3ad375e405e3cc5
Parents: a53591f 79ba338
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Jan 16 12:52:40 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Thu Jan 16 12:52:40 2014 +0200

----------------------------------------------------------------------
 .../main/java/org/apache/wicket/Component.java  |  2 +-
 .../src/main/java/org/apache/wicket/Page.java   |  3 +
 .../wicket/ajax/res/js/wicket-event-jquery.js   | 26 +++++-
 .../ListenerInterfaceRequestHandler.java        | 98 ++++++++++----------
 .../markup/html/form/NumberTextField.java       | 16 +++-
 .../wicket/request/cycle/RequestCycle.java      |  6 +-
 .../request/resource/PackageResource.java       |  6 +-
 .../apache/wicket/settings/PageSettings.java    | 25 ++++-
 .../ListenerInterfaceRequestHandlerTest.java    | 31 ++++++-
 .../markup/html/form/NumberTextFieldTest.java   | 34 ++++++-
 .../PageExpirationRecoveryTest.java             |  4 +-
 .../wicket/request/cycle/UrlRendererTest.java   | 11 +++
 wicket-core/src/test/js/event.js                | 20 ++++
 .../ajax/markup/html/modal/res/modal.js         | 18 ++--
 .../org/apache/wicket/request/UrlRenderer.java  |  4 +-
 .../util/resource/ResourceStreamWrapper.java    |  2 +-
 16 files changed, 225 insertions(+), 81 deletions(-)
----------------------------------------------------------------------



[3/7] git commit: WICKET-5068 PageParameters missing from re-created Page WICKET-5070 Optionally execute Callback Behavior on Re-construction after Expiry WICKET-5001 Recovery of bookmarkable Page after Session Expiry

Posted by mg...@apache.org.
WICKET-5068 PageParameters missing from re-created Page
WICKET-5070 Optionally execute Callback Behavior on Re-construction after Expiry
WICKET-5001 Recovery of bookmarkable Page after Session Expiry

Add unit tests


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/565346ca
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/565346ca
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/565346ca

Branch: refs/heads/master
Commit: 565346ca9ac147b2360880f5147d016443f2197a
Parents: a1f8626
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Mon Jan 13 18:37:48 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Mon Jan 13 18:37:48 2014 +0200

----------------------------------------------------------------------
 .../apache/wicket/settings/PageSettings.java    |   2 +-
 .../wicket/util/tester/BaseWicketTester.java    |   4 +-
 .../ExpirationRecoveryPage.html                 |  34 ++++
 .../ExpirationRecoveryPage.java                 | 124 +++++++++++++
 .../PageExpirationRecoveryTest.java             | 176 +++++++++++++++++++
 5 files changed, 337 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/565346ca/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java b/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java
index 6096d1d..9fafe1d 100644
--- a/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java
+++ b/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java
@@ -124,7 +124,7 @@ public class PageSettings
 
 	public boolean canCallListenerInterfaceAfterExpiry()
 	{
-		return canCallListenerInterfaceAfterExpiry;
+		return recreateMountedPagesAfterExpiry && canCallListenerInterfaceAfterExpiry;
 	}
 
 	public void setCanCallListenerInterfaceAfterExpiry(boolean canCallListenerInterfaceAfterExpiry)

http://git-wip-us.apache.org/repos/asf/wicket/blob/565346ca/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
index 1603d08..50678d5 100644
--- a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
+++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
@@ -1793,7 +1793,7 @@ public class BaseWicketTester
 			}
 
 			List<AjaxEventBehavior> behaviors = WicketTesterHelper.findAjaxEventBehaviors(
-				linkComponent, "onclick");
+				linkComponent, "click");
 			for (AjaxEventBehavior behavior : behaviors)
 			{
 				executeBehavior(behavior);
@@ -1805,7 +1805,7 @@ public class BaseWicketTester
 		else if (linkComponent instanceof AjaxFallbackLink && isAjax)
 		{
 			List<AjaxEventBehavior> behaviors = WicketTesterHelper.findAjaxEventBehaviors(
-				linkComponent, "onclick");
+				linkComponent, "click");
 			for (AjaxEventBehavior behavior : behaviors)
 			{
 				executeBehavior(behavior);

http://git-wip-us.apache.org/repos/asf/wicket/blob/565346ca/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/ExpirationRecoveryPage.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/ExpirationRecoveryPage.html b/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/ExpirationRecoveryPage.html
new file mode 100644
index 0000000..339a336
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/ExpirationRecoveryPage.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org">
+<head>
+    <meta charset="utf-8" />
+    <title>Apache Wicket Quickstart</title>
+    <link href='http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz:regular,bold' rel='stylesheet' type='text/css' />
+    <link rel="stylesheet" href="style.css" type="text/css" media="screen" title="Stylesheet" />
+</head>
+<body>
+<div id="hd">
+    <div id="logo">
+        <img src="logo.png" width="50px" height="50px" alt="Wicket Logo" />
+        <h1>Apache Wicket</h1>
+    </div>
+</div>
+<div id="bd">
+    <h2>Congratulations!</h2>
+
+    <form wicket:id="f">
+        <input type="text" wicket:id="text"/>
+        <a wicket:id="sl">Submit link</a>
+        <a wicket:id="asl">Ajax Submit link</a>
+    </form>
+
+    <br><br><br><br>
+    <a wicket:id="link">Link</a>
+
+    <br><br><br><br>
+    <a wicket:id="alink">Ajax Link</a>
+</div>
+<div id="ft">
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/565346ca/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/ExpirationRecoveryPage.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/ExpirationRecoveryPage.java b/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/ExpirationRecoveryPage.java
new file mode 100644
index 0000000..889a69e
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/ExpirationRecoveryPage.java
@@ -0,0 +1,124 @@
+/*
+ * 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.page.expirationrecovery;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.SubmitLink;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+/**
+ * Test page for PageExpirationRecoveryTest
+ */
+public class ExpirationRecoveryPage extends WebPage
+{
+	final IModel<String> textModel = Model.of("texttt");
+	final AtomicBoolean formSubmitted = new AtomicBoolean(false);
+	final AtomicBoolean submitLinkSubmitted = new AtomicBoolean(false);
+	// Execution of Ajax callbacks doesn't record the newly created page in
+	// org.apache.wicket.util.tester.BaseWicketTester.LastPageRecordingPageRendererProvider
+	// so we need to use static fields
+	static final AtomicBoolean ajaxSubmitLinkSubmitted = new AtomicBoolean(false);
+	static final AtomicBoolean ajaxLinkClicked = new AtomicBoolean(false);
+	final AtomicBoolean linkClicked = new AtomicBoolean(false);
+
+	public ExpirationRecoveryPage(final PageParameters parameters)
+	{
+		super(parameters);
+
+		Form f;
+		add(f = createForm("f"), createLink("link"), createAjaxLink("alink"));
+
+		f.add(new TextField<>("text", textModel), createSubmitLink("sl"), createAjaxSubmitLink("asl"));
+    }
+
+	private Form createForm(String id)
+	{
+		return new Form(id)
+		{
+			@Override
+			protected void onSubmit()
+			{
+				super.onSubmit();
+
+				formSubmitted.set(true);
+			}
+		};
+	}
+
+	private AjaxSubmitLink createAjaxSubmitLink(String id)
+	{
+		return new AjaxSubmitLink(id)
+		{
+			@Override
+			protected void onSubmit(AjaxRequestTarget target, Form<?> form)
+			{
+				super.onSubmit(target, form);
+				ajaxSubmitLinkSubmitted.set(true);
+			}
+
+		};
+	}
+
+	private SubmitLink createSubmitLink(String id)
+	{
+		return new SubmitLink(id)
+		{
+			@Override
+			public void onSubmit()
+			{
+				super.onSubmit();
+				submitLinkSubmitted.set(true);
+			}
+
+		};
+	}
+
+	private Component createAjaxLink(String id)
+	{
+		return new AjaxLink<Void>(id)
+		{
+			@Override
+			public void onClick(AjaxRequestTarget target)
+			{
+				ajaxLinkClicked.set(true);
+			}
+		};
+	}
+
+	private Link<Void> createLink(String id)
+	{
+		return new Link<Void>(id)
+		{
+			@Override
+			public void onClick()
+			{
+				linkClicked.set(true);
+			}
+		};
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/565346ca/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/PageExpirationRecoveryTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/PageExpirationRecoveryTest.java b/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/PageExpirationRecoveryTest.java
new file mode 100644
index 0000000..ef929fae
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/PageExpirationRecoveryTest.java
@@ -0,0 +1,176 @@
+/*
+ * 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.page.expirationrecovery;
+
+import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.protocol.http.PageExpiredException;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.settings.PageSettings;
+import org.apache.wicket.util.tester.FormTester;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests for
+ * WICKET-5068 PageParameters missing from re-created Page
+ * WICKET-5070 Optionally execute Callback Behavior on Re-construction after Expiry
+ * WICKET-5001 Recovery of bookmarkable Page after Session Expiry
+ */
+public class PageExpirationRecoveryTest extends WicketTestCase
+{
+
+	private final PageParameters parameters = new PageParameters().set("a", "b").set("c", "d");
+
+	@Before
+	public void before()
+	{
+		tester.getApplication().mountPage("under/test", ExpirationRecoveryPage.class);
+
+		// Execution of Ajax callbacks doesn't record the newly created page in
+		// org.apache.wicket.util.tester.BaseWicketTester.LastPageRecordingPageRendererProvider
+		// so we need to use static fields
+		ExpirationRecoveryPage.ajaxLinkClicked.set(false);
+		ExpirationRecoveryPage.ajaxSubmitLinkSubmitted.set(false);
+	}
+
+	@Test(expected = PageExpiredException.class)
+	public void cannotRecreatePageShouldThrowPEE()
+	{
+		PageSettings pageSettings = tester.getApplication().getPageSettings();
+		pageSettings.setRecreateMountedPagesAfterExpiry(false); // CANNOT recreate
+
+		ExpirationRecoveryPage page = tester.startPage(ExpirationRecoveryPage.class, parameters);
+		assertEquals(parameters, page.getPageParameters());
+
+		tester.getSession().invalidateNow();
+
+		assertFalse(page.linkClicked.get());
+		tester.clickLink("link", false); // leads to PageExpiredException
+	}
+
+	@Test
+	public void cannotExecuteListenerInterface()
+	{
+		PageSettings pageSettings = tester.getApplication().getPageSettings();
+		pageSettings.setRecreateMountedPagesAfterExpiry(true); // CAN recreate
+		pageSettings.setCanCallListenerInterfaceAfterExpiry(false); // CANNOT execute listener interfaces
+
+		ExpirationRecoveryPage page = tester.startPage(ExpirationRecoveryPage.class, parameters);
+		assertEquals(parameters, page.getPageParameters());
+
+
+		tester.getSession().invalidateNow();
+		assertFalse(page.linkClicked.get());
+		tester.clickLink("link", false);
+		page = (ExpirationRecoveryPage) tester.getLastRenderedPage();
+		// the page is properly recreated
+		assertEquals("PageParameters should be preserved", parameters, page.getPageParameters());
+		// but the listener interface is not executed
+		assertFalse("Link should not be clicked!", page.linkClicked.get());
+
+
+		tester.getSession().invalidateNow();
+		assertFalse(page.ajaxLinkClicked.get());
+		tester.clickLink("alink", true);
+		page = (ExpirationRecoveryPage) tester.getLastRenderedPage();
+		assertFalse("AjaxLink should not be clicked!", page.ajaxLinkClicked.get());
+		assertEquals("PageParameters should be preserved", parameters, page.getPageParameters());
+
+
+		tester.getSession().invalidateNow();
+		assertFalse(page.submitLinkSubmitted.get());
+		tester.clickLink("f:sl", false);
+		page = (ExpirationRecoveryPage) tester.getLastRenderedPage();
+		assertFalse("SubmitLink should not be submitted!", page.submitLinkSubmitted.get());
+		assertEquals("PageParameters should be preserved", parameters, page.getPageParameters());
+
+
+		tester.getSession().invalidateNow();
+		assertFalse(page.ajaxSubmitLinkSubmitted.get());
+		tester.clickLink("f:asl", true);
+		page = (ExpirationRecoveryPage) tester.getLastRenderedPage();
+		assertFalse("AjaxSubmitLink should not be submitted", page.ajaxSubmitLinkSubmitted.get());
+		assertEquals("PageParameters should be preserved", parameters, page.getPageParameters());
+
+
+		tester.getSession().invalidateNow();
+		assertFalse(page.formSubmitted.get());
+		String textOldValue = page.textModel.getObject();
+		FormTester formTester = tester.newFormTester("f");
+		formTester.setValue("text", "newValue");
+		formTester.submit();
+		page = (ExpirationRecoveryPage) tester.getLastRenderedPage();
+		assertFalse("Form should not be submitted", page.formSubmitted.get());
+		assertEquals("TextField's value should not be modified", textOldValue, page.textModel.getObject());
+		assertEquals("PageParameters should be preserved", parameters, page.getPageParameters());
+	}
+
+	@Test
+	public void canExecuteListenerInterface()
+	{
+		PageSettings pageSettings = tester.getApplication().getPageSettings();
+		pageSettings.setCanCallListenerInterfaceAfterExpiry(true);
+		pageSettings.setRecreateMountedPagesAfterExpiry(true);
+
+		ExpirationRecoveryPage page = tester.startPage(ExpirationRecoveryPage.class, parameters);
+		assertEquals(parameters, page.getPageParameters());
+
+
+		tester.getSession().invalidateNow();
+		assertFalse(page.linkClicked.get());
+		tester.clickLink("link", false);
+		page = (ExpirationRecoveryPage) tester.getLastRenderedPage();
+		assertTrue("Link should be clicked!", page.linkClicked.get());
+		assertEquals("PageParameters should be preserved", parameters, page.getPageParameters());
+
+
+		tester.getSession().invalidateNow();
+		assertFalse(page.ajaxLinkClicked.get());
+		tester.clickLink("alink", true);
+		page = (ExpirationRecoveryPage) tester.getLastRenderedPage();
+		assertTrue("AjaxLink should be clicked!", page.ajaxLinkClicked.get());
+		assertEquals("PageParameters should be preserved", parameters, page.getPageParameters());
+
+
+		tester.getSession().invalidateNow();
+		assertFalse(page.formSubmitted.get());
+		FormTester formTester = tester.newFormTester("f");
+		String newValue = "newValue";
+		formTester.setValue("text", newValue);
+		formTester.submit();
+		page = (ExpirationRecoveryPage) tester.getLastRenderedPage();
+		assertTrue("Form should be submitted", page.formSubmitted.get());
+		assertEquals("TextField's value should be modified", newValue, page.textModel.getObject());
+		assertEquals("PageParameters should be preserved", parameters, page.getPageParameters());
+
+
+		tester.getSession().invalidateNow();
+		assertFalse(page.submitLinkSubmitted.get());
+		tester.clickLink("f:sl", false);
+		page = (ExpirationRecoveryPage) tester.getLastRenderedPage();
+		assertTrue("SubmitLink should be submitted!", page.submitLinkSubmitted.get());
+		assertEquals("PageParameters should be preserved", parameters, page.getPageParameters());
+
+
+		tester.getSession().invalidateNow();
+		assertFalse(page.ajaxSubmitLinkSubmitted.get());
+		tester.clickLink("f:asl", true);
+		page = (ExpirationRecoveryPage) tester.getLastRenderedPage();
+		assertTrue("AjaxSubmitLink should be submitted", page.ajaxSubmitLinkSubmitted.get());
+		assertEquals("PageParameters should be preserved", parameters, page.getPageParameters());
+	}
+}


[2/7] git commit: WICKET-5068 PageParameters missing from re-created Page WICKET-5070 Optionally execute Callback Behavior on Re-construction after Expiry WICKET-5001 Recovery of bookmarkable Page after Session Expiry

Posted by mg...@apache.org.
WICKET-5068 PageParameters missing from re-created Page
WICKET-5070 Optionally execute Callback Behavior on Re-construction after Expiry
WICKET-5001 Recovery of bookmarkable Page after Session Expiry


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/a1f86262
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/a1f86262
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/a1f86262

Branch: refs/heads/master
Commit: a1f862629c223b675a31c4ba9fb7e07c27279090
Parents: ce702dc
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Mon Jan 13 15:52:17 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Mon Jan 13 15:52:17 2014 +0200

----------------------------------------------------------------------
 .../src/main/java/org/apache/wicket/Component.java  |  5 +++++
 .../handler/ListenerInterfaceRequestHandler.java    |  5 ++++-
 .../request/mapper/AbstractBookmarkableMapper.java  |  6 ------
 .../request/component/IRequestableComponent.java    |  6 ++++++
 .../org/apache/wicket/settings/PageSettings.java    | 16 ++++++++++++++++
 .../test/java/org/apache/wicket/MockComponent.java  |  6 ++++++
 .../core/request/mapper/PackageMapperTest.java      |  4 ++--
 .../markup/html/link/MountedPageLinkTest.java       |  4 +---
 8 files changed, 40 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/a1f86262/wicket-core/src/main/java/org/apache/wicket/Component.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Component.java b/wicket-core/src/main/java/org/apache/wicket/Component.java
index e139f99..62d67ac 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Component.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Component.java
@@ -4551,4 +4551,9 @@ public abstract class Component
 		return getBehaviors(null);
 	}
 
+	@Override
+	public boolean canCallListenerInterfaceAfterExpiry()
+	{
+		return getApplication().getPageSettings().canCallListenerInterfaceAfterExpiry();
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/a1f86262/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java
index 84592d7..76fa264 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java
@@ -186,7 +186,10 @@ public class ListenerInterfaceRequestHandler
 				: RedirectPolicy.AUTO_REDIRECT;
 			final IPageProvider pageProvider = new PageProvider(page);
 
-			if (freshPage && (isStateless == false || component == null))
+			final boolean canCallListenerInterfaceAfterExpiry = component != null
+					? component.canCallListenerInterfaceAfterExpiry()
+					: false;
+			if (!canCallListenerInterfaceAfterExpiry && freshPage && (isStateless == false || component == null))
 			{
 				// A listener interface is invoked on an expired page.
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/a1f86262/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
index 3e86718..5074ac0 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
@@ -279,12 +279,6 @@ public abstract class AbstractBookmarkableMapper extends AbstractComponentMapper
 
 		if (listenerInterface != null)
 		{
-			if (pageInfo.getPageId() != null)
-			{
-				// WICKET-4594 - ignore the parsed parameters for stateful pages
-				pageParameters = null;
-			}
-
 			PageAndComponentProvider provider = new PageAndComponentProvider(pageInfo.getPageId(),
 				pageClass, pageParameters, renderCount, componentInfo.getComponentPath());
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/a1f86262/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java b/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java
index adc0c9f..bea84e5 100644
--- a/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java
+++ b/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java
@@ -105,4 +105,10 @@ public interface IRequestableComponent
 	 * </p>
 	 */
 	void detach();
+
+	/**
+	 * @return {@code true} if it is save to call the listener interface on this component
+	 *      when the owner page is freshly created after expiration
+	 */
+	boolean canCallListenerInterfaceAfterExpiry();
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/a1f86262/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java b/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java
index 19ddaa0..6096d1d 100644
--- a/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java
+++ b/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java
@@ -45,6 +45,12 @@ public class PageSettings
 	private boolean recreateMountedPagesAfterExpiry = true;
 
 	/**
+	 * determines whether component's listener interface can be executed
+	 * when its owner page is freshly created after expiration
+	 */
+	private boolean canCallListenerInterfaceAfterExpiry = false;
+
+	/**
 	 * Adds a component resolver to the list.
 	 *
 	 * @param resolver
@@ -115,4 +121,14 @@ public class PageSettings
 	{
 		this.recreateMountedPagesAfterExpiry = recreateMountedPagesAfterExpiry;
 	}
+
+	public boolean canCallListenerInterfaceAfterExpiry()
+	{
+		return canCallListenerInterfaceAfterExpiry;
+	}
+
+	public void setCanCallListenerInterfaceAfterExpiry(boolean canCallListenerInterfaceAfterExpiry)
+	{
+		this.canCallListenerInterfaceAfterExpiry = canCallListenerInterfaceAfterExpiry;
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/a1f86262/wicket-core/src/test/java/org/apache/wicket/MockComponent.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/MockComponent.java b/wicket-core/src/test/java/org/apache/wicket/MockComponent.java
index aafe6e9..f0046f2 100644
--- a/wicket-core/src/test/java/org/apache/wicket/MockComponent.java
+++ b/wicket-core/src/test/java/org/apache/wicket/MockComponent.java
@@ -137,6 +137,12 @@ public class MockComponent implements IRequestableComponent
 	{
 	}
 
+	@Override
+	public boolean canCallListenerInterfaceAfterExpiry()
+	{
+		return false;
+	}
+
 	public boolean canCallListenerInterface()
 	{
 		return true;

http://git-wip-us.apache.org/repos/asf/wicket/blob/a1f86262/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
index bc2d8c4..2a4635b 100644
--- a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
@@ -239,9 +239,9 @@ public class PackageMapperTest extends AbstractMapperTest
 		assertEquals("foo:bar", h.getComponent().getPageRelativePath());
 
 		PageParameters p = h.getPageParameters();
-		assertEquals(0, p.getIndexedCount());
+		assertEquals(2, p.getIndexedCount());
 
-		assertEquals(0, p.getNamedKeys().size());
+		assertEquals(2, p.getNamedKeys().size());
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/a1f86262/wicket-core/src/test/java/org/apache/wicket/markup/html/link/MountedPageLinkTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/link/MountedPageLinkTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/link/MountedPageLinkTest.java
index 398638c..0093571 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/link/MountedPageLinkTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/link/MountedPageLinkTest.java
@@ -98,9 +98,7 @@ public class MountedPageLinkTest extends WicketTestCase
 		url = url.replace("?0", "?3");
 		tester.executeUrl(url);
 
-		// request parameters to callback urls should be ignored for the re-created page
-		// (WICKET-4594)
-		tester.assertContainsNot("param=value");
+		tester.assertContains("param=value");
 	}
 
 	/**