SWF-1245 Invoke after phase listeners in reverse order

This commit is contained in:
Rossen Stoyanchev
2010-06-02 05:55:04 +00:00
parent 55d48aba51
commit dcf9ad24b3
2 changed files with 72 additions and 8 deletions

View File

@@ -32,7 +32,7 @@ public class JsfUtils {
public static void notifyAfterListeners(PhaseId phaseId, Lifecycle lifecycle, FacesContext context) {
PhaseEvent afterPhaseEvent = new PhaseEvent(context, phaseId, lifecycle);
for (int i = 0; i < lifecycle.getPhaseListeners().length; i++) {
for (int i = (lifecycle.getPhaseListeners().length - 1); i >= 0; i--) {
PhaseListener listener = lifecycle.getPhaseListeners()[i];
if (listener.getPhaseId() == phaseId || listener.getPhaseId() == PhaseId.ANY_PHASE) {
listener.afterPhase(afterPhaseEvent);
@@ -66,11 +66,4 @@ public class JsfUtils {
}
}
public static boolean isAtLeastJsf12() {
return JsfVersion.isAtLeastJsf12();
}
public static boolean isPortlet(FacesContext context) {
return context.getExternalContext().getContext().getClass().getName().indexOf("Portlet") != -1;
}
}

View File

@@ -0,0 +1,71 @@
package org.springframework.faces.webflow;
import java.util.ArrayList;
import java.util.List;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import junit.framework.TestCase;
import org.apache.myfaces.test.mock.MockFacesContext20;
import org.apache.myfaces.test.mock.lifecycle.MockLifecycle;
public class JsfUtilsTests extends TestCase {
public void testBeforeListenersCalledInForwardOrder() throws Exception {
List list = new ArrayList();
MockLifecycle lifecycle = new MockLifecycle();
PhaseListener listener1 = new OrderVerifyingPhaseListener(null, list);
lifecycle.addPhaseListener(listener1);
PhaseListener listener2 = new OrderVerifyingPhaseListener(null, list);
lifecycle.addPhaseListener(listener2);
PhaseListener listener3 = new OrderVerifyingPhaseListener(null, list);
lifecycle.addPhaseListener(listener3);
JsfUtils.notifyBeforeListeners(PhaseId.ANY_PHASE, lifecycle, new MockFacesContext20());
assertEquals(listener1, list.get(0));
assertEquals(listener2, list.get(1));
assertEquals(listener3, list.get(2));
}
public void testAfterListenersCalledInReverseOrder() throws Exception {
List list = new ArrayList();
MockLifecycle lifecycle = new MockLifecycle();
PhaseListener listener1 = new OrderVerifyingPhaseListener(list, null);
lifecycle.addPhaseListener(listener1);
PhaseListener listener2 = new OrderVerifyingPhaseListener(list, null);
lifecycle.addPhaseListener(listener2);
PhaseListener listener3 = new OrderVerifyingPhaseListener(list, null);
lifecycle.addPhaseListener(listener3);
JsfUtils.notifyAfterListeners(PhaseId.ANY_PHASE, lifecycle, new MockFacesContext20());
assertEquals(listener3, list.get(0));
assertEquals(listener2, list.get(1));
assertEquals(listener1, list.get(2));
}
private class OrderVerifyingPhaseListener implements PhaseListener {
private List afterPhaseList;
private List beforePhaseList;
public OrderVerifyingPhaseListener(List afterPhaseList, List beforePhaseList) {
this.afterPhaseList = afterPhaseList;
this.beforePhaseList = beforePhaseList;
}
public void afterPhase(PhaseEvent event) {
afterPhaseList.add(this);
}
public void beforePhase(PhaseEvent event) {
beforePhaseList.add(this);
}
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}
}