Author: craigmcc
Date: Sat Dec 23 17:43:42 2006
New Revision: 489966

URL: http://svn.apache.org/viewvc?view=rev&rev=489966
Log:
Explicitly remove request scope attributes that implement @Request or @View,
which will trigger the event that actually calls @Destroy methods.  However,
it is not currently guaranteed that this will happen within the scope of a
Faces request (i.e. FacesContext.getCurrentInstance() will return zero if this
happens in the servlet container's cleanup), which can be inconvenient if you
need access to JSF resources in the destroy method.  Therefore, leaving this
open to investigate a solution (although it will have to wait a couple of days)
to get attention.

SHALE-374

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

Modified: 
shale/framework/trunk/shale-apps/shale-test-tiger/src/test/java/org/apache/shale/examples/test/tiger/systest/IntegrationTestCase.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-apps/shale-test-tiger/src/test/java/org/apache/shale/examples/test/tiger/systest/IntegrationTestCase.java?view=diff&rev=489966&r1=489965&r2=489966
==============================================================================
--- 
shale/framework/trunk/shale-apps/shale-test-tiger/src/test/java/org/apache/shale/examples/test/tiger/systest/IntegrationTestCase.java
 (original)
+++ 
shale/framework/trunk/shale-apps/shale-test-tiger/src/test/java/org/apache/shale/examples/test/tiger/systest/IntegrationTestCase.java
 Sat Dec 23 17:43:42 2006
@@ -162,8 +162,7 @@
 
         element = element("recorderEvents");
         assertNotNull(element);
-        assertEquals("init1/prerender1/init1/preprocess1/init2/prerender2/", 
element.asText());
-//        
assertEquals("init1/prerender1/destroy1/init1/preprocess1/init2/prerender2/", 
element.asText()); // FIXME - need destroy
+        
assertEquals("init1/prerender1/destroy1/init1/preprocess1/init2/prerender2/", 
element.asText());
 
     }
 
@@ -284,8 +283,7 @@
 
         element = element("recorderEvents");
         assertNotNull(element);
-        assertEquals("init1/prerender1/init1/preprocess1/", element.asText());
-//        assertEquals("init1/prerender1/destroy1/init1/preprocess1/", 
element.asText()); // FIXME - need destroy
+        assertEquals("init1/prerender1/destroy1/init1/preprocess1/", 
element.asText());
 
     }
 
@@ -315,8 +313,7 @@
 
         element = element("recorderEvents");
         assertNotNull(element);
-        assertEquals("init3/prerender3/init3/preprocess3/", element.asText());
-//        assertEquals("init3/prerender3/destroy3/init3/preprocess3/", 
element.asText()); // FIXME - need destroy
+        assertEquals("init3/prerender3/destroy3/init3/preprocess3/", 
element.asText());
 
     }
 
@@ -431,8 +428,7 @@
 
         element = element("recorderEvents");
         assertNotNull(element);
-        
assertEquals("init1/prerender1/init2/prerender2/init1/preprocess1/init2/preprocess2/prerender1/",
 element.asText());
-//        
assertEquals("init1/prerender1/init2/prerender2/destroy2/destroy1/init1/preprocess1/init2/preprocess2/prerender1/",
 element.asText()); // FIXME - need destroy events
+        
assertEquals("init1/prerender1/init2/prerender2/destroy2/destroy1/init1/preprocess1/init2/preprocess2/prerender1/",
 element.asText());
 
     }
 

Modified: 
shale/framework/trunk/shale-tiger/src/main/java/org/apache/shale/tiger/view/faces/LifecycleListener2.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-tiger/src/main/java/org/apache/shale/tiger/view/faces/LifecycleListener2.java?view=diff&rev=489966&r1=489965&r2=489966
==============================================================================
--- 
shale/framework/trunk/shale-tiger/src/main/java/org/apache/shale/tiger/view/faces/LifecycleListener2.java
 (original)
+++ 
shale/framework/trunk/shale-tiger/src/main/java/org/apache/shale/tiger/view/faces/LifecycleListener2.java
 Sat Dec 23 17:43:42 2006
@@ -27,6 +27,7 @@
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -46,6 +47,7 @@
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextAttributeEvent;
 import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletRequest;
 import javax.servlet.ServletRequestAttributeEvent;
 import javax.servlet.ServletRequestEvent;
 import javax.servlet.http.HttpSessionBindingEvent;
@@ -587,12 +589,45 @@
 
 
     /**
-     * <p>Respond to a request destroyed event.  No special processing
-     * is required.</p>
+     * <p>Respond to a request destroyed event.  Cause any instance of
+     * ViewController or AbstractRequestBean, plus any bean whose class
+     * contains the appropriate annotations, to be removed (which will trigger
+     * an attribute removed event).</p>
      *
      * @param event Event to be processed
      */
     public void requestDestroyed(ServletRequestEvent event) {
+
+        // FIXME - may be more performant to just cause all request attributes
+        // to be removed, because events will only be fired on relevant ones
+        // --------------------------------------------------------------------
+        // Remove any AbstractRequestBean or ViewController attributes,
+        // as well as beans whose class contains the relevant annotations
+        // which will trigger an attributeRemoved event
+        List list = new ArrayList();
+        ServletRequest request = event.getServletRequest();
+        Enumeration names = request.getAttributeNames();
+        while (names.hasMoreElements()) {
+            String name = (String) names.nextElement();
+            Object value = request.getAttribute(name);
+            // Direct implementations of the relevant APIs are included
+            if ((value instanceof AbstractRequestBean) || (value instanceof 
ViewController)) {
+                list.add(name);
+                continue;
+            }
+            // So are beans whose class implements the relevant annotations
+            Class clazz = value.getClass();
+            if ((clazz.getAnnotation(Request.class) != null)
+             || (clazz.getAnnotation(View.class) != null)) {
+                 list.add(name);
+                 continue;
+             }
+        }
+        Iterator keys = list.iterator();
+        while (keys.hasNext()) {
+            String key = (String) keys.next();
+            event.getServletRequest().removeAttribute(key);
+        }
 
         // No special processing is required
 

Modified: 
shale/framework/trunk/shale-view/src/main/java/org/apache/shale/view/faces/LifecycleListener.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-view/src/main/java/org/apache/shale/view/faces/LifecycleListener.java?view=diff&rev=489966&r1=489965&r2=489966
==============================================================================
--- 
shale/framework/trunk/shale-view/src/main/java/org/apache/shale/view/faces/LifecycleListener.java
 (original)
+++ 
shale/framework/trunk/shale-view/src/main/java/org/apache/shale/view/faces/LifecycleListener.java
 Sat Dec 23 17:43:42 2006
@@ -498,6 +498,7 @@
         LifecycleListener tiger = tiger();
         if (tiger != null) {
             tiger.requestDestroyed(event);
+            return;
         }
 
         // Remove any AbstractRequestBean or ViewController attributes,


Reply via email to