FYI, earliest fix can be found in in 1.1.12

On 9/7/07, Martin Marinschek <[EMAIL PROTECTED]> wrote:
> Just so that people don't have to search: it's a bug in Facelets fixed
> in the latest version 1.1.13.
>
> regards,
>
> Martin
>
> On 9/6/07, Andrew Robinson <[EMAIL PROTECTED]> wrote:
> > FYI, I started a new thread entitled "Major bug in facelets 1.1.11
> > with mark and sweep code?" that is on the facelets user list and CC'd
> > on this list as a result of my findings from this thread.
> >
> > -Andrew
> >
> > On 9/5/07, Adam Winer <[EMAIL PROTECTED]> wrote:
> > > On 9/5/07, Andrew Robinson <[EMAIL PROTECTED]> wrote:
> > > > Okay, I could really use some help, and I am confused on the Trinidad
> > > > code and how it is supposed to work.
> > > >
> > > > I stepped through the code on a PPR partial submit restore view. And
> > > > the code that starts to seem fishy is the
> > > > "StateManagerImpl$PageState.popRoot(FacesContext)" function.
> > > >
> > > > Code as follows:
> > > >         UIViewRoot newRoot = (UIViewRoot)
> > > >           
> > > > fc.getApplication().createComponent(UIViewRoot.COMPONENT_TYPE);
> > > >
> > > >         // must call restoreState so that we setup attributes, 
> > > > listeners,
> > > >         // uniqueIds, etc ...
> > > >         newRoot.restoreState(fc, viewRootState);
> > > >
> > > >         // we need to use a temp list because as a side effect of
> > > >         // adding a child to a UIComponent, that child is removed from
> > > >         // the parent UIComponent. So the following will break:
> > > >         // newRoot.getChildren().addAll(root.getChildren());
> > > >         // because "root"'s child List is being mutated as the List
> > > >         // is traversed.
> > > >         List<UIComponent> temp = new
> > > > ArrayList<UIComponent>(root.getChildCount());
> > > >         temp.addAll(root.getChildren());
> > > >         newRoot.getChildren().addAll(temp);
> > > >         return newRoot;
> > > >
> > > > As you can see, the state of the new UIViewRoot is restored, then the
> > > > children are added to the view root before this function returns, but
> > > > neither the restoreState nor the processRestoreState functions are
> > > > ever called on the children.
> > >
> > > This is the CACHE_VIEW_ROOT optimization.  BTW, this
> > > optimization *has* been tested with Facelets, though not
> > > intensively with especially recent versions.
> > >
> > > > As a result the view is never restored fully. That is where I am
> > > > getting the problem.
> > >
> > > No, it should be fully restored - all the children from the prior
> > > request should still be there.
> > >
> > > >
> > > > My configuration:
> > > >
> > > > Facelets 1.1.11
> > > > Trinidad 1.0.3-SNAPSHOT
> > > > Seam 1.2.1
> > > > MyFaces 1.1.5
> > > >
> > > > View root: the one Trinidad installs
> > > > ALTERNATE_VIEW_HANDLER: my own custom view handler that extends
> > > > SeamFaceletViewHandler which in tern extends FaceletViewHandler.
> > > >
> > > > State saving method is client.
> > > >
> > > > Using *.jsf view mapping with .xhtml file suffixes.
> > > >
> > > > Trinidad's USE_APPLICATION_VIEW_CACHE parameter set to false.
> > > >
> > > > setting the facelets BUILD_BEFORE_RESTORE parameter to true actually
> > > > "fixes" the error, but that is simply because the simple view I am in
> > > > really has no "real" state to store. But even with this set, the
> > > > children of UIViewRoot never have their state restored.
> > > >
> > > > My custom view handler creates my on view root that extends
> > > > UIViewRoot, but I don't touch any of the state methods.
> > > >
> > > > Looking in the client HTML, it gets a bit fishy as well. This is what I 
> > > > found:
> > > >
> > > > <span id="_mainForm_Postscript">
> > > > <input type="hidden" value="!-1f9a06ef"
> > > > name="org.apache.myfaces.trinidad.faces.STATE"/>
> > > >
> > > > That value seems incredible small for a view state.
> > >
> > > That's because its a token.  Not the full state.
> > >
> > > > I have tried server side state saving and have gotten the same result.
> > > > The code that seems very wrong in terms of it shouldn't be executed
> > > > ins in StateManagerImpl.java:
> > > >
> > > >       UIViewRoot root = viewState.popRoot(context); // bug 4712492
> > > >       if (root != null)
> > > >       {
> > > >         _LOG.finer("UIViewRoot for token {0} already exists. Bypassing
> > > > restoreState", token);
> > > >         return root;
> > > >       }
> > > >
> > > > This always is true on my PPR requests and seems to be the cause of
> > > > the state never being restored.
> > >
> > > It's actually a really valuable optimization, especially for PPR.
> > >
> > > -- Adam
> > >
> > > > While in debug mode, if I force the root to be null, then everything
> > > > works. I really don't know for sure, but the above code seems to
> > > > completely break the restoring of the view state with the
> > > > configuration I have.
> > > >
> > > > On 9/5/07, Andrew Robinson <[EMAIL PROTECTED]> wrote:
> > > > > TreeState.saveState(FacesContext, UIXComponentBase) is being called, 
> > > > > but
> > > > >
> > > > > TreeState.restoreState(FacesContext, UIXComponentBase) is never 
> > > > > called.
> > > > >
> > > > > I'll have to look into this to see if it is something I caused or not.
> > > > > Does Trinidad depend on a custom UIViewRoot implementation (I have my
> > > > > own and a custom view handler that are worth looking into as the
> > > > > source of the issue)?
> > > > >
> > > > > On 9/5/07, Andrew Robinson <[EMAIL PROTECTED]> wrote:
> > > > > > It works fine outside of the facet,
> > > > > >
> > > > > > Broken:
> > > > > >
> > > > > > <tr:panelLabelAndMessage
> > > > > >  label="Test help">
> > > > > >  <tr:inputText id="testHelp" value="#{testHelpText}"
> > > > > >    simple="true" />
> > > > > >  <f:facet name="end">
> > > > > >    <cw:helpIcon for="testHelp"
> > > > > >      messageId="test_help" />
> > > > > >  </f:facet>
> > > > > > </tr:panelLabelAndMessage>
> > > > > >
> > > > > > Works:
> > > > > >
> > > > > > <tr:panelLabelAndMessage
> > > > > >  label="Test help">
> > > > > >  <tr:inputText id="testHelp" value="#{testHelpText}"
> > > > > >    simple="true" />
> > > > > > </tr:panelLabelAndMessage>
> > > > > > <cw:helpIcon for="testHelp"
> > > > > >    messageId="test_help" />
> > > > > >
> > > > > > Looks like a possible bug in the state saving of facets or at least 
> > > > > > in
> > > > > > the panelLabelAndMessage. Any ideas?
> > > > > >
> > > > >
> > > >
> > >
> >
>
>
> --
>
> http://www.irian.at
>
> Your JSF powerhouse -
> JSF Consulting, Development and
> Courses in English and German
>
> Professional Support for Apache MyFaces
>

Reply via email to