BeanUtils.cloneBean() would work but it probably won't copy the
ExceptionConfigs / ForwardConfigs associated with the ActionMapping as there
aren't appropriately named getters/setters - but you could use
BeanUtils.cloneBean() to copy the other and then retrieve the
ExceptionConfigs / ForwardConfigs from the original mapping and add them in
idividually - as long as you're not modifying any of them theres no need to
clone them.

As you say, its a shame we don't have a way of cloning already built in
(ActionForward does - through a constructor which takes an ActionForward).
If it was me I would just create my own custom ActionMapping and have a
constructor which takes an ActionConfig and clones all its properties.

Niall

----- Original Message ----- 
From: <[EMAIL PROTECTED]>
To: <dev@struts.apache.org>
Sent: Wednesday, February 02, 2005 7:57 PM
Subject: RE: Extending RequestProcessor to handle validation errors


> 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]



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

Reply via email to