First of all, I would like to say that the more I explore Seam and Icefaces,
the more I marvel at their fantastic features. They are really a good job! Seam
Conversations and Ice D2D concepts are brightly ideas.
However, I think the integration between these two powerful frameworks is
highly relevant and still deserves serious efforts. I've been using both
components in a big project at my company for six months and I'm getting
concerned about the hardly process to achieve stability during this period.
Sometimes I don't know who I should ask for help. Like me, the users community
is dreaming about make them talk to each other perfectly, as we can realize in
the projects forum posts.
Currently, for example, I am struggling with a strange situation at Icefaces v
1.6.0 DR#5 and Seam v. 1.2.1 GA (the latest ones at the moment).
- I have two pages. One shows a selectable list of some kind of object
(ListPage) and the other enables the edit of the selected one (EditPage).
- By the way, my project is configured to use Seam Managed Persistence and
Statefull Pageflow (JPDL).
- To support the ListPage I have a SSB default scoped backing bean
(FinderAction), that keeps DataModel, generates the query, and so on...
- To support the EditPage I have a SSB conversation scoped backing bean
(EditorActon), that "bijects" the entity bean selected from the list and allows
to update him.
It's simple to reproduce my main scenario:
1. From the ListPage grid I select a object (alfa) via s:link to open in a New
browser Tab.
** A long running conversation is created in a conversational scope (as I
checked at seam debug page) and the conversation Id is rendered as a hidden
input in the view (cid).
2. From the same ListPage grid I select other object (beta) via s:link to open
in another New browser Tab.
** New long running conversation and Id are created, too.
The situations are:
a) When I turn to the first EditPage (alfa object) and press any key at any
input field, all the form hidden inputs are simply initialized by Icefaces
bridge javascript (iceSubmit function: resetHiddenFieldsFor(aForm)).
As a consequence, Seam "Manager.restoreConversation" doesn't get the correct
one for "alfa" object, because the conversation ID parameter comes empty, and
returns the ID associated to the last EditPage I've oppened (beta object).
b) Then, after I disabled the invocation "resetHiddenFieldsFor(aForm)", the
correct conversation context is recovered perfectly. But then I run into a
second scenario:
b.1) I confirm the update of the first object (alfa) and the action method is
invoked.
** The correct conversation context is recovered, the entity is saved by
EntityManager, the conversation is ended and the page flow is redirected back
to the list.
b.2) Then I turn to the second EditPage (for the "beta" object) and I confirm
update action.
** But the action method isn't invoked anymore. Before give up, I've tried to
go through the source and I checked ClientSideInterceptor wasn´t been invoked
as it was in the first updating.
That's the second weird situation. I'm not sure if it is a bug, anyway.
Besides, the idea of using "named conversation ids" sounds great to me. If I
had a possibility to create a business key as a identifier of object "bank" for
example followed by the ID of the entity, I could have the same entity editing
in different tabs, but using the same conversation, couldn't I ?
Any help or hint is greatly appreciated.
Thanks for the attention,
Roger.
Here are some code fragments:
>From FinderAction
|
| // seam managed persistence
| @In EntityManager entityManager;
|
| @DataModel
| private List<Banco> bancos;
|
| @SuppressWarnings("unchecked")
| public String find(){
|
| Query query = entityManager.createQuery("SELECT banco FROM
Banco banco");
| bancos = query.getResultList();
|
| return null;
| }
|
| @Factory("bancos")
| public Object createBancos(){
| find();
| return bancos;
| }
|
| @Destroy @Remove
| public void destroy() {
| }
|
>From ListPage:
| <ice:column>
| <s:link value="Update" propagation="begin" pageflow="doEdit"
action="prepareUpdate">
| <f:param name="entityId" value="#{row.id}" />
| </s:link>
| </ice:column>
|
>From EditAction:
| // seam managed persistence
| @In EntityManager entityManager;
|
| @Logger
| private Log log;
|
| @Out(required=false)
| private Banco banco;
|
| @RequestParameter
| private Long entityId;
|
| @In(required=true)
| private BancoFinderAction bancoFinderAction;
|
|
| public String prepareUpdate() {
|
| log.debug("prepareUpdate()");
|
| try {
| Banco temp = (Banco) entityManager.find(Banco.class,
entityId);
| banco = entityManager.merge(temp);
|
| log.debug(banco.toString());
|
| } catch (Exception e) {
| e.printStackTrace();
| }
|
| return "prepared";
| }
|
| public String update() {
|
| log.debug("update()");
|
| try {
| log.debug(banco.toString());
| entityManager.flush();
|
| bancoFinderAction.find();
|
| } catch (Exception e) {
| e.printStackTrace();
| }
|
| return "updated";
| }
|
| @Destroy @Remove
| public void destroy() {
| }
|
>From EditPage:
| <ice:form>
| <ice:panelGroup>
|
| <ice:outputLabel for="code" value="Code*" />
| <s:decorate>
| <ice:inputText id="code" value="#{banco.codigo}" required="true"
size="8" maxlength="3" />
| <br />
| <s:message />
| </s:decorate>
|
| <ice:outputLabel for="nome" value="Name* " />
| <s:decorate>
| <ice:inputText id="nome" value="#{banco.nome}" required="true"
size="35" maxlength="30" />
| <br />
| <s:message />
| </s:decorate>
| <br/>
|
| <h:commandLink value="Save" action="ok" />
| <h:commandLink immediate="true" value="Cancel" action="cancel"/>
|
| </ice:panelGroup>
| </ice:form>
|
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4050242#4050242
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4050242
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user