1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.shared.util;
20
21 import java.lang.reflect.Method;
22 import java.util.Iterator;
23 import java.util.logging.Level;
24 import java.util.logging.Logger;
25
26 import javax.el.ValueExpression;
27 import javax.faces.component.UIComponent;
28 import javax.faces.context.FacesContext;
29
30 public class RestoreStateUtils
31 {
32
33 private static Logger log = Logger.getLogger(RestoreStateUtils.class.getName());
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 public static void recursivelyHandleComponentReferencesAndSetValid(FacesContext facesContext,
49 UIComponent parent)
50 {
51 recursivelyHandleComponentReferencesAndSetValid(facesContext, parent, false);
52 }
53
54 public static void recursivelyHandleComponentReferencesAndSetValid(FacesContext facesContext,
55 UIComponent parent, boolean forceHandle)
56 {
57 Method handleBindingsMethod = getBindingMethod(parent);
58
59 if(handleBindingsMethod!=null && !forceHandle)
60 {
61 try
62 {
63 handleBindingsMethod.invoke(parent,new Object[]{});
64 }
65 catch (Throwable th)
66 {
67 log.log(Level.SEVERE, "Exception while invoking handleBindings on component with client-id:"
68 +parent.getClientId(facesContext),th);
69 }
70 }
71 else
72 {
73 for (Iterator it = parent.getFacetsAndChildren(); it.hasNext(); )
74 {
75 UIComponent component = (UIComponent)it.next();
76
77 ValueExpression binding = component.getValueExpression("binding");
78 if (binding != null)
79 {
80 binding.setValue(facesContext.getELContext(), component);
81 }
82
83
84
85
86
87
88
89 recursivelyHandleComponentReferencesAndSetValid(facesContext, component);
90 }
91 }
92 }
93
94
95
96
97
98
99 private static Method getBindingMethod(UIComponent parent)
100 {
101 Class[] clazzes = parent.getClass().getInterfaces();
102
103 for (int i = 0; i < clazzes.length; i++)
104 {
105 Class clazz = clazzes[i];
106
107 if(clazz.getName().indexOf("BindingAware")!=-1)
108 {
109 try
110 {
111 return parent.getClass().getMethod("handleBindings",new Class[]{});
112 }
113 catch (NoSuchMethodException e)
114 {
115
116 }
117 }
118 }
119
120 return null;
121 }
122 }