ICEfaces
  1. ICEfaces
  2. ICE-11241

NullPointerException thrown by BridgeSetup.java and BridgeFormsSetup.java in a portlet environment during a portlet mode change

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 4.1.1, 4.2.BETA
    • Fix Version/s: 4.3
    • Component/s: Framework
    • Labels:
      None
    • Environment:
      JSF 2.3 (Mojarra 2.3.0-m10) and Portlet 3.0.
    • Assignee Priority:
      P2

      Description

      Note: This issue is also being tracked at the Liferay issue tracker under [FACES-2867|https://issues.liferay.com/browse/FACES-2867].

      h3. Problem Description:

      The BridgeSetup.java and BridgeFormsSetup.java classes assume that the "org.icefaces.impl.event::ViewState" attribute will always be be non-null. Because of this assumption, NullPointerException is being thrown in a portlet environment during a portlet mode change. This is because of a requirement in JSR 329/378 that prevents "non excluded" request attributes from surviving from the ACTION_PHASE of the portlet lifecycle into the RENDER_PHASE of the portlet lifecycle during a portlet mode change. This functionality is implemented in Liferay Faces Bridge with the following code:
      {code:java|title=BridgeRequestScopeImpl.java}
      if (!portletMode.equals(portletRequest.getPortletMode())) {
      setPortletModeChanged(true);
      restoreNonExcludedRequestAttributes = false;
      }
      {code}

      h3. Steps to Reproduce:

      1. Download and extract the [Pluto 3.0.0 Tomcat bundle|https://portals.apache.org/pluto/download.html].

      2. Download the [Mojarra 2.3.0-m10 all-in-one jar|http://search.maven.org/remotecontent?filepath=org/glassfish/javax.faces/2.3.0-m10/javax.faces-2.3.0-m10.jar]:
      {code:xml}
      <dependency>
          <groupId>org.glassfish</groupId>
          <artifactId>javax.faces</artifactId>
          <version>2.3.0-m10</version>
      </dependency
      {code}

      3. Extract the jar:
      {noformat}jar xf javax.faces-2.3.0-m10.jar{noformat}

      4. Remove the following file:
      {noformat}rm META-INF/services/javax.servlet.ServletContainerInitializer{noformat}

      5. Re-zip the jar:
      jar cmf META-INF/MANIFEST.MF javax.faces-2.3.0-m10-fixed.jar META-INF/ com/ javax/

      6. Copy the jar to Pluto's tomcat/lib folder

      7. Copy the icefaces-applicant-portlet (attached) war to Pluto's tomcat/webapps folder

      Note: The icefaces-applicant-portlet demo is part of the Liferay Faces suite of demo portlets. Its purpose is to exercise several typical use-cases of ICEfaces in a portlet environment.

      8. Start Pluto's Tomcat

      9. Visit the following URL:
      http://localhost:8080/pluto/portal

      10. Using the Pluto Admin page, create a new page named "icefaces" and add the portlet named "1" from the com.liferay.faces.demo.icefaces.applicant.portlet module.

      11. Visit the following URL:
      http://localhost:8080/pluto/portal/icefaces

      12. Click on the "Edit" link under the "Liferay" logo in the upper right hand corner.

      13. Click the Submit button

      (/) Expected Results
      The portletViewMode.xhtml view is rendered correctly.

      (x) Actual Results
      {noformat}
      java.lang.NullPointerException
      at org.icefaces.impl.event.BridgeSetup.getBodyResources(BridgeSetup.java:205)
      at org.icefaces.impl.event.BridgeSetup.processEvent(BridgeSetup.java:99)
      at javax.faces.event.SystemEvent.processListener(SystemEvent.java:147)
      at javax.faces.event.ComponentSystemEvent.processListener(ComponentSystemEvent.java:134)
      at com.sun.faces.application.ApplicationImpl.processListeners(ApplicationImpl.java:2256)
      at com.sun.faces.application.ApplicationImpl.invokeListenersFor(ApplicationImpl.java:2229)
      at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:313)
      at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:257)
      at javax.faces.application.ApplicationWrapper.publishEvent(ApplicationWrapper.java:746)
      at javax.faces.application.ApplicationWrapper.publishEvent(ApplicationWrapper.java:746)
      at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:884)
      at javax.faces.component.UIViewRoot.encodeBegin(UIViewRoot.java:1090)
      at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1903)
      at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:491)
      at javax.faces.view.ViewDeclarationLanguageWrapper.renderView(ViewDeclarationLanguageWrapper.java:126)
      at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:194)
      at com.liferay.faces.bridge.application.internal.ViewHandlerCompatImpl.renderView(ViewHandlerCompatImpl.java:95)
      at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:151)
      at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:151)
      at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:126)
      at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
      at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:223)
      at com.liferay.faces.bridge.internal.BridgePhaseHeaderRenderCommon.executeRender(BridgePhaseHeaderRenderCommon.java:191)
      at com.liferay.faces.bridge.internal.BridgePhaseHeaderImpl.execute(BridgePhaseHeaderImpl.java:67)
      at com.liferay.faces.bridge.internal.BridgeCompatImpl.doFacesRequest(BridgeCompatImpl.java:52)
      at javax.portlet.faces.GenericFacesPortlet.renderHeaders(GenericFacesPortlet.java:535)
      {noformat}

        Activity

        Hide
        Valentin Ivanov added a comment -

        Hi,

        I have the same exception. I use JSF 2.3 (apache MyFaces), IceFaces(ICEfaces 4.2.0,Build number: 6,Build date: 170309,Revision: 51154), Spring 4.3.9, Spring Web Flow and Tomcat 8.
        The exception happens when Spring Web Flow transits from First (very very simple) page to Second (very very simple) page.
        Could you explain why is this exception and is there any workaround or I have to wait for IceFaces 4.3?

        Thank you.

        Show
        Valentin Ivanov added a comment - Hi, I have the same exception. I use JSF 2.3 (apache MyFaces), IceFaces(ICEfaces 4.2.0,Build number: 6,Build date: 170309,Revision: 51154), Spring 4.3.9, Spring Web Flow and Tomcat 8. The exception happens when Spring Web Flow transits from First (very very simple) page to Second (very very simple) page. Could you explain why is this exception and is there any workaround or I have to wait for IceFaces 4.3? Thank you.
        Hide
        Mircea Toma added a comment -

        Create new ice.view ID when requested but missing. Normally the ID is generated on the restore phase which is not executed after a portlet edit.

        Show
        Mircea Toma added a comment - Create new ice.view ID when requested but missing. Normally the ID is generated on the restore phase which is not executed after a portlet edit.

          People

          • Assignee:
            Mircea Toma
            Reporter:
            Neil Griffin
          • Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: