diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfUtils.java b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfUtils.java index 61bc7e82..94bff65e 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfUtils.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfUtils.java @@ -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; - } } diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/JsfUtilsTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/JsfUtilsTests.java new file mode 100644 index 00000000..66fd694f --- /dev/null +++ b/spring-faces/src/test/java/org/springframework/faces/webflow/JsfUtilsTests.java @@ -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; + } + + } + +}