1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.custom.valueChangeNotifier;
20
21 import javax.faces.component.EditableValueHolder;
22 import javax.faces.component.UIComponent;
23 import javax.faces.webapp.UIComponentTag;
24 import javax.servlet.jsp.JspException;
25 import javax.servlet.jsp.tagext.Tag;
26 import javax.servlet.jsp.tagext.TagSupport;
27
28 import org.apache.commons.logging.Log;
29 import org.apache.commons.logging.LogFactory;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 public class ValueChangeNotifierTag extends TagSupport
52 {
53 private String method = null;
54
55 private static Log log = LogFactory.getLog(ValueChangeNotifierTag.class);
56
57 public ValueChangeNotifierTag()
58 {
59 }
60
61
62
63
64
65
66
67
68
69 public void setMethod(String method)
70 {
71 this.method = method;
72 }
73
74 public int doStartTag() throws JspException
75 {
76 if (method == null)
77 {
78 throw new JspException("name attribute not set");
79 }
80
81
82 UIComponentTag componentTag = UIComponentTag
83 .getParentUIComponentTag(pageContext);
84 if (componentTag == null)
85 {
86 throw new JspException(
87 "ValueChangeListenerTag has no UIComponentTag ancestor");
88 }
89
90 if (componentTag.getCreated())
91 {
92
93 UIComponent component = componentTag.getComponentInstance();
94 if (component instanceof EditableValueHolder)
95 {
96 setupClassListener(component);
97 }
98 else
99 {
100 throw new JspException("Component " + component.getId()
101 + " is no EditableValueHolder");
102 }
103 }
104
105 return Tag.SKIP_BODY;
106 }
107
108 protected void setupClassListener(UIComponent component)
109 {
110 if (UIComponentTag.isValueReference(method))
111 {
112 ((EditableValueHolder) component)
113 .addValueChangeListener(new ValueChangeCollector(method));
114 }
115 else
116 {
117 if(log.isErrorEnabled()){
118 log.error("Invalid expression " + method);
119 }
120 }
121 }
122 }