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 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.