Excellent point!  It's done.

-- 
Frank W. Zammetti
Founder and Chief Software Architect
Omnytex Technologies
http://www.omnytex.com

On Wed, February 2, 2005 2:23 pm, [EMAIL PROTECTED] said:
> i might put that freeze in a finally block, if you're gonna do something
> nasty,
> better make sure you leave no footprints. :)
> 
> 
> if (request is a web service) {
>   try {
>     ACUnfreezer.unfreeze(mapping);
>     mapping.setInput(the new JSP to go to in case of validation errors);
>   } finally {
>     mapping.freeze(); // Just for good measure
>   }
> }
> 
> 
> Quoting [EMAIL PROTECTED]:
> 
>> GOT IT!
>>
>> But, this might be the worst piece of hackery I've ever done.  Check it
>> out...
>>
>> Joe's last response spurred me to realize that if I could override the
>> input
>> field of the ActionMapping, I could do what I want.  As I thought,
>> processPreprocess() fires before processValidate(), which means I can
>> identify a Web Service request in processValidate() based on some
>> attributes
>> I set in processPreprocess().
>>
>> The problem as I discovered is that I can't just call setInput() in
>> processValidate() because the configuration is frozen at that point. 
>> And,
>> since the RequestProcessor isn't in the same package as ActionConfig
>> (where
>> setInput() is found), I couldn't call setInput() since it's protected.
>>
>> So, enter the hackery of the following class...
>>
>> package org.apache.struts.config;
>>
>> import org.apache.struts.action.ActionMapping;
>> public class ACUnfreezer {
>>   public static void unfreeze(ActionMapping mapping) {
>>     mapping.configured = false;
>>   }
>> }
>>
>> So, in processValidate(), I simply do:
>>
>> if (request is a web service) [
>>   ACUnfreezer.unfreeze(mapping);
>>   mapping.setInput(the new JSP to go to in case of validation errors);
>>   mapping.freeze(); // Just for good measure
>> }
>> return super.processValidate(request, response, form, mapping);
>>
>> So, regular requests work as before, and the Web Service requests will
>> be
>> redirected if validation errors occur. Beautiful!
>>
>> In an EXTREMELY hacky kind of way!
>>
>> Thanks for the talkback Paul and Joe, I'm not sure how long it would
>> have
>> taken on my own to get to this solution, if at all.  Of course, I
>> suppose
>> that means you have to accept some of the blame for such a hack-job :)
>>
>> --
>> Frank W. Zammetti
>> Founder and Chief Software Architect
>> Omnytex Technologies
>> http://www.omnytex.com
>>
>> On Wed, February 2, 2005 1:10 pm, Joe Germuska said:
>> > This actually stimulated another thought.  Perhaps instead of
>> > overriding process validate, you could arrange to have your
>> > ActionMappings dynamically instantiated with the correct value for
>> > "input" (assuming that you can know it before you do the validation.)
>> >
>> > There is nothing sacred about the original instances of ActionMapping
>> > which are created by processing the struts-config file.  The wildcard
>> > mapping support results in dynamic construction of ActionMappings
>> > which have parameters replaced according to the wildcard match.
>> >
>> > You could either use your own ModuleConfig implementation with a
>> > custom implementation of findActionConfig(path) or, if the
>> > determination of the input depends on request data as well as the
>> > path, override processMapping in the RequestProcessor.
>> >
>> > I still think using the ComposableRequestProcessor is an easier
>> solution!
>> >
>> > Joe
>> >
>> >
>> > At 12:46 PM -0500 2/2/05, Benedict, Paul C wrote:
>> >>Frank,
>> >>
>> >>I am not sure of why you need this solution. I never came across your
>> >> need
>> >>-- and perhaps because I never encountered the problem.
>> >>
>> >>I can't imagine why you would want to dynamically control the input
>> page.
>> >>For instance, I use MappingDispatchAction and each action entry has
>> its
>> >> own
>> >>specified input and success forward.
>> >>
>> >>Is your question actually posed by a misdesign?
>> >>
>> >>Thanks,
>> >>Paul
>> >>
>> >>-----Original Message-----
>> >>From: Frank W. Zammetti (MLists) [mailto:[EMAIL PROTECTED]
>> >>Sent: Wednesday, February 02, 2005 12:39 PM
>> >>To: dev@struts.apache.org
>> >>Subject: Extending RequestProcessor to handle validation errors
>> >>
>> >>
>> >>Hi folks... I'm working on an update of my Struts Web Services
>> project,
>> >>and I can't seem to work out how to do something...
>> >>
>> >>What I want to do is have a way to redirect to a given JSP when
>> >> ActionForm
>> >>validation errors occur that will OVERRIDE whatever might be
>> configured
>> >> in
>> >>the action mapping.  In other words... in a normal application,
>> >> validation
>> >>errors occur and we get forwarded back to the input page.  I want to
>> be
>> >>able to redirect to a different JSP, REGARDLESS of what the input page
>> >> is.
>> >>
>> >>I looked at overriding the processValidate() method of
>> RequestProcessor,
>> >>but I don't see how that can work... Looking at the source of the
>> >> original
>> >>RP (v1.1 this all is) I see that it does the forward and then returns
>> a
>> >>boolean, true if no errors occur or false otherwise, so it doesn't
>> look
>> >>like I have the opportunity to do something like the following
>> >>psuedo-code:
>> >>
>> >>myOverriden_ProcessValidate() {
>> >>
>> >>   boolean b = super.processValidate();
>> >>   if (!b) {
>> >>     forward to my jsp
>> >>   }
>> >>
>> >>}
>> >>
>> >>... because by the time I hit my check of b, the forward or redirect
>> has
>> >>already been done.  Is it possible to override the forward or redirect
>> >>that the super.processValidate() could do?  I didn't think so.  Am I
>> >>missing the obvious somewhere on how to do this, or maybe I'm barking
>> up
>> >>the wrong tree to begin with?  Thanks all!
>> >>
>> >>--
>> >>Frank W. Zammetti
>> >>Founder and Chief Software Architect
>> >>Omnytex Technologies
>> >>http://www.omnytex.com
>> >>
>> >>---------------------------------------------------------------------
>> >>To unsubscribe, e-mail: [EMAIL PROTECTED]
>> >>For additional commands, e-mail: [EMAIL PROTECTED]
>> >>
>> >>
>> >>
>> >>
>>
>>>------------------------------------------------------------------------------
>> >>Notice:  This e-mail message, together with any attachments,
>> >>contains information of Merck & Co., Inc. (One Merck Drive,
>> >>Whitehouse Station, New Jersey, USA 08889), and/or its affiliates
>> >>(which may be known outside the United States as Merck Frosst, Merck
>> >>Sharp & Dohme or MSD and in Japan, as Banyu) that may be
>> >>confidential, proprietary copyrighted and/or legally privileged. It
>> >>is intended solely for the use of the individual or entity named on
>> >>this message.  If you are not the intended recipient, and have
>> >>received this message in error, please notify us immediately by
>> >>reply e-mail and then delete it from your system.
>>
>>>------------------------------------------------------------------------------
>> >>
>> >>---------------------------------------------------------------------
>> >>To unsubscribe, e-mail: [EMAIL PROTECTED]
>> >>For additional commands, e-mail: [EMAIL PROTECTED]
>> >
>> >
>> > --
>> > Joe Germuska
>> > [EMAIL PROTECTED]
>> > http://blog.germuska.com
>> > "Narrow minds are weapons made for mass destruction"  -The Ex
>> >
>>
>>
> 
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to