1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.taglib.core;
20
21 import javax.el.ELException;
22 import javax.el.ValueExpression;
23 import javax.faces.FacesException;
24 import javax.faces.component.StateHolder;
25 import javax.faces.context.FacesContext;
26 import javax.faces.event.AbortProcessingException;
27 import javax.faces.event.ValueChangeEvent;
28 import javax.faces.event.ValueChangeListener;
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 public class DelegateValueChangeListener implements ValueChangeListener, StateHolder
48 {
49
50 private ValueExpression _type;
51 private ValueExpression _binding;
52
53 public DelegateValueChangeListener()
54 {
55 }
56
57 public DelegateValueChangeListener(ValueExpression type, ValueExpression binding)
58 {
59 super();
60 _type = type;
61 _binding = binding;
62 }
63
64 public boolean isTransient()
65 {
66 return false;
67 }
68
69 public void restoreState(FacesContext facesContext, Object state)
70 {
71 Object[] values = (Object[]) state;
72 _type = (ValueExpression) values[0];
73 _binding = (ValueExpression) values[1];
74 }
75
76 public Object saveState(FacesContext facesContext)
77 {
78 Object[] values = new Object[2];
79 values[0] = _type;
80 values[1] = _binding;
81 return values;
82 }
83
84 public void setTransient(boolean arg0)
85 {
86
87 }
88
89 private ValueChangeListener _getDelegate()
90 {
91 return _createValueChangeListener();
92 }
93
94 private ValueChangeListener _createValueChangeListener()
95 {
96 FacesContext facesContext = FacesContext.getCurrentInstance();
97 ValueChangeListener listener = null;
98
99 try
100 {
101 if (null != _binding)
102 {
103 try
104 {
105 listener = (ValueChangeListener)_binding.getValue(facesContext.getELContext());
106 if (null != listener)
107 {
108 return listener;
109 }
110 }
111 catch (ELException e)
112 {
113
114
115 }
116 }
117
118 if (null != _type)
119 {
120
121
122
123
124
125
126
127
128
129
130
131 listener = null;
132
133 if (null != _binding)
134 {
135 try
136 {
137 _binding.setValue(facesContext.getELContext(), listener);
138 }
139 catch (ELException e)
140 {
141
142
143 }
144 }
145
146 return listener;
147 }
148 }
149 catch (ClassCastException e)
150 {
151 throw new FacesException(e);
152 }
153
154 return listener;
155 }
156
157 public void processValueChange(ValueChangeEvent event) throws AbortProcessingException
158 {
159 _getDelegate().processValueChange(event);
160 }
161 }