Hi,
Yesterday while playing with the app from
http://www.jtict.com/blog/rails-wicket-grails-play-lift-jsp I found
that org.apache.wicket.page.PageAccessSynchronizer.lockPage(int) is
called as many times as PageProvider#getPage() is used.
So I did the following optimization:
Index:
wicket-core/src/main/java/org/apache/wicket/request/handler/PageProvider.java
===================================================================
---
wicket-core/src/main/java/org/apache/wicket/request/handler/PageProvider.java
(revision
1130015)
+++
wicket-core/src/main/java/org/apache/wicket/request/handler/PageProvider.java
(working
copy)
@@ -158,12 +158,13 @@
if (pageInstance == null)
{
pageInstance = getPageInstance(pageId, pageClass,
pageParameters,
renderCount);
+ if (pageInstance == null)
+ {
+ throw new PageExpiredException("Page expired.");
+ }
+ touchPageInstance(pageInstance);
}
- if (pageInstance == null)
- {
- throw new PageExpiredException("Page expired.");
- }
- touchPageInstance(pageInstance);
+
return pageInstance;
}
I.e. check whether to throw PageExpiredException or touch the page
only when it was just attempted to read from the page store, all
following calls to #getPage() work with the cached page (already
touched).
Everything is OK but just one test fails :
org.apache.wicket.ajax.InternalErrorCallsAjaxOnFailureTest.showsInternalErrorPage()
The problem is that
org.apache.wicket.markup.html.pages.ExceptionErrorPage.isVersioned()
returns false and this error page should not be stored.
org.apache.wicket.Page.dirty(boolean) takes into account isVersioned()
but
org.apache.wicket.request.handler.PageProvider.touchPageInstance(IRequestablePage)
doesn't and always marks the page as candidate for storing.
If above is a bug I suggest to add IManageblePage#dirty(boolean) and
use it instead session.getPageManager().touchPage(IRequestablePage).
--
Martin Grigorov
jWeekend
Training, Consulting, Development
http://jWeekend.com