1 Reply Latest reply on Feb 17, 2007 6:08 PM by quilleashm

    New conversation variable stack component (proposal)

      Hi all,

      Was going to put this in JIRA (will shortly) but I thought I'd float the idea here first to kick it around a bit.

      At the moment it is quite tricky and/or cumbersome to pass arbitrary values up and down a nested conversation stack (@Begin(nested = true)) in a generic manner.

      In the simplest terms I often want to be able to pass information up (to parents) or down (to nested children) in the conversation stack.

      Currently this is usually achieved by an action method in a component setting/accessing a variable on itself or another component (for passing information "up") or by using request parameters/page parameters.

      This is fine for tightly coupled pages/components that "know" about each other and what will be in scope when, but for loosely coupled pages/components in a generic framework this doesn't work so well. (Like the Seam framework with generic EntityHome and Query components).

      For example creating or editing an entity that has a many-to-one association may require navigating to a search page for the "one" side of relationship to be selected. Combos boxes are not always sufficient due to lack of searching and large numbers of items. Similarly after editing and saving an entity it may be useful to pass information about the new entity state up to the search that originated the edit. These are simple examples but you get the idea (I hope!)

      A possible approach to solve this would involve introducing a "NestedConversationStack" component. The component would be conversation scoped and would allow addition and retrieval of variables by key at any level of the conversation stack. A more advanced implementation might involve a sub-scoping of a variable when it is added to only allow conversations above/below the current one to be able to access the variable. (possible sub-scoping options might be ALL, CHILD, PARENT, DESCENDENTS, ANCESTORS)

      A more thorough example...

      User opens Entity A Search. Conversation (1) begins.

      Selects an existing item to edit (would probably use a request parameter but could insert the required entity id into the stack with CHILD scope)

      Redirect to Entity A Detail. Nested conversation (2) begins. Detail component extracts entity id and loads entity from DB.

      User clicks a button to go to a sub-search for an associated to Entity B. (insert arbitrary restrictions on which B entities are allowed, like a filter, into the stack with CHILD scope)

      Redirect to Entity B Search. Nested conversation (3) begins. (search component extracts filter and applies to search).

      User selects an Entity B and clicks OK. (insert selected entity into stack with PARENT scope).

      Nested conversation (3) ends. Redirect back to Entity A Detail. (extracts selected entity and updates association to Entity B).

      User clicks OK. Data saved to DB. (could insert the updated entity here with PARENT scope if the search was interested).

      Nested conversation (2) ends. Redirect back to Entity A Search.

      Eventually conversation (1) ends or times out and the component will be destroyed.

      My motivation for this is because I am building a mini-framework (similar to Seam framework) as a platform for building web products on. The idea being the framework handles most of the tedium of data binding/validation and the tricky stuff like conversation handling/page redirects etc. The big piece I have missing is a method for arbitrary information passing between the different pages (99% of which are some derative of a search or detail page and will use the framework) in a generic fashion when a nested conversation is active Search -> Detail -> Search -> Search etc.

      Any feedback or thoughts on this appreciated.

      Any clarification needed pls ask and I will attempt to explain better! :)