View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.myfaces.view.facelets;
20  
21  import java.beans.BeanInfo;
22  import java.io.IOException;
23  import java.util.Iterator;
24  
25  import javax.faces.FactoryFinder;
26  import javax.faces.application.Resource;
27  import javax.faces.component.UIComponent;
28  import javax.faces.component.UIForm;
29  import javax.faces.component.UIViewRoot;
30  import javax.faces.component.html.HtmlCommandButton;
31  import javax.faces.component.html.HtmlForm;
32  import javax.faces.component.html.HtmlInputText;
33  import javax.faces.component.html.HtmlOutputText;
34  import javax.faces.context.FacesContext;
35  import javax.faces.event.PhaseId;
36  import javax.faces.render.RenderKitFactory;
37  import javax.faces.render.ResponseStateManager;
38  import javax.faces.view.StateManagementStrategy;
39  import javax.faces.view.ViewDeclarationLanguage;
40  import javax.faces.view.ViewDeclarationLanguageFactory;
41  import javax.faces.view.ViewMetadata;
42  
43  import org.apache.myfaces.application.ApplicationFactoryImpl;
44  import org.apache.myfaces.application.StateManagerImpl;
45  import org.apache.myfaces.component.visit.VisitContextFactoryImpl;
46  import org.apache.myfaces.renderkit.html.HtmlButtonRenderer;
47  import org.apache.myfaces.renderkit.html.HtmlFormRenderer;
48  import org.apache.myfaces.renderkit.html.HtmlTextRenderer;
49  import org.apache.myfaces.test.base.junit4.AbstractJsfConfigurableMockTestCase;
50  import org.apache.myfaces.test.mock.MockRenderKit;
51  import org.apache.myfaces.view.ViewMetadataBase;
52  import org.junit.Assert;
53  import org.junit.Test;
54  
55  public class DefaultFaceletsStateManagementStrategyTest extends
56          AbstractJsfConfigurableMockTestCase
57  {
58  
59      public DefaultFaceletsStateManagementStrategyTest()
60      {
61          super();
62      }
63      
64      public Object stateToRestore;
65      
66      @Override
67      public void setUp() throws Exception
68      {
69          super.setUp();
70          
71          FactoryFinder.setFactory(FactoryFinder.VISIT_CONTEXT_FACTORY, VisitContextFactoryImpl.class.getName());
72          
73          RenderKitFactory renderKitFactory = (RenderKitFactory)FactoryFinder.getFactory("javax.faces.render.RenderKitFactory");
74          renderKit = new MockRenderKit()
75          {
76              ResponseStateManager stateManager = new ResponseStateManager(){
77                  public Object getState(FacesContext context, String viewId)
78                  {
79                      return stateToRestore;
80                  }
81              };
82  
83              @Override
84              public ResponseStateManager getResponseStateManager()
85              {
86                  return stateManager;
87              }
88          };
89          renderKitFactory.addRenderKit("HTML_BASIC2", renderKit);
90          
91          //FactoryFinder.setFactory(FactoryFinder.VISIT_CONTEXT_FACTORY,
92          //        VisitContextFactoryImpl.class.getName());
93  
94          renderKit.addRenderer(
95                  new HtmlCommandButton().getFamily(),
96                  new HtmlCommandButton().getRendererType(),
97                  new HtmlButtonRenderer());
98          renderKit.addRenderer(
99                  new HtmlForm().getFamily(),
100                 new HtmlForm().getRendererType(),
101                 new HtmlFormRenderer());
102         renderKit.addRenderer(
103                 new HtmlOutputText().getFamily(),
104                 new HtmlOutputText().getRendererType(),
105                 new HtmlTextRenderer());
106         renderKit.addRenderer(
107                 new HtmlInputText().getFamily(),
108                 new HtmlInputText().getRendererType(),
109                 new HtmlTextRenderer());           
110     }
111 
112     @Override
113     public void tearDown() throws Exception
114     {
115         stateToRestore = null;
116         super.tearDown();
117     }
118 
119     public static class MockViewDeclarationLanguageFactory extends ViewDeclarationLanguageFactory
120     {
121 
122         public ViewDeclarationLanguage vdl = new MockViewDeclarationLanguage();
123         
124         @Override
125         public ViewDeclarationLanguage getViewDeclarationLanguage(String viewId)
126         {
127             return vdl;
128         }
129         
130     }
131     
132     @Override
133     protected void setFactories() throws Exception
134     {
135         super.setFactories();
136         FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY,
137                 ApplicationFactoryImpl.class.getName());
138         FactoryFinder.setFactory(FactoryFinder.VIEW_DECLARATION_LANGUAGE_FACTORY, MockViewDeclarationLanguageFactory.class.getName());
139     }
140 
141     @Test
142     public void testSimpleSaveRestore() throws Exception
143     {
144         ViewDeclarationLanguage vdl =((MockViewDeclarationLanguageFactory)FactoryFinder.getFactory(FactoryFinder.VIEW_DECLARATION_LANGUAGE_FACTORY)).vdl;
145         DefaultFaceletsStateManagementStrategy stateManagement = new DefaultFaceletsStateManagementStrategy();
146         
147         servletContext.addInitParameter("javax.faces.STATE_SAVING_METHOD", "client");
148         
149         UIViewRoot viewRoot = vdl.createView(facesContext, "/root");
150         vdl.buildView(facesContext, viewRoot);
151         stateManagement.suscribeListeners(viewRoot);
152         
153         viewRoot.getAttributes().put("somekey", "somevalue");
154         
155         Object state1 = stateManagement.saveView(facesContext);
156         stateToRestore = state1;
157         facesContext.setViewRoot(null);
158         stateManagement.restoreView(facesContext, "/root", viewRoot.getRenderKitId());
159         
160         viewRoot = facesContext.getViewRoot();
161         
162         Assert.assertEquals("somevalue", viewRoot.getAttributes().get("somekey"));
163         Assert.assertNotNull(viewRoot.findComponent("form1"));
164         Assert.assertNotNull(viewRoot.findComponent("form1:foo1"));
165         Assert.assertNotNull(viewRoot.findComponent("form1:var1"));
166         Assert.assertNotNull(viewRoot.findComponent("form1:button1"));
167     }
168     
169     @Test
170     public void testSaveRestoreAddComponent() throws Exception
171     {
172         ViewDeclarationLanguage vdl =((MockViewDeclarationLanguageFactory)FactoryFinder.getFactory(FactoryFinder.VIEW_DECLARATION_LANGUAGE_FACTORY)).vdl;
173         DefaultFaceletsStateManagementStrategy stateManagement = new DefaultFaceletsStateManagementStrategy();
174         
175         servletContext.addInitParameter("javax.faces.STATE_SAVING_METHOD", "client");
176         
177         UIViewRoot viewRoot = vdl.createView(facesContext, "/root");
178         vdl.buildView(facesContext, viewRoot);
179         stateManagement.suscribeListeners(viewRoot);
180 
181         viewRoot.getAttributes().put("somekey", "somevalue");
182         
183         HtmlOutputText a = new HtmlOutputText();
184         
185         a.setId("output1");
186         a.setValue("testOutput1");
187         
188         viewRoot.getChildren().add(a);
189         
190         Object state1 = stateManagement.saveView(facesContext);
191         stateToRestore = state1;
192         facesContext.setViewRoot(null);
193         stateManagement.restoreView(facesContext, "/root", viewRoot.getRenderKitId());
194         
195         viewRoot = facesContext.getViewRoot();
196         
197         Assert.assertEquals("somevalue", viewRoot.getAttributes().get("somekey"));
198         Assert.assertNotNull(viewRoot.findComponent("form1"));
199         Assert.assertNotNull(viewRoot.findComponent("form1:foo1"));
200         Assert.assertNotNull(viewRoot.findComponent("form1:var1"));
201         Assert.assertNotNull(viewRoot.findComponent("form1:button1"));
202         
203         a = (HtmlOutputText) viewRoot.findComponent("output1");
204         Assert.assertNotNull(a);
205         Assert.assertEquals("testOutput1",a.getValue());
206     }
207     
208     @Test
209     public void testSaveRestoreAddComponentMultiplePostback() throws Exception
210     {
211         ViewDeclarationLanguage vdl =((MockViewDeclarationLanguageFactory)FactoryFinder.getFactory(FactoryFinder.VIEW_DECLARATION_LANGUAGE_FACTORY)).vdl;
212         DefaultFaceletsStateManagementStrategy stateManagement = new DefaultFaceletsStateManagementStrategy();
213         
214         servletContext.addInitParameter("javax.faces.STATE_SAVING_METHOD", "client");
215         
216         UIViewRoot viewRoot = vdl.createView(facesContext, "/root");
217         
218         facesContext.setCurrentPhaseId(PhaseId.RESTORE_VIEW);
219         
220         vdl.buildView(facesContext, viewRoot);
221         
222         stateManagement.suscribeListeners(viewRoot);
223         
224         facesContext.setCurrentPhaseId(PhaseId.RENDER_RESPONSE);
225         
226         viewRoot.getAttributes().put("somekey", "somevalue");
227         
228         HtmlOutputText a = new HtmlOutputText();
229         a.setId("output1");
230         a.setValue("testOutput1");
231         viewRoot.getChildren().add(a);
232         
233         viewRoot = saveAndRestore(stateManagement, viewRoot);
234 
235         HtmlOutputText b = new HtmlOutputText();
236         b.setId("output2");
237         b.setValue("testOutput2");
238         viewRoot.getChildren().add(b);
239 
240         viewRoot = saveAndRestore(stateManagement, viewRoot);
241         
242         HtmlOutputText c = new HtmlOutputText();
243         c.setId("output3");
244         c.setValue("testOutput3");
245         viewRoot.getChildren().add(c);
246 
247         viewRoot = saveAndRestore(stateManagement, viewRoot);
248         
249         HtmlOutputText d = new HtmlOutputText();
250         d.setId("output4");
251         d.setValue("testOutput4");
252         viewRoot.getChildren().add(d);
253         
254         viewRoot = saveAndRestore(stateManagement, viewRoot);
255         
256         Assert.assertEquals("somevalue", viewRoot.getAttributes().get("somekey"));
257         Assert.assertNotNull(viewRoot.findComponent("form1"));
258         Assert.assertNotNull(viewRoot.findComponent("form1:foo1"));
259         Assert.assertNotNull(viewRoot.findComponent("form1:var1"));
260         Assert.assertNotNull(viewRoot.findComponent("form1:button1"));
261         
262         a = (HtmlOutputText) viewRoot.findComponent("output1");
263         Assert.assertNotNull(a);
264         Assert.assertEquals("testOutput1",a.getValue());
265         b = (HtmlOutputText) viewRoot.findComponent("output2");
266         Assert.assertNotNull(b);
267         Assert.assertEquals("testOutput2",b.getValue());
268         c = (HtmlOutputText) viewRoot.findComponent("output3");
269         Assert.assertNotNull(c);
270         Assert.assertEquals("testOutput3",c.getValue());
271         d = (HtmlOutputText) viewRoot.findComponent("output4");
272         Assert.assertNotNull(d);
273         Assert.assertEquals("testOutput4",d.getValue());
274     }
275     
276     @Test
277     public void testSaveRestoreToogleComponent() throws Exception
278     {
279         ViewDeclarationLanguage vdl =((MockViewDeclarationLanguageFactory)FactoryFinder.getFactory(FactoryFinder.VIEW_DECLARATION_LANGUAGE_FACTORY)).vdl;
280         DefaultFaceletsStateManagementStrategy stateManagement = new DefaultFaceletsStateManagementStrategy();
281         
282         servletContext.addInitParameter("javax.faces.STATE_SAVING_METHOD", "client");
283         
284         UIViewRoot viewRoot = vdl.createView(facesContext, "/root");
285         vdl.buildView(facesContext, viewRoot);
286         stateManagement.suscribeListeners(viewRoot);
287 
288         viewRoot.getAttributes().put("somekey", "somevalue");
289         
290         HtmlOutputText a = new HtmlOutputText();
291         a.setId("output1");
292         a.setValue("testOutput1");
293         
294         viewRoot.getChildren().add(a);
295         
296         viewRoot = saveAndRestore(stateManagement, viewRoot);
297         
298         Assert.assertEquals("form1",viewRoot.getChildren().get(0).getId());
299         Assert.assertEquals("output1",viewRoot.getChildren().get(1).getId());
300         
301         UIComponent component = viewRoot.getChildren().remove( 0 );
302         viewRoot.getChildren().add( component );
303 
304         viewRoot = saveAndRestore(stateManagement, viewRoot);
305 
306         Assert.assertEquals("output1",viewRoot.getChildren().get(0).getId());
307         Assert.assertEquals("form1",viewRoot.getChildren().get(1).getId());
308         
309         component = viewRoot.getChildren().remove( 0 );
310         viewRoot.getChildren().add( component );
311 
312         viewRoot = saveAndRestore(stateManagement, viewRoot);
313 
314         Assert.assertEquals("form1",viewRoot.getChildren().get(0).getId());
315         Assert.assertEquals("output1",viewRoot.getChildren().get(1).getId());
316         
317         component = viewRoot.getChildren().remove( 0 );
318         viewRoot.getChildren().add( component );
319 
320         viewRoot = saveAndRestore(stateManagement, viewRoot);
321 
322         Assert.assertEquals("output1",viewRoot.getChildren().get(0).getId());
323         Assert.assertEquals("form1",viewRoot.getChildren().get(1).getId());
324         
325         component = viewRoot.getChildren().remove( 0 );
326         viewRoot.getChildren().add( component );
327 
328         viewRoot = saveAndRestore(stateManagement, viewRoot);
329 
330         Assert.assertEquals("form1",viewRoot.getChildren().get(0).getId());
331         Assert.assertEquals("output1",viewRoot.getChildren().get(1).getId());
332         
333         Assert.assertEquals("somevalue", viewRoot.getAttributes().get("somekey"));
334         Assert.assertNotNull(viewRoot.findComponent("form1"));
335         Assert.assertNotNull(viewRoot.findComponent("form1:foo1"));
336         Assert.assertNotNull(viewRoot.findComponent("form1:var1"));
337         Assert.assertNotNull(viewRoot.findComponent("form1:button1"));
338         
339         a = (HtmlOutputText) viewRoot.findComponent("output1");
340         Assert.assertNotNull(a);
341         Assert.assertEquals("testOutput1",a.getValue());
342     }
343     
344     @Test
345     public void testSaveRestoreToogleComponent2() throws Exception
346     {
347         ViewDeclarationLanguage vdl =((MockViewDeclarationLanguageFactory)FactoryFinder.getFactory(FactoryFinder.VIEW_DECLARATION_LANGUAGE_FACTORY)).vdl;
348         DefaultFaceletsStateManagementStrategy stateManagement = new DefaultFaceletsStateManagementStrategy();
349         
350         servletContext.addInitParameter("javax.faces.STATE_SAVING_METHOD", "client");
351         
352         UIViewRoot viewRoot = vdl.createView(facesContext, "/root");
353         vdl.buildView(facesContext, viewRoot);
354         stateManagement.suscribeListeners(viewRoot);
355 
356         viewRoot.getAttributes().put("somekey", "somevalue");
357         
358         HtmlOutputText a = new HtmlOutputText();
359         a.setId("output1");
360         a.setValue("testOutput1");        
361         viewRoot.getChildren().add(a);
362 
363         HtmlOutputText b = new HtmlOutputText();
364         b.setId("output2");
365         b.setValue("testOutput2");        
366         viewRoot.getChildren().add(b);
367         
368         viewRoot = saveAndRestore(stateManagement, viewRoot);
369         
370         Assert.assertEquals("form1",viewRoot.getChildren().get(0).getId());
371         Assert.assertEquals("output1",viewRoot.getChildren().get(1).getId());
372         Assert.assertEquals("output2",viewRoot.getChildren().get(2).getId());
373         
374         UIComponent component = viewRoot.getChildren().remove( 0 );
375         viewRoot.getChildren().add( component );
376 
377         viewRoot = saveAndRestore(stateManagement, viewRoot);
378 
379         Assert.assertEquals("output1",viewRoot.getChildren().get(0).getId());
380         Assert.assertEquals("output2",viewRoot.getChildren().get(1).getId());
381         Assert.assertEquals("form1",viewRoot.getChildren().get(2).getId());
382         
383         component = viewRoot.getChildren().remove( 0 );
384         viewRoot.getChildren().add( component );
385 
386         viewRoot = saveAndRestore(stateManagement, viewRoot);
387 
388         Assert.assertEquals("output2",viewRoot.getChildren().get(0).getId());
389         Assert.assertEquals("form1",viewRoot.getChildren().get(1).getId());
390         Assert.assertEquals("output1",viewRoot.getChildren().get(2).getId());
391 
392         component = viewRoot.getChildren().remove( 0 );
393         viewRoot.getChildren().add( component );
394 
395         viewRoot = saveAndRestore(stateManagement, viewRoot);
396 
397         Assert.assertEquals("form1",viewRoot.getChildren().get(0).getId());
398         Assert.assertEquals("output1",viewRoot.getChildren().get(1).getId());
399         Assert.assertEquals("output2",viewRoot.getChildren().get(2).getId());
400         
401         component = viewRoot.getChildren().remove( 0 );
402         viewRoot.getChildren().add( component );
403 
404         viewRoot = saveAndRestore(stateManagement, viewRoot);
405 
406         Assert.assertEquals("output1",viewRoot.getChildren().get(0).getId());
407         Assert.assertEquals("output2",viewRoot.getChildren().get(1).getId());
408         Assert.assertEquals("form1",viewRoot.getChildren().get(2).getId());
409 
410         Assert.assertEquals("somevalue", viewRoot.getAttributes().get("somekey"));
411         Assert.assertNotNull(viewRoot.findComponent("form1"));
412         Assert.assertNotNull(viewRoot.findComponent("form1:foo1"));
413         Assert.assertNotNull(viewRoot.findComponent("form1:var1"));
414         Assert.assertNotNull(viewRoot.findComponent("form1:button1"));
415         
416         a = (HtmlOutputText) viewRoot.findComponent("output1");
417         Assert.assertNotNull(a);
418         Assert.assertEquals("testOutput1",a.getValue());
419     }
420     
421     public UIViewRoot saveAndRestore(StateManagementStrategy stateManagement, UIViewRoot viewRoot)
422     {
423         facesContext.getAttributes()
424             .remove(StateManagerImpl.class.getName() + ".SERIALIZED_VIEW");        
425         Object state1 = stateManagement.saveView(facesContext);
426         stateToRestore = state1;
427         facesContext.setViewRoot(null);
428         stateManagement.restoreView(facesContext, "/root", viewRoot.getRenderKitId());
429         return facesContext.getViewRoot();
430     }
431     
432     public static class MockViewDeclarationLanguage extends ViewDeclarationLanguage
433     {
434 
435         @Override
436         public void buildView(FacesContext context, UIViewRoot viewRoot)
437                 throws IOException
438         {            
439             HtmlOutputText output = new HtmlOutputText();
440             output.setValue("foo");
441             output.setId("foo1");
442 
443             HtmlInputText input = new HtmlInputText();
444             input.setValue("var");
445             input.setId("var1");
446             
447             HtmlCommandButton button = new HtmlCommandButton();
448             button.setId("button1");
449             
450             UIForm form = new HtmlForm();
451             form.setId("form1");
452             
453             form.getChildren().add(output);
454             form.getChildren().add(input);
455             form.getChildren().add(button);
456             viewRoot.getChildren().add(form);
457             
458             markInitialState(viewRoot);
459         }
460         
461         public void markInitialState(UIComponent component)
462         {
463             component.markInitialState();
464             
465             Iterator<UIComponent> it = component.getFacetsAndChildren();
466             
467             while(it.hasNext())
468             {
469                 markInitialState(it.next());
470             }
471         }
472 
473         @Override
474         public UIViewRoot createView(FacesContext context, String viewId)
475         {
476             UIViewRoot viewRoot = new UIViewRoot();
477             viewRoot.setViewId(viewId);
478             viewRoot.setRenderKitId("HTML_BASIC2");
479             context.setViewRoot(viewRoot);
480             return viewRoot;
481         }
482 
483         @Override
484         public BeanInfo getComponentMetadata(FacesContext context,
485                 Resource componentResource)
486         {
487             return null;
488         }
489 
490         @Override
491         public Resource getScriptComponentResource(FacesContext context,
492                 Resource componentResource)
493         {
494             return null;
495         }
496 
497         @Override
498         public StateManagementStrategy getStateManagementStrategy(
499                 FacesContext context, String viewId)
500         {
501             return null;
502         }
503 
504         @Override
505         public ViewMetadata getViewMetadata(FacesContext context, String viewId)
506         {
507             return new ViewMetadataBase(viewId)
508             {
509 
510                 @Override
511                 public UIViewRoot createMetadataView(FacesContext context)
512                 {
513                     try
514                     {
515                         context.setProcessingEvents(false);
516                         String viewId = getViewId();
517                         UIViewRoot view = createView(context, viewId);
518                         return view;
519                     }
520                     finally
521                     {
522                         context.setProcessingEvents(true);
523                     }
524                 }                
525             };
526         }
527 
528         @Override
529         public void renderView(FacesContext context, UIViewRoot view)
530                 throws IOException
531         {
532 
533         }
534 
535         @Override
536         public UIViewRoot restoreView(FacesContext context, String viewId)
537         {
538             return null;
539         }
540         
541     }    
542 }