View Javadoc

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 }