You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by cr...@apache.org on 2006/07/01 00:27:59 UTC

svn commit: r418397 - in /struts/shale/trunk: shale-test/src/main/java/org/apache/shale/test/mock/ shale-tiger/src/main/java/org/apache/shale/tiger/faces/ shale-tiger/src/main/java/org/apache/shale/tiger/register/ shale-tiger/src/test/java/org/apache/s...

Author: craigmcc
Date: Fri Jun 30 15:27:58 2006
New Revision: 418397

URL: http://svn.apache.org/viewvc?rev=418397&view=rev
Log:
SHALE-197 -- Allow phase listeners to be automatically registered (at
startup time) by virtue of implementing the @FacesPhaseListener
annotation, rather than having to be configured in a faces-config.xml
file.  Building the unit test for this feature also necessitated
implementing the phase listener registration methods in MockLifecycle in
the shale-test module.

Modified:
    struts/shale/trunk/shale-test/src/main/java/org/apache/shale/test/mock/MockLifecycle.java
    struts/shale/trunk/shale-tiger/src/main/java/org/apache/shale/tiger/faces/LifecycleListener.java
    struts/shale/trunk/shale-tiger/src/main/java/org/apache/shale/tiger/register/package.html
    struts/shale/trunk/shale-tiger/src/test/java/org/apache/shale/tiger/faces/LifecycleListenerTestCase.java

Modified: struts/shale/trunk/shale-test/src/main/java/org/apache/shale/test/mock/MockLifecycle.java
URL: http://svn.apache.org/viewvc/struts/shale/trunk/shale-test/src/main/java/org/apache/shale/test/mock/MockLifecycle.java?rev=418397&r1=418396&r2=418397&view=diff
==============================================================================
--- struts/shale/trunk/shale-test/src/main/java/org/apache/shale/test/mock/MockLifecycle.java (original)
+++ struts/shale/trunk/shale-test/src/main/java/org/apache/shale/test/mock/MockLifecycle.java Fri Jun 30 15:27:58 2006
@@ -16,6 +16,8 @@
 
 package org.apache.shale.test.mock;
 
+import java.util.ArrayList;
+import java.util.List;
 import javax.faces.FacesException;
 import javax.faces.context.FacesContext;
 import javax.faces.event.PhaseListener;
@@ -36,12 +38,15 @@
     // ------------------------------------------------------ Instance Variables
 
 
+    private List listeners = new ArrayList();
+
+
     // ------------------------------------------------------- Lifecycle Methods
 
 
     public void addPhaseListener(PhaseListener listener) {
 
-        throw new UnsupportedOperationException();
+        listeners.add(listener);
 
     }
 
@@ -55,14 +60,14 @@
 
     public PhaseListener[] getPhaseListeners() {
 
-        throw new UnsupportedOperationException();
+        return (PhaseListener[]) listeners.toArray(new PhaseListener[listeners.size()]);
 
     }
 
 
     public void removePhaseListener(PhaseListener listener) {
 
-        throw new UnsupportedOperationException();
+        listeners.remove(listener);
 
     }
 

Modified: struts/shale/trunk/shale-tiger/src/main/java/org/apache/shale/tiger/faces/LifecycleListener.java
URL: http://svn.apache.org/viewvc/struts/shale/trunk/shale-tiger/src/main/java/org/apache/shale/tiger/faces/LifecycleListener.java?rev=418397&r1=418396&r2=418397&view=diff
==============================================================================
--- struts/shale/trunk/shale-tiger/src/main/java/org/apache/shale/tiger/faces/LifecycleListener.java (original)
+++ struts/shale/trunk/shale-tiger/src/main/java/org/apache/shale/tiger/faces/LifecycleListener.java Fri Jun 30 15:27:58 2006
@@ -31,6 +31,9 @@
 import javax.faces.FactoryFinder;
 import javax.faces.application.Application;
 import javax.faces.application.ApplicationFactory;
