dev@jsf-extensions.java.net

Re: [JSF-EXT] redundant phase listener diff

From: Matthew Bohm <Matthew.Bohm_at_Sun.COM>
Date: Wed, 05 Sep 2007 19:11:35 -0700

Ed,

Just to verify, please see the attached new diff. For consistency, I
also modified the addPhaseListener logic to check for equals. BTW, we
actually could just do...

    public void addPhaseListener(PhaseListener phaseListener) {
            parent.addPhaseListener(phaseListener);
    }

...rather than...

    public void addPhaseListener(PhaseListener phaseListener) {
        if (!parentHasListener(phaseListener)) {
            parent.addPhaseListener(phaseListener);
        }
    }

...since we are now removing redundancies in the execute method. I'm not
sure it matters. I guess I prefer to retain the parentHasListener check,
but don't mind either way.

So let me know if these changes are what you meant, and/or if you have a
preference for addPhaseListener.

Thanks,
Matt

Ed Burns wrote:
>>>>>> On Tue, 04 Sep 2007 13:16:31 -0700, Matthew Bohm <Matthew.Bohm_at_Sun.COM> said:
>>>>>>
>
> MB> listeners of the same type redundant. Note that this is, generally
> MB> speaking, a wider definition of redundancy than the logic employed
> MB> in jsf 1.2_05, which effectively tests for redundancy using the
> MB> equals method of the phase listeners. (Shale remoting's phase
> MB> listener, for instance, does not override equals, so only the exact
> MB> same instance is considered redundant.) Using this slightly
> MB> different definition of redundancy in
> MB> PartialTraversalLifecycle.execute maintains consistency with
> MB> PartialTraversalLifecycle.addPhaseListener and ensures that phase
> MB> listeners are tested for both defintions of redundancy as of jsf
> MB> 1.2_05.
>
> Can you add an || that uses the equals() method?
>
> Other than that, r=edburns for check into jsf-extensions.
>
> Ed
>
>



Index: code/run-time/avatar/src/main/java/com/sun/faces/extensions/avatar/lifecycle/PartialTraversalLifecycle.java
===================================================================
--- code/run-time/avatar/src/main/java/com/sun/faces/extensions/avatar/lifecycle/PartialTraversalLifecycle.java (revision 461)
+++ code/run-time/avatar/src/main/java/com/sun/faces/extensions/avatar/lifecycle/PartialTraversalLifecycle.java (working copy)
@@ -62,13 +62,27 @@
 public class PartialTraversalLifecycle extends Lifecycle {
     
     private Lifecycle parent = null;
+ private boolean redundantPhaseListenersRemoved = false;
 
     public PartialTraversalLifecycle(Lifecycle parent) {
         this.parent = parent;
     }
 
-
     public void execute(FacesContext context) throws FacesException {
+ if (!redundantPhaseListenersRemoved) {
+ PhaseListener [] listeners = getPhaseListeners();
+ for (int i = 0; i < listeners.length; i++) {
+ //test if listeners[i] has any duplicates later in the array,
+ //and, if so, remove listeners[i]
+ for (int j = i + 1; j < listeners.length; j++) {
+ if (listeners[i].getClass().getName().equals(listeners[j].getClass().getName()) || listeners[i].equals(listeners[j])){
+ removePhaseListener(listeners[i]);
+ break; //go to the next i
+ }
+ }
+ }
+ redundantPhaseListenersRemoved = true;
+ }
         AsyncResponse async = AsyncResponse.getInstance();
         if (AsyncResponse.isAjaxRequest()) {
             async.installOnOffResponse(context);
@@ -139,13 +153,11 @@
     
 
     public void removePhaseListener(PhaseListener phaseListener) {
- if (!parentHasListenerOfClass(phaseListener)) {
- parent.removePhaseListener(phaseListener);
- }
+ parent.removePhaseListener(phaseListener);
     }
 
     public void addPhaseListener(PhaseListener phaseListener) {
- if (!parentHasListenerOfClass(phaseListener)) {
+ if (!parentHasListener(phaseListener)) {
             parent.addPhaseListener(phaseListener);
         }
     }
@@ -155,12 +167,12 @@
         return result;
     }
     
- private boolean parentHasListenerOfClass(PhaseListener listener) {
+ private boolean parentHasListener(PhaseListener listener) {
         boolean result = false;
         PhaseListener [] listeners = getPhaseListeners();
         
         for (PhaseListener cur : listeners) {
- if (cur.getClass().getName().equals(listener.getClass().getName())){
+ if (cur.getClass().getName().equals(listener.getClass().getName()) || cur.equals(listener)){
                 result = true;
                 break;
             }