ICEfaces
  1. ICEfaces
  2. ICE-9578

showcase - ace:dataTable Server Internal Error popup when columns are reordered via Table Config (PartialStateSavings=false, MyFaces specific)

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 4.0.BETA, EE-3.3.0.GA_P02
    • Fix Version/s: 4.0, EE-3.3.0.GA_P03
    • Component/s: ACE-Components
    • Labels:
      None
    • Environment:
      Icefaces3 trunk revision# 37817
      Server: tomcat6
      Browser: FF3.6, IE7 & GoogleChrome29
      Application: showcase (built with MyFaces JSF)
    • Assignee Priority:
      P2

      Description

      In showcase -> ace:dataTable:

      > Table Configuration: Server Internal Error popup when changing order of the columns from the configuration panel (partialStateSavings=false specific).

      9-Sep-2013 12:34:57 PM org.apache.catalina.core.StandardWrapperValve invoke
      SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/showcase] threw exception [null] with root cause
      java.lang.NullPointerException
          at javax.faces.component.UIComponentBase.getRenderer(UIComponentBase.java:1304)
          at javax.faces.component.UIComponentBase.getClientId(UIComponentBase.java:943)
          at javax.faces.component.UIComponent.getContainerClientId(UIComponent.java:450)
          at javax.faces.component.UIForm.getContainerClientId(UIForm.java:465)
          at org.icefaces.ace.component.datatable.DataTable.UIComponentBase_getClientId(DataTable.java:1793)
          at org.icefaces.ace.component.datatable.DataTable.getClientId(DataTable.java:1669)
          at org.icefaces.ace.component.datatable.DataTable.getContainerClientId(DataTable.java:1646)
          at javax.faces.component.UIComponentBase.getClientId(UIComponentBase.java:926)
          at org.icefaces.ace.component.datatable.DataTable.setTableConfigPanel(DataTable.java:651)
          at org.icefaces.ace.component.tableconfigpanel.TableConfigPanel.getTargetedDatatable(TableConfigPanel.java:40)
          at org.icefaces.ace.component.tableconfigpanel.TableConfigPanel.setInView(TableConfigPanel.java:57)
          at javax.faces.component.UIComponentBase._updateInView(UIComponentBase.java:315)
          at javax.faces.component.UIComponentBase._updateInView(UIComponentBase.java:322)
          at javax.faces.component.UIComponentBase._updateInView(UIComponentBase.java:322)
          at javax.faces.component.UIComponentBase._updateInView(UIComponentBase.java:322)
          at javax.faces.component.UIComponentBase._updateInView(UIComponentBase.java:322)
          at javax.faces.component.UIComponentBase._updateInView(UIComponentBase.java:322)
          at javax.faces.component.UIComponentBase._updateInView(UIComponentBase.java:322)
          at javax.faces.component.UIComponentBase._updateInView(UIComponentBase.java:322)
          at javax.faces.component.UIComponentBase._updateInView(UIComponentBase.java:322)
          at javax.faces.component.UIComponentBase.setParent(UIComponentBase.java:219)
          at javax.faces.component._ComponentChildrenList.updateParent(_ComponentChildrenList.java:132)
          at javax.faces.component._ComponentChildrenList.add(_ComponentChildrenList.java:82)
          at javax.faces.component._ComponentChildrenList.add(_ComponentChildrenList.java:33)
          at org.apache.myfaces.application.TreeStructureManager.internalRestoreTreeStructure(TreeStructureManager.java:132)
          at org.apache.myfaces.application.TreeStructureManager.restoreTreeStructure(TreeStructureManager.java:104)
          at org.apache.myfaces.application.StateManagerImpl.restoreView(StateManagerImpl.java:142)
          at org.apache.myfaces.shared.view.ViewDeclarationLanguageBase.restoreView(ViewDeclarationLanguageBase.java:106)
          at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.restoreView(FaceletViewDeclarationLanguage.java:2118)
          at org.apache.myfaces.application.ViewHandlerImpl.restoreView(ViewHandlerImpl.java:313)
          at javax.faces.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:83)
          at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:127)
          at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:170)
          at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
          at javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)
      ..........



      Steps to reproduce:
      - build showcase.war file with MyFaces JSF, and the PartialStateSavings context-param set to false in web.xml:
      <context-param>
          <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
          <param-value>false</param-value>
      </context-param>

      - go to showcase -> ace:dataTable -> Table Configuration demo.
      - open the Table Config and change the order of columns, submit the change -> a Server Internal Error popup occurs, and the server error is visible in tomcat log.


      This issue could not be reproduced using Mojarra JSF, and PartialStateSavings=false.

        Activity

        Hide
        Cruz Miraback added a comment -

        Issue is still reproducible on ICEfaces 4 trunk revision# 40068 with PARTIAL_STATE_SAVING=false and Myfaces 2.2. However, instead of the Server Internal Error popup it is a popup with the text "java.lang.NullPointerException".

        Show
        Cruz Miraback added a comment - Issue is still reproducible on ICEfaces 4 trunk revision# 40068 with PARTIAL_STATE_SAVING=false and Myfaces 2.2. However, instead of the Server Internal Error popup it is a popup with the text "java.lang.NullPointerException".
        Hide
        Carmen Cristurean added a comment -

        This is also an issue with EE-3.3.0-maintenance branch rev. 41318 (partialStateSavings=false and MyFaces 2.1.15).

        Show
        Carmen Cristurean added a comment - This is also an issue with EE-3.3.0-maintenance branch rev. 41318 (partialStateSavings=false and MyFaces 2.1.15).
        Hide
        Arturo Zambrano added a comment -

        The root cause of the issue is that when javax.faces.PARTIAL_STATE_SAVING=false, at certain requests FacesContext.getRenderKit() returns null in the MyFaces code. The renderkit is only retrieved to obtain the renderer of the component and then use the convertClientId() method when determining the table's client id.

        A possible solution would be to create a fake RenderKit for this scenario, in order to avoid this kind of processing and this exception. This would be similar to another workaround of creating a fake UIViewRoot for Mojarra's failure to send the exception message when javax.faces.PARTIAL_STATE_SAVING=false in our ExtendedExceptionHandler class.

        Show
        Arturo Zambrano added a comment - The root cause of the issue is that when javax.faces.PARTIAL_STATE_SAVING=false, at certain requests FacesContext.getRenderKit() returns null in the MyFaces code. The renderkit is only retrieved to obtain the renderer of the component and then use the convertClientId() method when determining the table's client id. A possible solution would be to create a fake RenderKit for this scenario, in order to avoid this kind of processing and this exception. This would be similar to another workaround of creating a fake UIViewRoot for Mojarra's failure to send the exception message when javax.faces.PARTIAL_STATE_SAVING=false in our ExtendedExceptionHandler class.
        Hide
        Arturo Zambrano added a comment -

        Committed fix to 4.0 trunk at revision 42492. Added workaround for MyFaces and javax.faces.PARTIAL_STATE_SAVING=false to set a default RenderKit id (RenderKitFactory.HTML_BASIC_RENDER_KIT) when FacesContext().getRenderKit() returns null. This prevents the NPE, by letting the MyFaces code read the RenderKit instance that it expects, even though it won't actually use it to determine the client id.

        Show
        Arturo Zambrano added a comment - Committed fix to 4.0 trunk at revision 42492. Added workaround for MyFaces and javax.faces.PARTIAL_STATE_SAVING=false to set a default RenderKit id (RenderKitFactory.HTML_BASIC_RENDER_KIT) when FacesContext().getRenderKit() returns null. This prevents the NPE, by letting the MyFaces code read the RenderKit instance that it expects, even though it won't actually use it to determine the client id.
        Hide
        Carmen Cristurean added a comment - - edited

        Verified with IF4 trunk rev. 42492 in IE10, FF31, Chrome36.

        This issue still exists on EE-3.3.0-maintenance branch rev. 42484.

        Show
        Carmen Cristurean added a comment - - edited Verified with IF4 trunk rev. 42492 in IE10, FF31, Chrome36. This issue still exists on EE-3.3.0-maintenance branch rev. 42484.
        Hide
        Arturo Zambrano added a comment -

        Applied fix to the 3.3 EE maintenance branch at revision 42503.

        Show
        Arturo Zambrano added a comment - Applied fix to the 3.3 EE maintenance branch at revision 42503.
        Hide
        Liana Munroe added a comment -

        Verified ICEfaces ee-3.3.0 maintenance branch r42510. Tomcat 7, all browsers, myfaces jsf and PARTIAL_STATE_SAVING=false .

        Show
        Liana Munroe added a comment - Verified ICEfaces ee-3.3.0 maintenance branch r42510. Tomcat 7, all browsers, myfaces jsf and PARTIAL_STATE_SAVING=false .

          People

          • Assignee:
            Arturo Zambrano
            Reporter:
            Carmen Cristurean
          • Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: