Author: craigmcc
Date: Wed Dec 27 14:19:21 2006
New Revision: 490577

URL: http://svn.apache.org/viewvc?view=rev&rev=490577
Log:
[SHALE-374] Ensure that destroy() callbacks occur within the JSF lifecycle,
so that references to FacesContext.getCurrentInstance() will still work.  That
way, destroy() methods can still use JSF facilities to perform their cleanup
tasks.

Modified:
    
shale/framework/trunk/shale-apps/shale-test-tiger/src/main/java/org/apache/shale/examples/test/tiger/Lifecycle1.java
    
shale/framework/trunk/shale-apps/shale-test-tiger/src/main/java/org/apache/shale/examples/test/tiger/Lifecycle2.java
    
shale/framework/trunk/shale-apps/shale-test-view/src/main/java/org/apache/shale/examples/test/view/Lifecycle1.java
    
shale/framework/trunk/shale-apps/shale-test-view/src/main/java/org/apache/shale/examples/test/view/Lifecycle2.java
    
shale/framework/trunk/shale-apps/shale-test-view/src/test/java/org/apache/shale/examples/test/view/systest/IntegrationTestCase.java
    
shale/framework/trunk/shale-view/src/main/java/org/apache/shale/view/faces/ViewPhaseListener.java

Modified: 
shale/framework/trunk/shale-apps/shale-test-tiger/src/main/java/org/apache/shale/examples/test/tiger/Lifecycle1.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-apps/shale-test-tiger/src/main/java/org/apache/shale/examples/test/tiger/Lifecycle1.java?view=diff&rev=490577&r1=490576&r2=490577
==============================================================================
--- 
shale/framework/trunk/shale-apps/shale-test-tiger/src/main/java/org/apache/shale/examples/test/tiger/Lifecycle1.java
 (original)
+++ 
shale/framework/trunk/shale-apps/shale-test-tiger/src/main/java/org/apache/shale/examples/test/tiger/Lifecycle1.java
 Wed Dec 27 14:19:21 2006
@@ -19,6 +19,7 @@
 
 package org.apache.shale.examples.test.tiger;
 
+import javax.faces.context.FacesContext;
 import org.apache.shale.tiger.managed.Bean;
 import org.apache.shale.tiger.managed.Property;
 import org.apache.shale.tiger.managed.Scope;
@@ -59,6 +60,10 @@
     public void init() {
         getRecorder().record("init1");
         System.out.println("Lifecycle1.init()");
+        if (FacesContext.getCurrentInstance() == null) {
+            getRecorder().record("noContext");
+            System.out.println("  noContext");
+        }
     }
 
 
@@ -89,6 +94,10 @@
     public void destroy() {
         getRecorder().record("destroy1");
         System.out.println("Lifecycle1.destroy()");
+        if (FacesContext.getCurrentInstance() == null) {
+            getRecorder().record("noContext");
+            System.out.println("  noContext");
+        }
     }
 
 

Modified: 
shale/framework/trunk/shale-apps/shale-test-tiger/src/main/java/org/apache/shale/examples/test/tiger/Lifecycle2.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-apps/shale-test-tiger/src/main/java/org/apache/shale/examples/test/tiger/Lifecycle2.java?view=diff&rev=490577&r1=490576&r2=490577
==============================================================================
--- 
shale/framework/trunk/shale-apps/shale-test-tiger/src/main/java/org/apache/shale/examples/test/tiger/Lifecycle2.java
 (original)
+++ 
shale/framework/trunk/shale-apps/shale-test-tiger/src/main/java/org/apache/shale/examples/test/tiger/Lifecycle2.java
 Wed Dec 27 14:19:21 2006
@@ -19,6 +19,7 @@
 
 package org.apache.shale.examples.test.tiger;
 
+import javax.faces.context.FacesContext;
 import org.apache.shale.tiger.managed.Bean;
 import org.apache.shale.tiger.managed.Property;
 import org.apache.shale.tiger.managed.Scope;