+import javax.faces.event.PhaseListener;
+import javax.faces.lifecycle.Lifecycle;
+import javax.faces.lifecycle.LifecycleFactory;
 import javax.faces.render.RenderKit;
 import javax.faces.render.RenderKitFactory;
 import javax.faces.render.Renderer;
@@ -49,8 +52,10 @@
 import org.apache.shale.tiger.managed.config.ManagedPropertyConfig;
 import org.apache.shale.tiger.register.FacesComponent;
 import org.apache.shale.tiger.register.FacesConverter;
+import org.apache.shale.tiger.register.FacesPhaseListener;
 import org.apache.shale.tiger.register.FacesRenderer;
 import org.apache.shale.tiger.register.FacesValidator;
+import org.apache.shale.tiger.register.faces.PhaseListenerAdapter;
 import org.apache.shale.util.Messages;
 import org.xml.sax.SAXException;
 
@@ -88,6 +93,12 @@
     private transient Messages messages = null;
 
 
+    /**
+     * <p>The <code>ServletContext</code> instance for this application.</p>
+     */
+    private transient ServletContext servletContext = null;
+
+
     // ------------------------------------------------------ Manifest Constants
 
 
@@ -146,11 +157,9 @@
             log().info(messages().getMessage("lifecycle.destroyed"));
         }
 
-        // Get a reference to the application ServletContext
-        ServletContext servletContext = event.getServletContext();
-
         // Clean up our allocated application scope attributes
         servletContext.removeAttribute(FACES_CONFIG_CONFIG);
+        servletContext = null;
 
     }
 
@@ -180,7 +189,7 @@
         }
 
         // Get a reference to the application ServletContext
-        ServletContext servletContext = event.getServletContext();
+        servletContext = event.getServletContext();
 
         // Create an empty FacesConfigConfig instance and stash it as
         // an application scope attribute
@@ -434,6 +443,27 @@
     }
 
 
