This problem seems to affect both the current management of the explicit
conversation id (@Begin(id=...)) and the future solution (with the declaration
in the pages.xml).
Seam 1.2.1 seems to be unable to restore the current state of a conversation in
this way:
I made three simple POJOs:
ActionOne.java:
| @Name("actionOne")
| @Scope(ScopeType.CONVERSATION)
| public class ActionOne {
|
| private List<String> starttimes;
| private int counter = 0;
|
| @Create
| public void createit() {
| starttimes = new ArrayList<String>();
| starttimes.add("Executing ActionOne @Create method");
| }
|
| // @Begin I don't know if this is needed or not, anyway, it does not work
now both if it is
| // present or not
| public String startConversation() {
| Logger.getLogger(this.getClass()).info("<ACTIONONE> START
CONVERSATION METHOD CALLED");
|
| Logger.getLogger(this.getClass()).info("<START CONVERSATION> IS
THERE A LONG RUNNING CONVERSATION: " + (Conversation.instance().isLongRunning()
? "YES" : "NO"));
| Logger.getLogger(this.getClass()).info("<START CONVERSATION> IS
THERE A NESTED CONVERSATION: " + (Conversation.instance().isNested() ? "YES" :
"NO"));
| Logger.getLogger(this.getClass()).info("<START CONVERSATION>
LONG RUNNING CONVERSATION ID IS: " + Conversation.instance().getId());
| Logger.getLogger(this.getClass()).info("<START CONVERSATION>
LONG RUNNING CONVERSATION VIEW ID IS: " + Conversation.instance().getViewId());
| Logger.getLogger(this.getClass()).info("<START CONVERSATION>
LONG RUNNING CONVERSATION DESCRIPTION IS: " +
Conversation.instance().getDescription());
|
| return "one";
| }
|
| @End
| public String endConversation() {
| Logger.getLogger(this.getClass()).info("<ACTIONONE> END
CONVERSATION METHOD CALLED");
| return "one";
| }
|
| /**
| * starttimes member Getter
| *
| * @return starttimes member
| */
| public List<String> getStarttimes() {
| return starttimes;
| }
|
| /**
| * starttimes member Setter
| *
| * @param starttimes New value for the starttimes member
| */
| public void setStarttimes(List<String> starttimes) {
| this.starttimes = starttimes;
| }
|
| public String doIt() {
| counter++;
| starttimes.add("ACTIONONE DOIT CALLED " + counter + " TIMES!");
|
|
| Logger.getLogger(this.getClass()).info("<DOIT> IS THERE A LONG
RUNNING CONVERSATION: " + (Conversation.instance().isLongRunning() ? "YES" :
"NO"));
| Logger.getLogger(this.getClass()).info("<DOIT> IS THERE A
NESTED CONVERSATION: " + (Conversation.instance().isNested() ? "YES" : "NO"));
| Logger.getLogger(this.getClass()).info("<DOIT> LONG RUNNING
CONVERSATION ID IS: " + Conversation.instance().getId());
| Logger.getLogger(this.getClass()).info("<DOIT> LONG RUNNING
CONVERSATION VIEW ID IS: " + Conversation.instance().getViewId());
| Logger.getLogger(this.getClass()).info("<DOIT> LONG RUNNING
CONVERSATION DESCRIPTION IS: " + Conversation.instance().getDescription());
|
| return "one";
| }
| }
|
ActionTwo.java:
| @Name("actionTwo")
| @Scope(ScopeType.CONVERSATION)
| public class ActionTwo {
|
| private List<String> starttimes;
| private int counter = 0;
|
|
| @Create
| public void createit() {
| starttimes = new ArrayList<String>();
| starttimes.add("<ACTIONTWO> Executing ActionTwo @Create
method");
| }
|
| @Begin(id="myid2")
| public String startConversation() {
| Logger.getLogger(this.getClass()).info("<ACTIONTWO> START
CONVERSATION METHOD CALLED");
|
| Logger.getLogger(this.getClass()).info("<START CONVERSATION> IS
THERE A LONG RUNNING CONVERSATION: " + (Conversation.instance().isLongRunning()
? "YES" : "NO"));
| Logger.getLogger(this.getClass()).info("<START CONVERSATION> IS
THERE A NESTED CONVERSATION: " + (Conversation.instance().isNested() ? "YES" :
"NO"));
| Logger.getLogger(this.getClass()).info("<START CONVERSATION>
LONG RUNNING CONVERSATION ID IS: " + Conversation.instance().getId());
| Logger.getLogger(this.getClass()).info("<START CONVERSATION>
LONG RUNNING CONVERSATION VIEW ID IS: " + Conversation.instance().getViewId());
| Logger.getLogger(this.getClass()).info("<START CONVERSATION>
LONG RUNNING CONVERSATION DESCRIPTION IS: " +
Conversation.instance().getDescription());
|
| return "two";
| }
|
| @End @Remove @Destroy
| public String endConversation() {
| Logger.getLogger(this.getClass()).info("<ACTIONTWO> END
CONVERSATION METHOD CALLED");
| return "two";
| }
|
| /**
| * starttimes member Getter
| *
| * @return starttimes member
| */
| public List<String> getStarttimes() {
| return starttimes;
| }
|
| /**
| * starttimes member Setter
| *
| * @param starttimes New value for the starttimes member
| */
| public void setStarttimes(List<String> starttimes) {
| this.starttimes = starttimes;
| }
|
| public String doIt() {
| counter++;
| starttimes.add("ACTIONTWO DOIT CALLED " + counter + " TIMES!");
|
| Logger.getLogger(this.getClass()).info("<DOIT> IS THERE A LONG
RUNNING CONVERSATION: " + (Conversation.instance().isLongRunning() ? "YES" :
"NO"));
| Logger.getLogger(this.getClass()).info("<DOIT> IS THERE A
NESTED CONVERSATION: " + (Conversation.instance().isNested() ? "YES" : "NO"));
| Logger.getLogger(this.getClass()).info("<DOIT> LONG RUNNING
CONVERSATION ID IS: " + Conversation.instance().getId());
| Logger.getLogger(this.getClass()).info("<DOIT> LONG RUNNING
CONVERSATION VIEW ID IS: " + Conversation.instance().getViewId());
| Logger.getLogger(this.getClass()).info("<DOIT> LONG RUNNING
CONVERSATION DESCRIPTION IS: " + Conversation.instance().getDescription());
|
| return "two";
| }
|
|
| }
|
ActionThree.java:
| @Name("actionThree")
| @Scope(ScopeType.CONVERSATION)
| public class ActionThree {
|
| private List<String> starttimes;
| private int counter = 0;
|
| @Begin
| public String startConversation() {
| Logger.getLogger(this.getClass()).info("<ACTIONTHREE> START
CONVERSATION METHOD CALLED");
| starttimes = new ArrayList<String>();
| starttimes.add("Executing ActionThree @Begin method");
|
| Logger.getLogger(this.getClass()).info("<START CONVERSATION> IS
THERE A LONG RUNNING CONVERSATION: " + (Conversation.instance().isLongRunning()
? "YES" : "NO"));
| Logger.getLogger(this.getClass()).info("<START CONVERSATION> IS
THERE A NESTED CONVERSATION: " + (Conversation.instance().isNested() ? "YES" :
"NO"));
| Logger.getLogger(this.getClass()).info("<START CONVERSATION>
LONG RUNNING CONVERSATION ID IS: " + Conversation.instance().getId());
| Logger.getLogger(this.getClass()).info("<START CONVERSATION>
LONG RUNNING CONVERSATION VIEW ID IS: " + Conversation.instance().getViewId());
| Logger.getLogger(this.getClass()).info("<START CONVERSATION>
LONG RUNNING CONVERSATION DESCRIPTION IS: " +
Conversation.instance().getDescription());
|
| return "three";
| }
|
| @End
| public String endConversation() {
| Logger.getLogger(this.getClass()).info("<ACTIONTHREE> END
CONVERSATION METHOD CALLED");
| return "three";
| }
|
| /**
| * starttimes member Getter
| *
| * @return starttimes member
| */
| public List<String> getStarttimes() {
| return starttimes;
| }
|
| /**
| * starttimes member Setter
| *
| * @param starttimes New value for the starttimes member
| */
| public void setStarttimes(List<String> starttimes) {
| this.starttimes = starttimes;
| }
|
| public String doIt() {
| counter++;
| starttimes.add("ACTIONTHREE DOIT CALLED " + counter + "
TIMES!");
|
| Logger.getLogger(this.getClass()).info("<DOIT> IS THERE A LONG
RUNNING CONVERSATION: " + (Conversation.instance().isLongRunning() ? "YES" :
"NO"));
| Logger.getLogger(this.getClass()).info("<DOIT> IS THERE A
NESTED CONVERSATION: " + (Conversation.instance().isNested() ? "YES" : "NO"));
| Logger.getLogger(this.getClass()).info("<DOIT> LONG RUNNING
CONVERSATION ID IS: " + Conversation.instance().getId());
| Logger.getLogger(this.getClass()).info("<DOIT> LONG RUNNING
CONVERSATION VIEW ID IS: " + Conversation.instance().getViewId());
| Logger.getLogger(this.getClass()).info("<DOIT> LONG RUNNING
CONVERSATION DESCRIPTION IS: " + Conversation.instance().getDescription());
|
| return "three";
| }
|
|
| }
|
I configured the pages.xml in order to support the next explicit conversation
id feature:
pages.xml
| <!DOCTYPE pages PUBLIC
| "-//JBoss/Seam Pages Configuration DTD 1.1//EN"
| "http://jboss.com/products/seam/pages-1.2.dtd">
|
| <pages>
| <conversation name="convOne" parameter-name="aname"
parameter-value="#{sessionHandler.seqOne}" />
|
| <page view-id="/actionone.xhtml" conversation="convOne">
| </page>
|
| </pages>
|
the seqOne method simply returns a string with an incremental value postfix.
and added three links to call them all:
| <div id="control">
| <h:form>
| <table>
| <tr>
| <td>
| <h:outputText value="Press the
button to call the @Begin action of the actionOne conversation" />
| </td>
| </tr>
| <tr>
| <td>
| <h:commandLink
action="#{actionOne.startConversation}" value="Start Conversation with pages
conversation definition">
|
<s:conversationPropagation type="none" />
| </h:commandLink>
| </td>
| </tr>
| </table>
| </h:form>
| <h:form>
| <table>
| <tr>
| <td>
| <h:outputText value="Press the
button to call the @Begin action of the actionTwo conversation" />
| </td>
| </tr>
| <tr>
| <td>
| <h:commandLink
action="#{actionTwo.startConversation}" value="Start Conversation with static
@Begin(id='myId2')">
|
<s:conversationPropagation type="none" />
| </h:commandLink>
| </td>
| </tr>
| </table>
| </h:form>
| <h:form>
| <table>
| <tr>
| <td>
| <h:outputText value="Press the
button to call the @Begin action of the actionThree conversation" />
| </td>
| </tr>
| <tr>
| <td>
| <h:commandLink
action="#{actionThree.startConversation}" value="Start Conversation with
generated id">
|
<s:conversationPropagation type="none" />
| </h:commandLink>
| </td>
| </tr>
| </table>
| </h:form>
| </div>
|
disabling conversation propagation in order to avoid to ask for the LRC switch.
the three xhtml pages related to the components are almost identical and
trivial:
| <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
| <ui:composition xmlns="http://www.w3.org/1999/xhtml"
| xmlns:ui="http://java.sun.com/jsf/facelets"
| xmlns:h="http://java.sun.com/jsf/html"
| xmlns:f="http://java.sun.com/jsf/core"
| xmlns:s="http://jboss.com/products/seam/taglib"
| xmlns:c="http://java.sun.com/jstl/core"
| template="main.xhtml">
|
| <!-- context manager -->
| <ui:define name="actioncontent">
| <h:dataTable value="#{actionThree.starttimes}" var="iter">
| <h:column>
| <h:outputText value="#{iter}" />
| </h:column>
| </h:dataTable>
|
| <h:form>
| <s:link action="#{actionThree.doIt}">
| <h:outputText value="Press me I should run into
#{conversation.id} conversation" />
| </s:link>
| </h:form>
| </ui:define>
|
| </ui:composition>
|
Basically what I expect to obtain is this:
Clicking on one of the three links I start a conversation, then, clicking on
the doIt link see the list of strings to grow; unfortunately this is true only
in the third case (when the id is generated by Seam), both in the first and in
the second Seam seems to not bind the component to the conversation, indeed,
running test on the component instance two, when I click on the doIt link, I
read in the log this print:
| DEBUG [org.jboss.seam.core.Manager] Found conversation id in request
parameter: myid2
| DEBUG [org.jboss.seam.core.Manager] Restoring conversation with id: myid2
| DEBUG [org.jboss.seam.jsf.AbstractSeamPhaseListener] After restoring
conversation context: ConversationContext(myid2)
|
but the list does not grow, moreover if I create the list of strings in the
@Begin method (as I do in the third example) the doIt method fails with a
NullPointerException because the list is not present.
That's it. Is this a bug?
Two questions on conversation management:
- Can I expect that if I click say on the second link (the static id.. not
correct but to understand) Seam will understand that I'm asking for that
conversation and resumes it?
- Is it legal to use the Redirect API knowing the conversation id (regardless
generated or explicit) in order to redirect to that conversation?
Both the questions without a LRC in place (s:conversationPropagation
type="none")
Regards,
Raffaele Camanzo
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4032845#4032845
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4032845
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user