@@ -59,6 +60,10 @@
     public void init() {
         getRecorder().record("init2");
         System.out.println("Lifecycle2.init()");
+        if (FacesContext.getCurrentInstance() == null) {
+            getRecorder().record("noContext");
+            System.out.println("  noContext");
+        }
     }
 
 
@@ -89,6 +94,10 @@
     public void destroy() {
         getRecorder().record("destroy2");
         System.out.println("Lifecycle2.destroy()");
+        if (FacesContext.getCurrentInstance() == null) {
+            getRecorder().record("noContext");
+            System.out.println("  noContext");
+        }
     }
 
 

Modified: 
shale/framework/trunk/shale-apps/shale-test-view/src/main/java/org/apache/shale/examples/test/view/Lifecycle1.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-apps/shale-test-view/src/main/java/org/apache/shale/examples/test/view/Lifecycle1.java?view=diff&rev=490577&r1=490576&r2=490577
==============================================================================
--- 
shale/framework/trunk/shale-apps/shale-test-view/src/main/java/org/apache/shale/examples/test/view/Lifecycle1.java
 (original)
+++ 
shale/framework/trunk/shale-apps/shale-test-view/src/main/java/org/apache/shale/examples/test/view/Lifecycle1.java
 Wed Dec 27 14:19:21 2006
@@ -19,6 +19,7 @@
 
 package org.apache.shale.examples.test.view;
 