+    private Lifecycle lifecycle = null;
+
+
+    /**
+     * <p>Return the <code>Lifecycle</code> for this application.</p>
+     */
+    private Lifecycle lifecycle() {
+
+        if (lifecycle == null) {
+            String lifecycleId = servletContext.getInitParameter("javax.faces.LIFECYCLE_ID");
+            if (lifecycleId == null) {
+                lifecycleId = LifecycleFactory.DEFAULT_LIFECYCLE;
+            }
+            lifecycle = ((LifecycleFactory) FactoryFinder.
+              getFactory(FactoryFinder.LIFECYCLE_FACTORY)).getLifecycle(lifecycleId);
+        }
+        return lifecycle;
+
+    }
+
+
     /**
      * <p>Return the <code>Log</code> instance to be used for this class,
      * instantiating a new one if necessary.</p>
@@ -532,6 +562,23 @@
                 log().trace("addConverter(" + conv.value() + "," + clazz.getName() + ")");
             }
             application().addConverter(conv.value(), clazz.getName());
+        }
+
+        FacesPhaseListener list = (FacesPhaseListener) clazz.getAnnotation(FacesPhaseListener.class);
+        if (list != null) {
+            try {
+                Lifecycle lifecycle = lifecycle();
+                Object instance = clazz.newInstance();
+                if (instance instanceof PhaseListener) {
+                    lifecycle.addPhaseListener((PhaseListener) instance);
+                } else {
+                    lifecycle.addPhaseListener(new PhaseListenerAdapter(instance));
+                }
+            } catch (FacesException e) {
+                throw e;
+            } catch (Exception e) {
+                throw new FacesException(e);
+            }
         }
 
         FacesRenderer rend = (FacesRenderer) clazz.getAnnotation(FacesRenderer.class);

Modified: struts/shale/trunk/shale-tiger/src/main/java/org/apache/shale/tiger/register/package.html
URL: http://svn.apache.org/viewvc/struts/shale/trunk/shale-tiger/src/main/java/org/apache/shale/tiger/register/package.html?rev=418397&r1=418396&r2=418397&view=diff
==============================================================================
--- struts/shale/trunk/shale-tiger/src/main/java/org/apache/shale/tiger/register/package.html (original)
+++ struts/shale/trunk/shale-tiger/src/main/java/org/apache/shale/tiger/register/package.html Fri Jun 30 15:27:58 2006
@@ -20,11 +20,12 @@
 
 <p>This package contains Java SE 5 <em>annotations</em> that allow you to
 register several types of JavaServer Faces artifacts (components, converters,
-renderers, and validators) without having to define them in a configuration
-resource.  Because the JavaServer Faces runtime does not support classes with
-arbitrary inheritance hierarchies to implement particular features, the
+phase listeners, renderers, and validators) without having to define them in
+a configuration resource.  Because the JavaServer Faces runtime does not support
+classes with arbitrary inheritance hierarchies to implement particular features, the
 actual classes themselves must also extend the corresponding JavaServer Faces
-APIs to be usable.</p>
+APIs to be usable (with the exception of annotated phase listeners, in which
+case an adapter instance will be interposed if necessary.</p>
 
 <p>To declare a JavaServer Faces <code>UIComponent</code> class:</p>
 <pre>
@@ -55,6 +56,24 @@
     
     &#64;FacesValidator("com.mycompany.mytypes.MY_VALIDATOR_ID")
     public class MyValidator implements Validator {
+      ...
+    }
+</pre>
+
+<p>To declare a JavaServer Faces <code>PhaseListener</code> class (the
+<code>BeforePhase</code> and <code>AfterPhase</code> event handers are both
+optional, and need only be specified if you are interested in that event):</p>
+<pre>
+    import org.apache.shale.tiger.register.AfterPhase;
+    import org.apache.shale.tiger.register.BeforePhase;
+    import org.apache.shale.tiger.register.FacesPhaseListener;
+    
+    &#64;FacesPhaseListener(phaseId=PhaseId.RENDER_RESPONSE)
+    public class MyPhaseListener {
+      ...
+      @BeforePhase public void myBeforePhase(PhaseEvent event) { ... }
+      ...
+      @AfterPhase public void myAfterPhase(PhaseEvent event) { ... }
       ...
     }
 </pre>

Modified: struts/shale/trunk/shale-tiger/src/test/java/org/apache/shale/tiger/faces/LifecycleListenerTestCase.java
URL: http://svn.apache.org/viewvc/struts/shale/trunk/shale-tiger/src/test/java/org/apache/shale/tiger/faces/LifecycleListenerTestCase.java?rev=418397&r1=418396&r2=418397&view=diff
==============================================================================
--- struts/shale/trunk/shale-tiger/src/test/java/org/apache/shale/tiger/faces/LifecycleListenerTestCase.java (original)
+++ struts/shale/trunk/shale-tiger/src/test/java/org/apache/shale/tiger/faces/LifecycleListenerTestCase.java Fri Jun 30 15:27:58 2006
@@ -21,6 +21,7 @@
 import java.util.Set;
 import javax.faces.component.UIComponent;
 import javax.faces.convert.Converter;
+import javax.faces.event.PhaseListener;
 import javax.faces.render.Renderer;
 import javax.faces.validator.Validator;
 import javax.servlet.ServletContextEvent;
@@ -31,6 +32,7 @@
 import org.apache.shale.tiger.config.FacesConfigConfig;
 import org.apache.shale.tiger.managed.config.ManagedBeanConfig;
 import org.apache.shale.tiger.managed.config.ManagedPropertyConfig;
+import org.apache.shale.tiger.register.faces.PhaseListenerAdapter;
 
 /**
  * <p>Test case for <code>org.apache.shale.tiger.faces.LifecycleListener</code>.</p>
@@ -378,6 +380,12 @@
         assertNotNull(rend);
         Validator val = application.createValidator("foo.MyValidator");
         assertNotNull(val);
+
+        // Check our lifecycle instance as well
+        PhaseListener listeners[] = lifecycle.getPhaseListeners();
+        assertNotNull(listeners);
+        assertEquals(1, listeners.length);
+        assertTrue(listeners[0] instanceof PhaseListenerAdapter);
 
         // Finalize the servlet context listener
         listener.contextDestroyed(event);