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
31
32
33
34 public class RestoreStateUtils
35 {
36
37 private static Logger log = Logger.getLogger(RestoreStateUtils.class.getName());
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 public static void recursivelyHandleComponentReferencesAndSetValid(FacesContext facesContext,
53 UIComponent parent)
54 {
55 recursivelyHandleComponentReferencesAndSetValid(facesContext, parent, false);
56 }
57
58 public static void recursivelyHandleComponentReferencesAndSetValid(FacesContext facesContext,
59 UIComponent parent, boolean forceHandle)
60 {
61 Method handleBindingsMethod = getBindingMethod(parent);
62
63 if(handleBindingsMethod!=null && !forceHandle)
64 {
65 try
66 {
67 handleBindingsMethod.invoke(parent,new Object[]{});
68 }
69 catch (Throwable th)
70 {
71 log.log(Level.SEVERE, "Exception while invoking handleBindings on component with client-id:"
72 +parent.getClientId(facesContext),th);
73 }
74 }
75 else
76 {
77 for (Iterator it = parent.getFacetsAndChildren(); it.hasNext(); )
78 {
79 UIComponent component = (UIComponent)it.next();
80
81 ValueExpression binding = component.getValueExpression("binding");
82 if (binding != null)
83 {
84 binding.setValue(facesContext.getELContext(), component);
85 }
86
87
88
89
90
91
92
93 recursivelyHandleComponentReferencesAndSetValid(facesContext, component);
94 }
95 }
96 }
97
98
99
100
101
102
103 private static Method getBindingMethod(UIComponent parent)
104 {
105 Class[] clazzes = parent.getClass().getInterfaces();
106
107 for (int i = 0; i < clazzes.length; i++)
108 {
109 Class clazz = clazzes[i];
110
111 if(clazz.getName().indexOf("BindingAware")!=-1)
112 {
113 try
114 {
115 return parent.getClass().getMethod("handleBindings",new Class[]{});
116 }
117 catch (NoSuchMethodException e)
118 {
119
120 }
121 }
122 }
123
124 return null;
125 }
126 }