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]