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;
}