That makes sense, cloning as Niall does sound right (shucks, had it working and 
done!).

Simple question: how should the mapping be cloned?  I mean, clearly when I 
override processMapping() I'll just call the super version and then clone what 
I recieve and return that, but how should I literally do the clone?  clone() in 
Object it's just a shallow copy, correct?  Is 
org.apache.commons.beanutils.BeanUtils.cloneBean() the right answer?  Just want 
to be sure I'm not missing something else I should be using.

Thanks again for all the help guys, this all I think makes my project quite a 
bit more useful!

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

On Wed, February 2, 2005 2:37 pm, Joe Germuska said:
> I would recommend against unfreezing the ActionMappings; they are
> shared throughout the application, and you have no way of knowing
> whether some non-webservice request may come along in a minute and
> get the same ActionMapping instance and get stuck with an incorrect
> value for the "input" property.
> 
> As Niall mentioned (and I thought I did too, but maybe I just thought
> about mentioning it! ;-) ), it is possible to clone the ActionMapping
> and use a new instance for each request.  The precedent for this is
> already established by the ActionConfigMatcher which supports
> wild-card action mappings.
> 
>   Joe
> 
> 
> At 2:23 PM -0500 2/2/05, [EMAIL PROTECTED] wrote:
>>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]
> 
> 
> --
> 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