I'm not saying that calling Actions from Actions is not a valid idea, just that your example was a good example of a place where action chaining could help. I agree with you that it's a danger of Action chaining to get too much business logic encapsulated in configuration files.
Along the lines of best practices, it might be a good idea to use Actions as entry points and encapsulate business logic in POJOs, which would allow you to re-arrange them however you need without having to call back through the ActionInvocation with all of the Interceptors, etc. Jason > -----Original Message----- > From: Matt Ho [mailto:[EMAIL PROTECTED] > Sent: Saturday, February 22, 2003 1:27 PM > To: [EMAIL PROTECTED] > Subject: RE: [OS-webwork] XWork: calling Actions from Actions > > > While I agree that multiple aliases is a good approach, > chaining is not. Chaining has the unfortunate effect of > spreading business logic over many configuration files which > is a Bad Thing(tm). It also puts some of the core business > logic into configuration files rather than the actions. It > also makes it difficult to use other people's packages if we > happen to share common names that mean different things. > > Ok, you've worn me down. I don't agree that shoehorning is > the right approach, but I'll relent and simply agree to disagree. > > -- > Matt Ho > Principal > Indigo Egg, Inc. > http://www.indigoegg.com/ > > > > -----Original Message----- > > From: [EMAIL PROTECTED] > > [mailto:[EMAIL PROTECTED] > On Behalf Of > > Jason Carreira > > Sent: Saturday, February 22, 2003 7:04 AM > > To: [EMAIL PROTECTED] > > Subject: RE: [OS-webwork] XWork: calling Actions from Actions > > > > Your example is better handled by different alias's with action > chaining > > as the result. > > > > > -----Original Message----- > > > From: Matt Ho [mailto:[EMAIL PROTECTED] > > > Sent: Saturday, February 22, 2003 3:57 AM > > > To: [EMAIL PROTECTED] > > > Subject: RE: [OS-webwork] XWork: calling Actions from Actions > > > > > > > > > Here's a specific case: > > > > > > A reservation system has the following actions, create, modify, > > > cancel, and lookup a reservation. All of which reasonably have > > > views. The modify view, however, can be created as a composite > > > using the other three views. > > > > > > Just like WW1.x allows me to embed actions within a page (even if > > > they have views defined), so do I think that WW2.x should allow > > > actions to be called from actions without additional > configurations. > > > > > > My proposal is this: > > > > > > * add a scope="..." to the interceptor where ... may be either > > > request or action. > > > * by default all interceptors are scoped action (essentially the > > > current > > > behavior) > > > * actions scoped as "request" are only executed on the > outer action > > > call > > > > > > If there's agreement, I'm more than happy to write this. > > > > > > -- > > > Matt Ho > > > Principal > > > Indigo Egg, Inc. > > > http://www.indigoegg.com/ > > > > > > > > > > -----Original Message----- > > > > From: [EMAIL PROTECTED] > > > > [mailto:[EMAIL PROTECTED] > > > On Behalf Of > > > > Jason Carreira > > > > Sent: Friday, February 21, 2003 9:37 PM > > > > To: [EMAIL PROTECTED] > > > > Subject: RE: [OS-webwork] XWork: calling Actions from Actions > > > > > > > > Or just one without the ResultInterceptor > > > > > > > > > -----Original Message----- > > > > > From: Patrick Lightbody [mailto:[EMAIL PROTECTED] > > > > > Sent: Saturday, February 22, 2003 12:34 AM > > > > > To: [EMAIL PROTECTED] > > > > > Subject: Re: [OS-webwork] XWork: calling Actions from Actions > > > > > > > > > > > > > > > My answer to this is, rather than complicate xwork, > why not just > > > > > recommend that "actions-within-actions" not utilize > actions that > > > > > have views associated with them? > > > > > > > > > > If you want to re-use two action _classes_, just make two > aliases > > > > > for the same class, one that has the view and one > that is used > > > > > internally. > > > > > > > > > > -Pat > > > > > > > > > > ----- Original Message ----- > > > > > From: "Matt Ho" <[EMAIL PROTECTED]> > > > > > To: <[EMAIL PROTECTED]> > > > > > Sent: Friday, February 21, 2003 9:07 PM > > > > > Subject: RE: [OS-webwork] XWork: calling Actions from Actions > > > > > > > > > > > > > > > > There's another issue too to consider that Patrick just > > > > > pointed out. > > > > > > Because the page is rendered by the ResultInterceptor, > > > calling an > > > > > > action from an action means that if the inner action has a > > > > > view, that > > > > > > view will be rendered first and then the outer view will be > > > render. > > > > > > > > > > > > We may want to consider giving Interceptors scope. A logic > > > > > set would > > > > > > be action scope and request scope so that 1 request may > > > > > have multiple > > > > > > actions. The ResultInterceptor could then be placed in > > > the result > > > > > > scope. > > > > > > > > > > > > Having the ResultInterceptor in the action scope is > > > going to make > > > > > > creating actions via composition difficult. > > > > > > > > > > > > -- > > > > > > Matt Ho > > > > > > Principal > > > > > > Indigo Egg, Inc. > > > > > > http://www.indigoegg.com/ > > > > > > > > > > > > > > > > > > > -----Original Message----- > > > > > > > From: [EMAIL PROTECTED] > > > > > > > [mailto:[EMAIL PROTECTED] > > > > > On Behalf > > > > > > > Of Jason Carreira > > > > > > > Sent: Friday, February 21, 2003 8:43 PM > > > > > > > To: [EMAIL PROTECTED] > > > > > > > Subject: RE: [OS-webwork] XWork: calling Actions from > Actions > > > > > > > > > > > > > > You do this: > > > > > > > > > > > > > > ActionInvocation.java > > > > > > > > > > > > > > private ActionContext parentContext; > > > > > > > > > > > > > > ... > > > > > > > > > > > > > > private void init() throws Exception { > > > > > > > ... > > > > > > > > > > > > > > parentContext = ActionContext.getContext(); > > > > > > > ActionContext context = new > ActionContext(contextMap); > > > > > > > ActionContext.setContext(context); > > > > > > > > > > > > > > ... > > > > > > > } > > > > > > > > > > > > > > public String invoke() throws Exception { > > > > > > > ... > > > > > > > > > > > > > > if (parentContext != null) { > > > > > > > ActionContext.setContext(parentContext); > > > > > > > } > > > > > > > > > > > > > > return result; > > > > > > > } > > > > > > > > > > > > > > Which should reset the ActionContext if it was nested. > > > > > > > > > > > > > > My only question here is, which Servlet containers > > > > > pooling threads, > > > > > > will > > > > > > > we get phantom ThreadLocals left over that get reset > > > after the > > > > > > > Action > > > > > > is > > > > > > > invoked? Also, if how can we reset the > ActionContext at the > > > right > > > > > > spot? > > > > > > > If we do it right after the Action is executed, then the > > > > > > > Interceptors, on the way back out, in their > after() methods, > > > will > > > > > > > have the wrong ActionContext. > > > > > > > > > > > > > > Jason > > > > > > > > > > > > > > > -----Original Message----- > > > > > > > > From: Matt Ho [mailto:[EMAIL PROTECTED] > > > > > > > > Sent: Friday, February 21, 2003 11:12 PM > > > > > > > > To: [EMAIL PROTECTED] > > > > > > > > Subject: RE: [OS-webwork] XWork: calling Actions > > > from Actions > > > > > > > > > > > > > > > > > > > > > > > > Without a lock or other reference, how do you know > > > that you're > > > > > > > > executing the inner action rather than the outer action? > > > > > > > > > > > > > > > > -- > > > > > > > > Matt Ho > > > > > > > > Principal > > > > > > > > Indigo Egg, Inc. > > > > > > > > http://www.indigoegg.com/ > > > > > > > > > > > > > > > > > > > > > > > > > -----Original Message----- > > > > > > > > > From: [EMAIL PROTECTED] > > > > > > > > > > [mailto:[EMAIL PROTECTED] > > > > > > > > On Behalf Of > > > > > > > > > Patrick Lightbody > > > > > > > > > Sent: Friday, February 21, 2003 8:01 PM > > > > > > > > > To: [EMAIL PROTECTED] > > > > > > > > > Subject: Re: [OS-webwork] XWork: calling Actions from > > > Actions > > > > > > > > > > > > > > > > > > We don't need locks, we just need ActionInvocation to > > > > > keep track > > > > > > of > > > > > > > > the > > > > > > > > > old > > > > > > > > > ActionContext associated with the thread, and when an > > > > > action is > > > > > > done > > > > > > > > being > > > > > > > > > executed, re-set it. I'll make sure that > > > > > Actions-within-Actions > > > > > > > > > is supported properly. > > > > > > > > > > > > > > > > > > -Pat > > > > > > > > > > > > > > > > > > ----- Original Message ----- > > > > > > > > > From: "Matt Ho" <[EMAIL PROTECTED]> > > > > > > > > > To: <[EMAIL PROTECTED]> > > > > > > > > > Sent: Friday, February 21, 2003 7:53 PM > > > > > > > > > Subject: RE: [OS-webwork] XWork: calling Actions from > > > Actions > > > > > > > > > > > > > > > > > > > > > > > > > > > > Here's a simple sequence diagram to help illustrate > > > > > the issue: > > > > > > > > > > > > > > > > > > > > MyAction AnotherAction > > > > > > > > > > | | > > > > > > > > > > | | > > > > > > > > > > exectute -->O | --- A > > > > > > > > > > O | > > > > > > > > > > O-- execute -->O --- B > > > > > > > > > > O O > > > > > > > > > > O O > > > > > > > > > > O<-------------O --- C > > > > > > > > > > O | > > > > > > > > > > O | --- D > > > > > > > > > > | | > > > > > > > > > > | | > > > > > > > > > > > > > > > > > > > > With the current implementation of > ActionContext as a > > > > > > ThreadLocal, > > > > > > > > if > > > > > > > > > > you attempt to call an action from within an > > > action, life > > > > > > > > works well > > > > > > > > > > until step C. Because step B sets the > ActionContext, > > > > > > > > when control > > > > > > > > > > returns to MyAction at point C, the ActionContext > > > > > is not what > > > > > > you > > > > > > > > > > expect. > > > > > > > > > > > > > > > > > > > > Setting up the ActionContext during the > invoke() could > > > work: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > private static ThreadLocal lock ; > > > > > > > > > > > > > > > > > > > > static { > > > > > > > > > > lock = new ThreadLocal() ; > > > > > > > > > > lock.set(new Lock()) ; > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > public static class Lock { > > > > > > > > > > private boolean locked = false; > > > > > > > > > > > > > > > > > > > > private boolean acquired() { > > > > > > > > > > if( !locked ) { > > > > > > > > > > return true; > > > > > > > > > > } else { > > > > > > > > > > return false; > > > > > > > > > > } > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > private void release() { > > > > > > > > > > locked = false; > > > > > > > > > > > > > > > > > > > > } > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > public void invoke() throws Exception { > > > > > > > > > > Lock lock = (Lock)lock.get() ; > > > > > > > > > > boolean haveLock = lock.acquire() ; > > > > > > > > > > > > > > > > > > > > if( haveLock ) { > > > > > > > > > > // nest storage > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > try { > > > > > > > > > > ... execute my action > > > > > > > > > > } finally { > > > > > > > > > > lock.release() ; > > > > > > > > > > } > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > -- > > > > > > > > > > Matt Ho > > > > > > > > > > Principal > > > > > > > > > > Indigo Egg, Inc. > > > > > > > > > > http://www.indigoegg.com/ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -----Original Message----- > > > > > > > > > > > From: > [EMAIL PROTECTED] > > > > > > > > > > > > > > > > [mailto:[EMAIL PROTECTED] On > > > > > > > > Behalf Of > > > > > > > > > > > Jason Carreira > > > > > > > > > > > Sent: Friday, February 21, 2003 7:18 PM > > > > > > > > > > > To: [EMAIL PROTECTED] > > > > > > > > > > > Subject: RE: [OS-webwork] XWork: calling Actions > from > > > > > > > > > > > Actions > > > > > > > > > > > > > > > > > > > > > > So it would nest it during init and unnest at > > > the end of > > > > > > invoke, > > > > > > > > or > > > > > > > > > > > when? > > > > > > > > > > > > > > > > > > > > > > > -----Original Message----- > > > > > > > > > > > > From: Patrick Lightbody > [mailto:[EMAIL PROTECTED] > > > > > > > > > > > > Sent: Friday, February 21, 2003 8:05 PM > > > > > > > > > > > > To: [EMAIL PROTECTED] > > > > > > > > > > > > Subject: Re: [OS-webwork] XWork: calling > > > Actions from > > > > > > Actions > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Couldn't ActionInvocation just do nested storage > of > > > the > > > > > > > > > > > > ActionContext, just like GenericDispatcher did? > > > > > > > > > > > > > > > > > > > > > > > > -Pat > > > > > > > > > > > > > > > > > > > > > > > > ----- Original Message ----- > > > > > > > > > > > > From: "Jason Carreira" > <[EMAIL PROTECTED]> > > > > > > > > > > > > To: <[EMAIL PROTECTED]> > > > > > > > > > > > > Sent: Thursday, February 20, 2003 12:20 PM > > > > > > > > > > > > Subject: RE: [OS-webwork] XWork: calling > > > Actions from > > > > > > Actions > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Patrick, this came up while you were gone. > > > > > Did you have > > > > > > any > > > > > > > > > > > > thoughts > > > > > > > > > > > > > on this? In order to be able to do this > > > easily, we'd > > > > > > > > > > > > > need > > > > > > > > > > > > to pull the > > > > > > > > > > > > > ActionContext initialization out of the > > > > > ActionInvocation > > > > > > > > > > > > > initialization, so you can use one > ActionContext > > > > > > > > for multiple > > > > > > > > > > > > > invocations. Matt didn't like the option where > you > > > do: > > > > > > > > > > > > > > > > > > > > > > > > > > ActionContext myContext = > > > ActionContext.getContext(); > > > > > > > > > > > > ActionInvocation > > > > > > > > > > > > > anotherInvocation = new > > > > > > > > > > > > > > ActionInvocation("someNamespace","anotherAction"); > > > > > > > > > > > > > String otherResult = > anotherInvocation.invoke(); > > > > > > > > > > > > > ActionContext.setContext(myContext); > > > > > > > > > > > > > > > > > > > > > > > > > > Which would be needed to save the current > context, > > > > > > > > then re-set > > > > > > > > it > > > > > > > > > > > > > after invoking the other action... This is not > > > really > > > > > > > > > > > > pretty, but as > > > > > > > > > > > > > I'm thinking about it, it could be a helper > method > > > in > > > > > > > > > > > > ActionSupport... > > > > > > > > > > > > > > > > > > > > > > > > > > Jason > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ------------------------------------------------------- > > > > > > > > > > > > This SF.net email is sponsored by: SlickEdit > > > > > Inc. Develop > > > > > > > > > > > > an edge. The most comprehensive and flexible > > > > > code editor > > > > > > > > > > > > you > > > > > > can > > > > > > > > > > > > use. Code faster. C/C++, C#, Java, > HTML, XML, many > > > more. > > > > > > FREE > > > > > > > > > > > > 30-Day Trial. www.slickedit.com/sourceforge > > > > > > > > > > > > _______________________________________________ > > > > > > > > > > > > Opensymphony-webwork mailing list > > > > > > > > > > > > [EMAIL PROTECTED] > > > > > > > > > > > > > > > > > > > > > > > > > > https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ------------------------------------------------------- > > > > > > > > > > > This SF.net email is sponsored by: SlickEdit Inc. > > > > > > > > Develop an edge. > > > > > > > > > > > The most comprehensive and flexible code > > > editor you can > > > > > > > > use. Code > > > > > > > > > > > faster. C/C++, C#, Java, HTML, XML, many > more. FREE > > > 30-Day > > > > > > > > Trial. > > > > > > > > > > > www.slickedit.com/sourceforge > > > > > > > > > > > _______________________________________________ > > > > > > > > > > > Opensymphony-webwork mailing list > > > > > > > > > > > [EMAIL PROTECTED] > > > > > > > > > > > > > > > > > > > https://lists.sourceforge.net/lists/listinfo/o> > > > > > > > > pensymphony-webwork > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ------------------------------------------------------- > > > > > > > > > > This SF.net email is sponsored by: SlickEdit > > > Inc. Develop > > > > > > > > an edge. > > > > > > > > > > The most comprehensive and flexible code editor you > can > > > use. > > > > > > Code > > > > > > > > > > faster. C/C++, C#, Java, HTML, XML, many more. > > > FREE 30-Day > > > > > > > > Trial. > > > > > > > > > > www.slickedit.com/sourceforge > > > > > > > > > > _______________________________________________ > > > > > > > > > > Opensymphony-webwork mailing list > > > > > > > > > > [EMAIL PROTECTED] > > > > > > > > > > > > > > > > > > > https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ------------------------------------------------------- > > > > > > > > > This SF.net email is sponsored by: SlickEdit Inc. > Develop > > > > > > > > an edge. The > > > > > > > > > most comprehensive and flexible code editor > you can use. > > > > > > > > Code faster. > > > > > > > > > C/C++, C#, Java, HTML, XML, many more. FREE 30-Day > Trial. > > > > > > > > > www.slickedit.com/sourceforge > > > > > > > > > _______________________________________________ > > > > > > > > > Opensymphony-webwork mailing list > > > > > > > > > [EMAIL PROTECTED] > > > > > > > > > > > > > > > https://lists.sourceforge.net/lists/listinfo/opensymphony-webwor > > > > > > > > > k > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ------------------------------------------------------- > > > > > > > > This SF.net email is sponsored by: SlickEdit Inc. > > > > > Develop an edge. > > > > > > > > The most comprehensive and flexible code editor you can > > > > > use. Code > > > > > > > > faster. C/C++, C#, Java, HTML, XML, many more. FREE > > > > > 30-Day Trial. > > > > > > > > www.slickedit.com/sourceforge > > > > > > > > _______________________________________________ > > > > > > > > Opensymphony-webwork mailing list > > > > > > > > [EMAIL PROTECTED] > > > > > > > > > > > > > https://lists.sourceforge.net/lists/listinfo/opensymphony-webw > > > > ork > > > > > > > > > > > > > > > > > > > > > > > > > ------------------------------------------------------- > > > > > > This SF.net email is sponsored by: SlickEdit Inc. > > > Develop an edge. > > > > > > The most comprehensive and flexible code editor you can > > > use. Code > > > > > > faster. C/C++, C#, Java, HTML, XML, many more. FREE > > > 30-Day Trial. > > > > > > www.slickedit.com/sourceforge > > > > > > _______________________________________________ > > > > > > Opensymphony-webwork mailing list > > > > > > [EMAIL PROTECTED] > > > > > > > > > https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork > > > > > > > > > > > > > > > > > > > > > > > > > ------------------------------------------------------- > > > > > This SF.net email is sponsored by: SlickEdit Inc. Develop an > edge. > > > The > > > > > > > > > most comprehensive and flexible code editor you can use. Code > > > faster. > > > > > C/C++, C#, Java, HTML, XML, many more. FREE 30-Day Trial. > > > > > www.slickedit.com/sourceforge > > > > > _______________________________________________ > > > > > Opensymphony-webwork mailing list > > > > > [EMAIL PROTECTED] > > > > > > https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork > > > > > > > > > > > > > > > > ------------------------------------------------------- > > > > This SF.net email is sponsored by: SlickEdit Inc. Develop > > > an edge. The > > > > most comprehensive and flexible code editor you can use. > > > Code faster. > > > > C/C++, C#, Java, HTML, XML, many more. FREE 30-Day Trial. > > > > www.slickedit.com/sourceforge > > > > _______________________________________________ > > > > Opensymphony-webwork mailing list > > > > [EMAIL PROTECTED] > > > > > https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork > > > > > > > > > > > > ------------------------------------------------------- > > > > This SF.net email is sponsored by: SlickEdit Inc. Develop > > > an edge. The > > > > most comprehensive and flexible code editor you can use. > > > Code faster. > > > > C/C++, C#, Java, HTML, XML, many more. FREE 30-Day Trial. > > > > www.slickedit.com/sourceforge > > > > _______________________________________________ > > > > Opensymphony-webwork mailing list > > > > [EMAIL PROTECTED] > > > > > https://lists.sourceforge.net/lists/listinfo/o> pensymphony-webwork > > > > > > > > > > > > > > > ------------------------------------------------------- > > > This SF.net email is sponsored by: SlickEdit Inc. Develop > an edge. > > > The most comprehensive and flexible code editor you can use. Code > > > faster. C/C++, C#, Java, HTML, XML, many more. FREE 30-Day Trial. > > > www.slickedit.com/sourceforge > > > _______________________________________________ > > > Opensymphony-webwork mailing list > > > [EMAIL PROTECTED] > > > https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork > > > > > > > > > ------------------------------------------------------- > > This SF.net email is sponsored by: SlickEdit Inc. Develop > an edge. The > > most comprehensive and flexible code editor you can use. > Code faster. > > C/C++, C#, Java, HTML, XML, many more. FREE 30-Day Trial. > > www.slickedit.com/sourceforge > > _______________________________________________ > > Opensymphony-webwork mailing list > > [EMAIL PROTECTED] > > https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork > > > > > ------------------------------------------------------- > This SF.net email is sponsored by: SlickEdit Inc. Develop an > edge. The most comprehensive and flexible code editor you can > use. Code faster. C/C++, C#, Java, HTML, XML, many more. FREE > 30-Day Trial. www.slickedit.com/sourceforge > _______________________________________________ > Opensymphony-webwork mailing list > [EMAIL PROTECTED] > https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork > ------------------------------------------------------- This SF.net email is sponsored by: SlickEdit Inc. Develop an edge. The most comprehensive and flexible code editor you can use. Code faster. C/C++, C#, Java, HTML, XML, many more. FREE 30-Day Trial. www.slickedit.com/sourceforge _______________________________________________ Opensymphony-webwork mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork