You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@shale.apache.org by "Paul Rivera (JIRA)" <ji...@apache.org> on 2007/11/03 04:32:40 UTC

[jira] Created: (SHALE-476) prerender not called for SESSION Scope ViewControllers

prerender not called for SESSION Scope ViewControllers
------------------------------------------------------

                 Key: SHALE-476
                 URL: https://issues.apache.org/struts/browse/SHALE-476
             Project: Shale
          Issue Type: Bug
          Components: View
    Affects Versions: 1.0.4
         Environment: Windows XP, Tomcat 6.6., Java 5, Eclipse 3.3
            Reporter: Paul Rivera


Hi,

If you set your ViewController to anything other than REQUEST scope, your prerender() method does not get called.   Below is a code snippet from the ViewPhaseListener.beforeRenderResponse(PhaseEvent event) method:

[code]
        Map map = event.getFacesContext().getExternalContext().getRequestMap();
        String viewName = (String) map.get(FacesConstants.VIEW_NAME_RENDERED);
        if (viewName == null) {
            return;
        }
        Object vc = map.get(viewName);  //--> only gets from the RequestMap
        if (vc == null) {
            return;
        }

        try {
            getViewControllerCallbacks(event.getFacesContext()).prerender(vc);
        } catch (Exception e) {
            handleException(event.getFacesContext(), e);
        }
        map.remove(FacesConstants.VIEW_NAME_RENDERED);
[/code]

In the code above, it vc is only looked-up in the request map.  It doesn't look into the session map nor in the application map anymore.  Here is my proposed fix:

[code]
        Map map = event.getFacesContext().getExternalContext().getRequestMap();
        String viewName = (String) map.get(FacesConstants.VIEW_NAME_RENDERED);
        if (viewName == null) {
            return;
        }
        Object vc = map.get(viewName);
        //Check if the view is in the session scope.  Session scope attributes
        //will be prioritized over Application scope attributes.
        /*
        if (vc == null) {
            map = event.getFacesContext().getExternalContext().getSessionMap();
            vc = map.get(viewName);
        }
        
        //If the attribute is not in the Session scope, check if it is in the
        //Application scope.
        if (vc == null) {
            map = event.getFacesContext().getExternalContext().getApplicationMap();
            vc = map.get(viewName);
        }*/

        if (vc == null) {
            return;
        }

        try {
            getViewControllerCallbacks(event.getFacesContext()).prerender(vc);
        } catch (Exception e) {
            handleException(event.getFacesContext(), e);
        }
        map.remove(FacesConstants.VIEW_NAME_RENDERED);
[/code]

I've been using shale-view-1.0.4.jar with the fix in my web application and things look good so far.  Please let me know if this is really a bug.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.