+import javax.faces.context.FacesContext;
 import org.apache.shale.view.AbstractViewController;
 
 /**
@@ -49,6 +50,10 @@
     public void init() {
         getRecorder().record("init1");
         System.out.println("Lifecycle1.init()");
+        if (FacesContext.getCurrentInstance() == null) {
+            getRecorder().record("noContext");
+            System.out.println("  noContext");
+        }
     }
 
 
@@ -76,6 +81,11 @@
     public void destroy() {
         getRecorder().record("destroy1");
         System.out.println("Lifecycle1.destroy()");
+        System.out.println("Lifecycle1.init()");
+        if (FacesContext.getCurrentInstance() == null) {
+            getRecorder().record("noContext");
+            System.out.println("   noContext");
+        }
     }
 
 

Modified: 
shale/framework/trunk/shale-apps/shale-test-view/src/main/java/org/apache/shale/examples/test/view/Lifecycle2.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-apps/shale-test-view/src/main/java/org/apache/shale/examples/test/view/Lifecycle2.java?view=diff&rev=490577&r1=490576&r2=490577
==============================================================================
--- 
shale/framework/trunk/shale-apps/shale-test-view/src/main/java/org/apache/shale/examples/test/view/Lifecycle2.java
 (original)
+++ 
shale/framework/trunk/shale-apps/shale-test-view/src/main/java/org/apache/shale/examples/test/view/Lifecycle2.java
 Wed Dec 27 14:19:21 2006
@@ -19,6 +19,7 @@
 
 package org.apache.shale.examples.test.view;
 
+import javax.faces.context.FacesContext;
 import org.apache.shale.view.AbstractViewController;
 
 /**
@@ -49,6 +50,10 @@
     public void init() {
         getRecorder().record("init2");
         System.out.println("Lifecycle2.init()");
+        if (FacesContext.getCurrentInstance() == null) {
+            getRecorder().record("noContext");
+            System.out.println("  noContext");
+        }
     }
 
 
@@ -76,6 +81,10 @@
     public void destroy() {
         getRecorder().record("destroy2");
         System.out.println("Lifecycle2.destroy()");
+        if (FacesContext.getCurrentInstance() == null) {
+            getRecorder().record("noContext");
+            System.out.println("  noContext");
+        }
     }
 
 

Modified: 
shale/framework/trunk/shale-apps/shale-test-view/src/test/java/org/apache/shale/examples/test/view/systest/IntegrationTestCase.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-apps/shale-test-view/src/test/java/org/apache/shale/examples/test/view/systest/IntegrationTestCase.java?view=diff&rev=490577&r1=490576&r2=490577
==============================================================================
--- 
shale/framework/trunk/shale-apps/shale-test-view/src/test/java/org/apache/shale/examples/test/view/systest/IntegrationTestCase.java
 (original)
+++ 
shale/framework/trunk/shale-apps/shale-test-view/src/test/java/org/apache/shale/examples/test/view/systest/IntegrationTestCase.java
 Wed Dec 27 14:19:21 2006
@@ -110,6 +110,7 @@
 
         element = element("recorderEvents");
         assertNotNull(element);
+//        System.err.println("Problematic element: " + element.asText());
         
assertEquals("init1/prerender1/destroy1/init1/preprocess1/init2/prerender2/", 
element.asText());
 
     }

Modified: 
shale/framework/trunk/shale-view/src/main/java/org/apache/shale/view/faces/ViewPhaseListener.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-view/src/main/java/org/apache/shale/view/faces/ViewPhaseListener.java?view=diff&rev=490577&r1=490576&r2=490577
==============================================================================
--- 
shale/framework/trunk/shale-view/src/main/java/org/apache/shale/view/faces/ViewPhaseListener.java
 (original)
+++ 
shale/framework/trunk/shale-view/src/main/java/org/apache/shale/view/faces/ViewPhaseListener.java
 Wed Dec 27 14:19:21 2006
@@ -18,6 +18,7 @@
 package org.apache.shale.view.faces;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -31,6 +32,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.shale.view.AbstractRequestBean;
 import org.apache.shale.view.ApplicationException;
 import org.apache.shale.view.Constants;
 import org.apache.shale.view.ExceptionHandler;
@@ -208,25 +210,54 @@
 
 
     /**
-     * <p>Call the <code>destroy()</code> method of the [EMAIL PROTECTED] 
ViewController}s
-     * that have been registered during this request (if any).</p>
+     * <p>Remove all request scoped attributes that implement the
+     * <code>ViewController</code> interface or extend the
+     * <code>AbstractRequestBean</code> base class.  This will trigger
+     * a callback to the <code>destroy()</code> method of such beans,
+     * while we are still in the context of a JSF request.</p>
      *
      * @param event <code>PhaseEvent</code> for the current event
      */
     private void afterRenderResponse(PhaseEvent event) {
 
+        // Initialize local values we will need
         Map map = event.getFacesContext().getExternalContext().getRequestMap();
-        List list = (List) map.get(FacesConstants.VIEWS_INITIALIZED);
-        if (list == null) {
-            return;
-        }
-        //Iterator vcs = list.iterator();
-        //while (vcs.hasNext()) {
-        //    Object vc = vcs.next();
-        //     viewControllerCallbacks(event.getFacesContext()).destroy(vc);
-        //}
+        List list = new ArrayList();
+        Iterator entries = map.entrySet().iterator();
 
+        // Remove our list of initialized views explicitly
         map.remove(FacesConstants.VIEWS_INITIALIZED);
+
+        // First select all the ViewController and AbstractRequestBean 
instances
+        while (entries.hasNext()) {
+            Map.Entry entry = (Map.Entry) entries.next();
+            if ((entry.getValue() instanceof ViewController)
+             || (entry.getValue() instanceof AbstractRequestBean)) {
+                list.add(entry.getKey());
+            }
+        }
+
+        // Second select all remaining instances, which will include annotated
+        // managed beans if Shale Tiger is present
+        entries = map.entrySet().iterator();
+        while (entries.hasNext()) {
+            Map.Entry entry = (Map.Entry) entries.next();
+            if (!list.contains(entry.getKey())) {
+                list.add(entry.getKey());
+            }
+        }
+
+        // Iterate through the keys in the specified order, removing the
+        // corresponding request scope attribute instances
+        Iterator keys = list.iterator();
+        while (keys.hasNext()) {
+            String key = (String) keys.next();
+            try {
+                map.remove(key);
+            } catch (Exception e) {
+                handleException(event.getFacesContext(), e);
+            }
+        }
 
     }
 


Reply via email to