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

          People

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

            Dates

            • Created:
              Updated:
              Resolved: