dev@javaserverfaces.java.net

Final f:event code changes

From: Jason Lee <jasondlee_at_sun.com>
Date: Fri, 06 Feb 2009 16:41:40 -0600

Here is the change bundle that should fix any outstanding bugs in the
f:event implementation, as well as bring it up to date with the
current state of the spec. All unit tests are (finally) passing.

* Moved Util.loadClass and related code to
NamedEventManager.getNamedEvent() for more consistent error checking
* Add Class.isAssignable check
* Add no-arg method option to the "listener" method
* Add code to the systest to exercise the FQCN code path
* Code clean up

Index: jsf-ri/src/com/sun/faces/facelets/tag/jsf/core/EventHandler.java
===================================================================
--- jsf-ri/src/com/sun/faces/facelets/tag/jsf/core/EventHandler.java
(revision 6428)
+++ jsf-ri/src/com/sun/faces/facelets/tag/jsf/core/EventHandler.java
(working copy)
@@ -10,9 +10,9 @@
  import java.io.IOException;
  import java.io.Serializable;

-import javax.el.ELContext;
  import javax.el.ELException;
  import javax.el.MethodExpression;
+import javax.el.MethodNotFoundException;
  import javax.faces.FacesException;
  import javax.faces.context.FacesContext;
  import javax.faces.component.UIComponent;
@@ -48,25 +48,13 @@
      }

      protected Class<? extends SystemEvent>
getEventClass(FaceletContext ctx) {
- Class<? extends SystemEvent> clazz = null;
          String eventType = (String)
this.type.getValueExpression(ctx, String.class).getValue(ctx);
          if (eventType == null) {
              throw new FacesException("Attribute 'type' can not be
null");
          }
- ApplicationAssociate associate =
-
ApplicationAssociate
.getInstance(ctx.getFacesContext().getExternalContext());
- NamedEventManager nem = associate.getNamedEventManager();

- clazz = nem.getNamedEvent(eventType);
- if (clazz == null) {
- try {
- clazz = Util.loadClass(eventType, this);
- } catch (ClassNotFoundException ex) {
- throw new FacesException ("An unknown event type was
specified: " + eventType);
- }
- }
-
- return clazz;
+ return
ApplicationAssociate
.getInstance(ctx.getFacesContext().getExternalContext())
+ .getNamedEventManager().getNamedEvent(eventType);
      }

  }
@@ -86,6 +74,12 @@
      }

      public void processEvent(ComponentSystemEvent event) throws
AbortProcessingException {
-
action.invoke(FacesContext.getCurrentInstance().getELContext(), new
Object[]{event});
+ try{
+ // Attempt to call public void
method(ComponentSystemEvent event)
+
action.invoke(FacesContext.getCurrentInstance().getELContext(), new
Object[]{event});
+ } catch (MethodNotFoundException mnfe) {
+ // Attempt to call public void method()
+
action.invoke(FacesContext.getCurrentInstance().getELContext(), new
Object[]{});
+ }
      }
  }
\ No newline at end of file
Index: jsf-ri/src/com/sun/faces/application/NamedEventManager.java
===================================================================
--- jsf-ri/src/com/sun/faces/application/NamedEventManager.java
(revision 6428)
+++ jsf-ri/src/com/sun/faces/application/NamedEventManager.java
(working copy)
@@ -4,15 +4,18 @@
   */
  package com.sun.faces.application;

+import com.sun.faces.util.Util;
  import java.util.HashSet;
  import java.util.Map;
  import java.util.Set;
  import java.util.concurrent.ConcurrentHashMap;
+import javax.faces.FacesException;
  import javax.faces.event.AfterAddToParentEvent;
  import javax.faces.event.AfterAddToViewEvent;
  import javax.faces.event.AfterValidateEvent;
  import javax.faces.event.BeforeRenderEvent;
  import javax.faces.event.BeforeValidateEvent;
+import javax.faces.event.ComponentSystemEvent;
  import javax.faces.event.SystemEvent;

  /**
@@ -45,6 +48,17 @@
      public Class<? extends SystemEvent> getNamedEvent(String name) {
          String foo = namedEvents.toString();
          Class<? extends SystemEvent> namedEvent =
namedEvents.get(name);
+ if (namedEvent == null) {
+ try {
+ namedEvent = Util.loadClass(name, this);
+ } catch (ClassNotFoundException ex) {
+ throw new FacesException ("An unknown event type was
specified: " + name, ex);
+ }
+ }
+ if (!ComponentSystemEvent.class.isAssignableFrom(namedEvent)) {
+ throw new ClassCastException();
+ }
+
          return namedEvent;
      }

Index: jsf-ri/systest/src/com/sun/faces/annotation/
AnnotationTestBean.java
===================================================================
--- jsf-ri/systest/src/com/sun/faces/annotation/
AnnotationTestBean.java (revision 6428)
+++ jsf-ri/systest/src/com/sun/faces/annotation/
AnnotationTestBean.java (working copy)
@@ -172,8 +172,12 @@
          // Test short name
           
assertNotNull(ApplicationAssociate.getInstance(ctx.getExternalContext())
                .getNamedEventManager
().getNamedEvent
("com.sun.faces.annotation.anotherAnnotatedComponentSystem"));
+ // Test FQCN
           
assertNotNull(ApplicationAssociate.getInstance(ctx.getExternalContext())
+
               .getNamedEventManager
().getNamedEvent(AnnotatedComponentSystemEvent.class.getName()));
+
assertNotNull(ApplicationAssociate.getInstance(ctx.getExternalContext())
                .getNamedEventManager
().getNamedEvent("explicitEventName"));
+
      }

      private void assertNotNull(Object v) {



         Jason Lee
Senior Java Developer
GlassFish Administration Console

Sun Microsystems, Inc.
Phone x31197/+1 405-343-1964
Email jasondlee_at_sun.com
Blog http://blogs.sun.com/jasondlee
Blog http://blogs.steeplesoft.com