[ 
https://issues.apache.org/jira/browse/ORCHESTRA-8?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12536457
 ] 

Mario Ivankovits commented on ORCHESTRA-8:
------------------------------------------

committed a proposal to fix this. Please review r586774


Author: imario
Date: Sat Oct 20 11:51:10 2007
New Revision: 586774

URL: http://svn.apache.org/viewvc?rev=586774&view=rev
Log:
ORCHESTRA-8: a proposal for this initView problem

Modified:
    
myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/viewController/jsf/ViewControllerPhaseListener.java

Modified: 
myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/viewController/jsf/ViewControllerPhaseListener.java
URL: 
http://svn.apache.org/viewvc/myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/viewController/jsf/ViewControllerPhaseListener.java?rev=586774&r1=586773&r2=586774&view=diff
==============================================================================
--- 
myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/viewController/jsf/ViewControllerPhaseListener.java
 (original)
+++ 
myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/viewController/jsf/ViewControllerPhaseListener.java
 Sat Oct 20 11:51:10 2007
@@ -28,6 +28,8 @@
 import javax.faces.event.PhaseEvent;
 import javax.faces.event.PhaseId;
 import javax.faces.event.PhaseListener;
+import java.util.Set;
+import java.util.TreeSet;
 
 /**
  * Causes lifecycle methods to be invoked on backing beans that are associated 
with
@@ -39,6 +41,15 @@
 {
        private static final long serialVersionUID = -3975277433747722402L;
 
+       public static class ViewControllerPhaseListenerState
+       {
+               private Set initedViews = new TreeSet();
+
+               protected ViewControllerPhaseListenerState()
+               {
+               }
+       }
+
        public void beforePhase(PhaseEvent event)
        {
                if (PhaseId.RESTORE_VIEW.equals(event.getPhaseId()) ||
@@ -52,6 +63,8 @@
                        }
                }
 
+               executeInitView(event.getFacesContext());
+               
                if (PhaseId.RENDER_RESPONSE.equals(event.getPhaseId()))
                {
                        preRenderResponse(event.getFacesContext());
@@ -73,9 +86,9 @@
                                // we have a redirect ... stop now
                                return;
                        }
-
-                       postRestoreView(event.getFacesContext());
                }
+
+               executeInitView(event.getFacesContext());
        }
 
        public PhaseId getPhaseId()
@@ -139,6 +152,14 @@
        /**
         * invokes the initView method on your view controller
         */
+       protected void executeInitView(FacesContext facesContext)
+       {
+               postRestoreView(facesContext);
+       }
+
+       /**
+        * @deprecated overload/use [EMAIL PROTECTED] 
#executeInitView(javax.faces.context.FacesContext)} instead
+        */
        protected void postRestoreView(FacesContext facesContext)
        {
                ViewControllerManager manager = 
_ViewControllerUtils.getViewControllerManager(facesContext);
@@ -153,7 +174,27 @@
                        return;
                }
 
+               ViewControllerPhaseListenerState state = getState(facesContext);
+
+               if (state.initedViews.contains(viewId))
+               {
+                       // already inited
+                       return;
+               }
+               state.initedViews.add(viewId);
+
                manager.executeInitView(viewId);
+       }
+
+       protected ViewControllerPhaseListenerState getState(FacesContext 
facesContext)
+       {
+               ViewControllerPhaseListenerState state = 
(ViewControllerPhaseListenerState) 
facesContext.getExternalContext().getRequestMap().get(ViewControllerPhaseListenerState.class.getName());
+               if (state == null)
+               {
+                       state = new ViewControllerPhaseListenerState();
+                       
facesContext.getExternalContext().getRequestMap().put(ViewControllerPhaseListenerState.class.getName(),
 state);
+               }
+               return state;
        }
 
        /**

> Orchestra do not send an @InitView notification to the ViewController during 
> a non redirect navigation
> ------------------------------------------------------------------------------------------------------
>
>                 Key: ORCHESTRA-8
>                 URL: https://issues.apache.org/jira/browse/ORCHESTRA-8
>             Project: MyFaces Orchestra
>          Issue Type: Bug
>          Components: ViewController
>    Affects Versions: 1.0
>         Environment: JSF 1.1 & Facelets
>            Reporter: Mario Ivankovits
>            Assignee: Mario Ivankovits
>
> The lifecycle is as follows:
> BEFORE RESTORE_VIEW(1): null
> AFTER RESTORE_VIEW(1): /all.xhtml
> BEFORE APPLY_REQUEST_VALUES(2): /all.xhtml
> AFTER APPLY_REQUEST_VALUES(2): /all.xhtml
> BEFORE PROCESS_VALIDATIONS(3): /all.xhtml
> AFTER PROCESS_VALIDATIONS(3): /all.xhtml
> BEFORE UPDATE_MODEL_VALUES(4): /all.xhtml
> AFTER UPDATE_MODEL_VALUES(4): /all.xhtml
> BEFORE INVOKE_APPLICATION(5): /all.xhtml
> AFTER INVOKE_APPLICATION(5): /edit1.xhtml
> as you can see, the viewId changes during INVOKE_APPLICATION. Now, that we do 
> not see a RESTORE_VIEW no InitView will be sent.
> InitView was meant to be sent after the view has been created, regardless if 
> this is a restoreView or createView. Since we sit in the PhaseListener we do 
> not see the ViewHandler invokes but just those from the PhaseListener where 
> the RESTORE_VIEW is missing then.

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

Reply via email to