The more I think about it, the more I'd like to have named conversation. Since
I can mentally map a named conversation to a use case. What I get from named
conversation is more than just "exit to the entry point".
For now, in my own application, the "named conversation (use case)" is
implemented this way:
The application scoped enum UseCase
| public enum UseCase {
| doANewPlan, viewPastPlans, viewAllRecipes, viewAllFoods,....
| }
|
although the "viewPastPlans", "viewAllRecipes", "viewAllFoods" ... have only
"view" as a verb but in fact these use cases are deep having many sub usecases.
From the "viewPastPlans", user can click a recipe link and enter the
"recipe-detail.xhtml", there are CRUD option buttons/links which would be
rendered according to the current use case and user permssions on the
recipe-detail page. From the recipe-detail page user can enter the
food-detail.xhtml and again there are CRUD options available according to use
cases and user permissions. If I want to implement it, from the
food-detail.xhtml page a user can enter the nutrient-detail.xhtml...... All my
conversation beans such as planManager, recipeManager, foodManager ...... has
code like this inside the impl classes:
| private UseCase currentUseCase;
|
| public UseCase getCurrentUseCase(){return this.currentUseCase}
| public void setCurrentUseCase(UseCase motherUseCase){
| this.currentUseCase = motherUseCase;
| }
|
Here is some code example from my view code and pages.xhtml just to demonstrate
why knowing current use case is very useful
Code from the plan-detail.xhtml using use case information:
| <ui:composition xmlns="http://www.w3.org/1999/xhtml"
| xmlns:s="http://jboss.com/products/seam/taglib"
| xmlns:ui="http://java.sun.com/jsf/facelets"
| xmlns:f="http://java.sun.com/jsf/core"
| xmlns:h="http://java.sun.com/jsf/html"
| xmlns:rich="http://richfaces.ajax4jsf.org/rich"
| xmlns:a="https://ajax4jsf.dev.java.net/ajax"
| xmlns:p="http://jboss.com/products/seam/pdf">
|
| <!-- check loggedIn and permission-->
| ... ... ...
| ... ... ...
|
| <!-- ########### render shopping list on screen ############## -->
| <div class="section"><s:fragment
| rendered="#{recipePlanner.weeklyCookingPlan.renderShoppingList}">
| <h:outputText
| value="Amount in gram, price in Euro. Check the items you want to
| remove."
| class="message"
| rendered="#{recipePlanner.currentUseCase == useCases['doANewPlan']}"
/>
| <h:form>
| <rich:dataTable id="weeklyShoppingList"
| value="#{recipePlanner.weeklyCookingPlan.foods}" var="wf">
| <rich:column
| rendered="#{recipePlanner.currentUseCase ==
useCases.['doANewPlan']}">
| <f:facet name="header">
| <h:outputText value="Option" />
| </f:facet>
| <h:commandButton value="Remove"
action="#{recipePlanner.weeklyCookingPlan.removeAShoppingItem(wf)}" />
| </rich:column>
|
| <rich:column>
| <f:facet name="header">
| <h:outputText value="Food" />
| </f:facet>
| <h:outputText value="#{wf.food.longDesc}" />
| </rich:column>
|
| <rich:column>
| <f:facet name="header">
| <h:outputText value="Amount in gram" />
| </f:facet>
| <h:outputText value="#{wf.amountInGram}">
| <f:convertNumber type="number" maxFractionDigits="2" />
| </h:outputText>
| <h:outputText value=" g" />
| </rich:column>
|
| <rich:column>
| <f:facet name="header">
| <h:outputText value="Price per 100g" />
| </f:facet>
| <h:outputText value="#{wf.price}">
| <f:convertNumber pattern="? ###0.00" />
| </h:outputText>
| </rich:column>
|
| <rich:column>
| <f:facet name="header">
| <h:outputText value="Actual cost" />
| </f:facet>
| <h:outputText value="#{wf.amountInGram / 100 * wf.price}">
| <f:convertNumber pattern="? ###0.00" />
| </h:outputText>
| </rich:column>
| </rich:dataTable>
| </h:form>
| <div class="section"><h:outputText value="Total cost: " /> <h:outputText
| value="#{recipePlanner.weeklyCookingPlan.getTotalPrice()}">
| <f:convertNumber pattern="? ###0.00" />
| </h:outputText></div>
| </s:fragment></div>
| <!-- ####### end of render shopping list on screen ############## -->
| ... ... ...
| ... ... ...
| </ui:composition>
|
UseCase flags used in pages.xhtml:
| <page view-id="/recipe-detail.xhtml">
| <navigation from-action="#{recipeManager.quitRecipeDetail}">
| <rule if="#{recipeManager.currentUseCase ==
'viewAllRecipes'}">
| <redirect view-id="/all-recipes.xhtml" />
| </rule>
| <rule if="#{recipeManager.currentUseCase ==
'doANewPlan'}">
| <redirect view-id="/weekly-planner.xhtml" />
| </rule>
| <rule if="#{recipeManager.currentUseCase ==
'viewPastPlans'}">
| <redirect view-id="/my-past-plans.xhtml" />
| </rule>
| </navigation>
| </page>
|
The conversation beans (in my application they are manager beans) set each
other's the currentUseCase whenever there is any dependency between the
managers.....
This way the entity-oriented view code is very reusable. (a xxxx-detail.xhtml
page is in fact a view representation of an entity bean. There the basic CRUD
operation happens) Each useCase's view is simply composed with
xxxx-detail.xhtml pages with additional information. So far my code for the
views of useCases is very short. So I think syntax sugars for named
conversation would be very nice.
Regards,
Ellen
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4074217#4074217
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4074217
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user