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

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

Could you provide more details or maybe a simple demo for your particular 
environment? In servlet case it works well. 

Are you using nested datatables with preserveDataModel="true"? Note 
preserveDataModel="true" only should be set for the outer datatable or 
datalist. Nested case is not possible, and after all, not necessary because 
usually the inner one use the model from the outer one.

Theorically there is something else happening. In theory if 
AbstractHtmlDataTable.restoreState code is executed, this code takes place:

        if (isPreserveDataModel())
        {
            _preservedDataModel = (_SerializableDataModel) 
restoreAttachedState(context, values[2]);
        }
        else
        {
            _preservedDataModel = null;
        }

So, if there is a change of dataModel between restoreState and processUpdates, 
it is expected the java.lang.ClassCastException. 

There exists one possibility in this case, that if the bridge for portlets you 
are using is executing the full lifecycle for a non postback request, the 
exception happens. If that so, the portlet bridge has a bug, but it is possible 
to create a model that extends from _SerializableDataModel (note is class 
scope, so the generated class should be on the same package) to overcome this 
limitation.

It could be good to know if it happens the first time the view is rendered or 
by the effect of an action.

> 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
>
>
> 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.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to