MyFaces Core
  1. MyFaces Core
  2. MYFACES-2452

Myfaces doesn't provide support for "Enable RestoreView 1.1 Compatibility" like sun ri implementation

    Details

    • Type: Bug Bug
    • Status: Patch Available
    • Priority: Major Major
    • Resolution: Unresolved
    • Affects Version/s: 1.2.8
    • Fix Version/s: None
    • Component/s: General
    • Labels:
      None
    • Environment:
      Window, Linux, AIX, JBoss and WAS app server, AJAX4JSF, Jsf1.2, Facelets 1.1.14

      Description

      JSF 1.2
      Facelets 1.1.14
      AJAX4JSF [richfaces-ui-3.3.2.SR1]
      State Saving : Server

      Myfaces implementation doesn't provide support for the compatibility RestoreView according to JSF1.1 where if viewroot is null, it will be created again instead of throw ViewExpiredException. Sun JSF RI provides a compatibility mode using parameter com.sun.faces.enableRestoreView11Compatibility in the web.xml and then if configured it will be consulted while taking decision to create the view again or throw the ViewExpired exception.
      Due to this after moving to JSF 1.2 it keep on throwing VewExpiredException if couldn't be found in the session map, when state saving method is server.
      Please refer to the code in class com.sun.faces.lifecycle.RestoreViewPhase#execute method
      -------------------------------------------------------------------------------------------------------
      public void execute(FacesContext facesContext) throws FacesException {
      :
      boolean isPostBack = (facesContext.isPostback() && !isErrorPage(facesContext));
      196 if (isPostBack) {
      197 facesContext.setProcessingEvents(false);
      198 // try to restore the view
      199 viewRoot = viewHandler.restoreView(facesContext, viewId);
      200 if (viewRoot == null) {
      201 if (is11CompatEnabled(facesContext)) {
      202 // 1.1 -> create a new view and flag that the response should
      203 // be immediately rendered
      204 if (LOGGER.isLoggable(Level.FINE))

      { 205 LOGGER.fine("Postback: recreating a view for " + viewId); 206 }

      207 viewRoot = viewHandler.createView(facesContext, viewId);
      208 facesContext.renderResponse();
      209
      210 } else {
      211 Object[] params =

      {viewId}

      ;
      212 throw new ViewExpiredException(
      213 MessageUtils.getExceptionMessageString(
      214 MessageUtils.RESTORE_VIEW_ERROR_MESSAGE_ID,
      215 params),
      216 viewId);
      217 }
      218 }
      219
      220 facesContext.setViewRoot(viewRoot);
      221 facesContext.setProcessingEvents(true);
      222 if (LOGGER.isLoggable(Level.FINE))

      { 223 LOGGER.fine("Postback: restored view for " + viewId); 224 }

      225 }
      -------------------------------------------------------------------------------------------------------------------------------------
      Similar support should be provided by Mayfaces also. With sate saving as server, the state saving/restoring is not very reliable and throw VEE many a times. RichFaces also uses the parameter com.sun.faces.enableRestoreView11Compatibility to run its test suite.

      This is really a blocking issue until the problem of state saving at server is not fully solved and made reliable.

        Activity

        Hide
        Agam Dass added a comment -

        Introduce flag org.apache.myfaces.enableRestoreView11Compatibility which can be used to work in compatibility mode if set to true.

        public boolean execute(FacesContext facesContext)
        {
        if (facesContext == null)

        { throw new FacesException("FacesContext is null"); }

        // init the View
        Application application = facesContext.getApplication();
        ViewHandler viewHandler = application.getViewHandler();
        viewHandler.initView(facesContext);

        UIViewRoot viewRoot = facesContext.getViewRoot();

        RestoreViewSupport restoreViewSupport = getRestoreViewSupport();

        if (viewRoot != null)

        { if (log.isTraceEnabled()) log.trace("View already exists in the FacesContext"); viewRoot.setLocale(facesContext.getExternalContext().getRequestLocale()); restoreViewSupport.processComponentBinding(facesContext, viewRoot); return false; }

        String viewId = restoreViewSupport.calculateViewId(facesContext);

        // Determine if this request is a postback or initial request
        if (restoreViewSupport.isPostback(facesContext))
        {
        if (log.isTraceEnabled())
        log.trace("Request is a postback");

        viewRoot = viewHandler.restoreView(facesContext, viewId);
        if (viewRoot == null)

        { // check the new flag org.apache.myfaces.enableRestoreView11Compatibility to execute the below logic. // See : https://issues.apache.org/jira/browse/MYFACES-2452 // To run the restore view in compatibility mode we need to make sure that // in case of view is not found in the LRUMap; create a new view and flag that // the response should be immediately rendered if (log.isTraceEnabled()) log.trace("Postback: recreating a view for " + viewId); viewRoot = viewHandler.createView(facesContext, viewId); facesContext.renderResponse(); }

        if (viewRoot == null)

        { throw new ViewExpiredException( "No saved view state could be found for the view identifier: " + viewId, viewId); }

        restoreViewSupport.processComponentBinding(facesContext, viewRoot);
        }
        else

        { if (log.isTraceEnabled()) log.trace("Request is not a postback. New UIViewRoot will be created"); viewRoot = viewHandler.createView(facesContext, viewId); facesContext.renderResponse(); }

        facesContext.setViewRoot(viewRoot);

        return false;
        }

        Show
        Agam Dass added a comment - Introduce flag org.apache.myfaces.enableRestoreView11Compatibility which can be used to work in compatibility mode if set to true. public boolean execute(FacesContext facesContext) { if (facesContext == null) { throw new FacesException("FacesContext is null"); } // init the View Application application = facesContext.getApplication(); ViewHandler viewHandler = application.getViewHandler(); viewHandler.initView(facesContext); UIViewRoot viewRoot = facesContext.getViewRoot(); RestoreViewSupport restoreViewSupport = getRestoreViewSupport(); if (viewRoot != null) { if (log.isTraceEnabled()) log.trace("View already exists in the FacesContext"); viewRoot.setLocale(facesContext.getExternalContext().getRequestLocale()); restoreViewSupport.processComponentBinding(facesContext, viewRoot); return false; } String viewId = restoreViewSupport.calculateViewId(facesContext); // Determine if this request is a postback or initial request if (restoreViewSupport.isPostback(facesContext)) { if (log.isTraceEnabled()) log.trace("Request is a postback"); viewRoot = viewHandler.restoreView(facesContext, viewId); if (viewRoot == null) { // check the new flag org.apache.myfaces.enableRestoreView11Compatibility to execute the below logic. // See : https://issues.apache.org/jira/browse/MYFACES-2452 // To run the restore view in compatibility mode we need to make sure that // in case of view is not found in the LRUMap; create a new view and flag that // the response should be immediately rendered if (log.isTraceEnabled()) log.trace("Postback: recreating a view for " + viewId); viewRoot = viewHandler.createView(facesContext, viewId); facesContext.renderResponse(); } if (viewRoot == null) { throw new ViewExpiredException( "No saved view state could be found for the view identifier: " + viewId, viewId); } restoreViewSupport.processComponentBinding(facesContext, viewRoot); } else { if (log.isTraceEnabled()) log.trace("Request is not a postback. New UIViewRoot will be created"); viewRoot = viewHandler.createView(facesContext, viewId); facesContext.renderResponse(); } facesContext.setViewRoot(viewRoot); return false; }

          People

          • Assignee:
            Unassigned
            Reporter:
            Agam Dass
          • Votes:
            1 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:

              Development