1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
92
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 }