Uploaded image for project: 'MyFaces Tomahawk'
  1. MyFaces Tomahawk
  2. TOMAHAWK-1460

ClassCastException when testing Tomahawk 1.1.9 table demos when preserveDataModel="true"

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 1.1.9
    • 1.1.10
    • Extended Datatable
    • None
    • Mac OS 10.5.8
      JDK 1.6.0
      Mojarra 2.0.0-SNAPSHOT
      Glassfish V3

    Description

      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.

      Attachments

        Activity

          People

            lu4242 Leonardo Uribe
            rlubke Ryan Lubke
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: