1 /*** 2 * 3 */ 4 package net.sf.jsfcomp.onload; 5 6 import java.io.File; 7 import java.net.URL; 8 9 import javax.faces.application.NavigationHandler; 10 import javax.faces.application.ViewHandler; 11 import javax.faces.component.UIViewRoot; 12 import javax.faces.context.FacesContext; 13 import javax.faces.event.PhaseEvent; 14 import javax.faces.event.PhaseId; 15 16 import org.apache.shale.test.base.AbstractViewControllerTestCase; 17 18 /*** 19 * 20 * @author Andrew Robinson 21 */ 22 public class OnLoadPhaseListenerTest 23 extends AbstractViewControllerTestCase 24 { 25 private TestBean testBean; 26 private TestNavigationHandler navHandler; 27 28 public OnLoadPhaseListenerTest() 29 { 30 super("Test on-load PhaseListener"); 31 } 32 33 public void setUp() 34 throws Exception 35 { 36 super.setUp(); 37 38 URL url = Thread.currentThread().getContextClassLoader().getResource("test-onload-config.xml"); 39 File file = new File(url.toURI()); 40 servletContext.setDocumentRoot(file.getParentFile()); 41 42 servletContext.addInitParameter("onload-config", "/test-onload-config.xml"); 43 44 testBean = new TestBean(); 45 externalContext.getRequestMap().put("testBean", testBean); 46 47 navHandler = new TestNavigationHandler(); 48 application.setNavigationHandler(navHandler); 49 } 50 51 public void testSuccessRule() 52 { 53 final String viewId = "/testSpecificViewId.xhtml"; 54 facesContext.getViewRoot().setViewId(viewId); 55 testBean.setOutcome("success"); 56 runPhaseListenerTest(); 57 assertEquals("View was navigated", viewId, facesContext.getViewRoot().getViewId()); 58 } 59 60 public void testAlterNavigationRule() 61 { 62 final String viewId = "/testInitView.xhtml"; 63 final String newViewId = "/testNewView.xhtml"; 64 facesContext.getViewRoot().setViewId(viewId); 65 testBean.setOutcome(newViewId); 66 runPhaseListenerTest(); 67 assertEquals("View was not navigated", newViewId, facesContext.getViewRoot().getViewId()); 68 } 69 70 public void testNonMatchingNavigationRule() 71 { 72 final String viewId = "/testInitView.xhtml"; 73 facesContext.getViewRoot().setViewId(viewId); 74 testBean.setOutcome(TestNavigationHandler.NO_MATCH_OUTCOME); 75 runPhaseListenerTest(); 76 assertEquals("View was navigated", viewId, facesContext.getViewRoot().getViewId()); 77 assertTrue("Bean was not invoked", testBean.getWasExecuted()); 78 } 79 80 public void testUnmatchedNavigationRule() 81 { 82 final String viewId = "/initView.xhtml"; 83 facesContext.getViewRoot().setViewId(viewId); 84 runPhaseListenerTest(); 85 assertFalse("Bean was invoked", testBean.getWasExecuted()); 86 } 87 88 private void runPhaseListenerTest() 89 { 90 PhaseEvent phaseEvent = new PhaseEvent(facesContext, PhaseId.RENDER_RESPONSE, lifecycle); 91 OnLoadPhaseListener phaseListener = new OnLoadPhaseListener(); 92 phaseListener.beforePhase(phaseEvent); 93 phaseListener.afterPhase(phaseEvent); 94 } 95 96 public class TestBean 97 { 98 private String outcome = null; 99 private boolean wasExecuted = false; 100 101 public String onLoad() 102 { 103 wasExecuted = true; 104 return outcome; 105 } 106 107 public boolean getWasExecuted() 108 { 109 return wasExecuted; 110 } 111 112 /*** 113 * @return the outcome 114 */ 115 public String getOutcome() 116 { 117 return this.outcome; 118 } 119 120 /*** 121 * @param outcome the outcome to set 122 */ 123 public void setOutcome(String outcome) 124 { 125 this.outcome = outcome; 126 } 127 } 128 129 public static class TestNavigationHandler 130 extends NavigationHandler 131 { 132 public static final String NO_MATCH_OUTCOME = "doNotMatch"; 133 /*** 134 * @see javax.faces.application.NavigationHandler#handleNavigation( 135 * javax.faces.context.FacesContext, java.lang.String, java.lang.String) 136 */ 137 public void handleNavigation(FacesContext context, String fromAction, 138 String outcome) 139 { 140 ViewHandler viewHandler = context.getApplication().getViewHandler(); 141 if (NO_MATCH_OUTCOME.equals(outcome)) 142 { 143 return; 144 } 145 UIViewRoot viewRoot = viewHandler.createView(context, outcome); 146 viewRoot.setViewId(outcome); 147 context.setViewRoot(viewRoot); 148 context.renderResponse(); 149 } 150 } 151 }