[ 
https://issues.apache.org/jira/browse/TOMAHAWK-1460?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12900400#action_12900400
 ] 

Leonardo Uribe commented on TOMAHAWK-1460:
------------------------------------------

I checked the code and the problem is preserveDataModel does not take into 
account nested datatable case. The solution is do something similar as the hack 
done for getDataModel, that means use the clientId (or containerClientId in jsf 
2) to save the datamodel on a map and then serialize it.

One change required is change this code called on saveState()

        if (isPreserveDataModel())
        {
            _preservedDataModel = getSerializableDataModel();
            values[2] = saveAttachedState(context, _preservedDataModel);
        }

It does not have sense to call getSerializableDataModel() from this method. In 
theory, we should get the serialized data model, but if we do it in that 
moment, we'll lose the model when nested datatables are handled. Instead, it 
should be called after process encodeEnd() method:

        if (isPreserveDataModel())
        {
            setPreservedDataModel(getSerializableDataModel());
        }

In this way, all models are serialized, and finally we can save the map on the 
state.

> ClassCastException when testing Tomahawk 1.1.9 table demos when 
> preserveDataModel="true"
> ----------------------------------------------------------------------------------------
>
>                 Key: TOMAHAWK-1460
>                 URL: https://issues.apache.org/jira/browse/TOMAHAWK-1460
>             Project: MyFaces Tomahawk
>          Issue Type: Bug
>          Components: Extended Datatable
>    Affects Versions: 1.1.9
>         Environment: Mac OS 10.5.8
> JDK 1.6.0
> Mojarra 2.0.0-SNAPSHOT
> Glassfish V3
>            Reporter: Ryan Lubke
>            Assignee: Leonardo Uribe
>             Fix For: 1.1.10-SNAPSHOT
>
>
> When executing 'Paged and Sortable', 'Master-Detail', and 'Optional
> Header/Footer', a class cast exception is raised during post-back operations 
> to
> update the view.
> java.lang.ClassCastException: javax.faces.model.ListDataModel cannot be cast 
> to
> org.apache.myfaces.component.html.ext._SerializableDataModel
>       at
> org.apache.myfaces.component.html.ext.AbstractHtmlDataTable.updateModelFromPreservedDataModel(AbstractHtmlDataTable.java:493)
>       at
> org.apache.myfaces.component.html.ext.AbstractHtmlDataTable.processUpdates(AbstractHtmlDataTable.java:479)
>       at 
> javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1108)
>       at javax.faces.component.UIForm.processUpdates(UIForm.java:265)
>       at 
> javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1108)
>       at javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1238)
> I've done some debugging here and have found this block of code being executed
> during processRestoreState():
> protected DataModel getDataModel()
> {
>     if (_preservedDataModel != null)
>     {
>         setDataModel(_preservedDataModel);
>         _preservedDataModel = null;
>     }
>     return super.getDataModel();
> }
> The call stack at this point in time is:
>  at
> org.apache.myfaces.component.html.ext.AbstractHtmlDataTable.getDataModel(AbstractHtmlDataTable.java:839)
>         at
> org.apache.myfaces.component.html.ext.HtmlDataTableHack.setRowIndex(HtmlDataTableHack.java:282)
>         at
> org.apache.myfaces.component.html.ext.AbstractHtmlDataTable.setRowIndex(AbstractHtmlDataTable.java:276)
>         at javax.faces.component.UIData.visitColumnsAndRows(UIData.java:1539)
>         at javax.faces.component.UIData.visitTree(UIData.java:1207)
>         at javax.faces.component.UIComponent.visitTree(UIComponent.java:1454)
>         at javax.faces.component.UIComponent.visitTree(UIComponent.java:1454)
>         at javax.faces.component.UIForm.visitTree(UIForm.java:333)
>         at javax.faces.component.UIComponent.visitTree(UIComponent.java:1454)
>         at 
> javax.faces.component.UIViewRoot.processRestoreState(UIViewRoot.java:868)
> The interesting point here is that _preserveDataModel is set to null.
> Later, during processUpdates(), updateModelFromPreservedDataModel() will 
> call getDataModel (as listed above), however, since _preservedDataModel was 
> set
> to null, the call is delegated to the super class, UIData, which returns
> ListDataModel.
> This change in the code path is new spec required functionality where 
> UIViewRoot.processRestoreState()
> uses the TreeVisitor to notify components of the PostRestoreStateEvent.  
> Given this, I'm sure the 
> problem will be manifest with MyFaces 2.0.0.
> WORKAROUND: set preservDataModel to false.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to