page validation

"Joseph Panico" <[email protected]> Fri, 10 Jan 2003 15:26:20 +0000
Newsgroups gmane.comp.java.tapestry.devel
Message-ID <[email protected]>
Yep, the old horse of page validation is still alive!

Last year there was a lot of discussion about fixing IPage.validate(). But 
I'm not sure we ever firmly arrived at a consensus solution, and it appears 
that validate() still works the same way in 2.3. So I would like to try to 
stimulate an improvement for 2.4.

In summary: IPage.validate() is automatically called by any of the page 
oriented services (Direct, Action, Page, External, Home, Reset). So when 
Tapestry is handling the page navigation for you, at this high level, you 
are guaranteed to have your method invoked. However, it's quite common for 
developers to come up with more sophisticated navigation schemes that 
require effecting page transitions with calls to cycle.setPage(), which 
bypasses the validation mechanism. So there is a "mismatch"-- sometimes 
validate() gets called and sometimes it doesn't. Worse still, tapestry 
newbies are unlikely to realize this and wonder why their validation schemes 
don't work (which is what happened to me originally).

I know that a *lot* of people have encountered this problem and rolled their 
own solutions. Can we come up with a consensus for how it should work and 
then get the new design in 2.4?

Mindbridge had a very sensible sounding suggestion, namely:

One approach to resolve these issues that we use here locally is to add the 
method
activate() to the pages and invoke it instead of calling setPage():

page.activate(cycle);

A possible implementation could be something like this:

public void activate(IRequestCycle cycle) throws RequestCycleException
{
   try {
     this.validate(cycle);
     cycle.setPage(this);
   }
   catch (PageRedirectException e) {
     IPage page = cycle.getPage(e.getTargetPageName());
     page.activate(cycle);
   }
}

This looks like a pretty good solution, and I'm using it now. The only 
weakness I can see is that activate() will not get called by the page 
oriented services, and so if you rely on activate for something other than 
validation (via overriding, let's say), you are hosed. One solution to that 
problem would be to modify the implementations of the page services to use 
activate().

thoughts?

Joseph Panico
[email protected]



_________________________________________________________________
Help STOP SPAM: Try the new MSN 8 and get 2 months FREE* 
http://join.msn.com/?page=features/junkmail



-------------------------------------------------------
This SF.NET email is sponsored by:
SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
http://www.vasoftware.com