1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package javax.faces.validator;
20
21 import javax.faces.component.PartialStateHolder;
22 import javax.faces.component.UIComponent;
23 import javax.faces.context.FacesContext;
24
25 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFJspProperty;
26 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFProperty;
27 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFValidator;
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 @JSFValidator(
45 name="f:validateDoubleRange",
46 bodyContent="empty",
47 tagClass="org.apache.myfaces.taglib.core.ValidateDoubleRangeTag")
48 @JSFJspProperty(
49 name="binding",
50 returnType = "javax.faces.validator.DoubleRangeValidator",
51 longDesc = "A ValueExpression that evaluates to a DoubleRangeValidator.")
52 public class DoubleRangeValidator
53 implements Validator, PartialStateHolder
54 {
55
56 public static final String VALIDATOR_ID = "javax.faces.DoubleRange";
57 public static final String MAXIMUM_MESSAGE_ID = "javax.faces.validator.DoubleRangeValidator.MAXIMUM";
58 public static final String MINIMUM_MESSAGE_ID = "javax.faces.validator.DoubleRangeValidator.MINIMUM";
59 public static final String TYPE_MESSAGE_ID = "javax.faces.validator.DoubleRangeValidator.TYPE";
60 public static final String NOT_IN_RANGE_MESSAGE_ID = "javax.faces.validator.DoubleRangeValidator.NOT_IN_RANGE";
61
62 private Double _minimum = null;
63 private Double _maximum = null;
64 private boolean _transient = false;
65
66
67 public DoubleRangeValidator()
68 {
69 }
70
71 public DoubleRangeValidator(double maximum)
72 {
73 _maximum = new Double(maximum);
74 }
75
76 public DoubleRangeValidator(double maximum,
77 double minimum)
78 {
79 _maximum = new Double(maximum);
80 _minimum = new Double(minimum);
81 }
82
83
84 public void validate(FacesContext facesContext,
85 UIComponent uiComponent,
86 Object value)
87 throws ValidatorException
88 {
89 if (facesContext == null)
90 {
91 throw new NullPointerException("facesContext");
92 }
93 if (uiComponent == null)
94 {
95 throw new NullPointerException("uiComponent");
96 }
97
98 if (value == null)
99 {
100 return;
101 }
102
103 double dvalue = parseDoubleValue(facesContext, uiComponent,value);
104 if (_minimum != null && _maximum != null)
105 {
106 if (dvalue < _minimum.doubleValue() ||
107 dvalue > _maximum.doubleValue())
108 {
109 Object[] args = {_minimum, _maximum,_MessageUtils.getLabel(facesContext, uiComponent)};
110 throw new ValidatorException(_MessageUtils.getErrorMessage(facesContext, NOT_IN_RANGE_MESSAGE_ID,
111 args));
112 }
113 }
114 else if (_minimum != null)
115 {
116 if (dvalue < _minimum.doubleValue())
117 {
118 Object[] args = {_minimum,_MessageUtils.getLabel(facesContext, uiComponent)};
119 throw new ValidatorException(_MessageUtils.getErrorMessage(facesContext, MINIMUM_MESSAGE_ID, args));
120 }
121 }
122 else if (_maximum != null)
123 {
124 if (dvalue > _maximum.doubleValue())
125 {
126 Object[] args = {_maximum,_MessageUtils.getLabel(facesContext, uiComponent)};
127 throw new ValidatorException(_MessageUtils.getErrorMessage(facesContext, MAXIMUM_MESSAGE_ID, args));
128 }
129 }
130 }
131
132 private double parseDoubleValue(FacesContext facesContext, UIComponent uiComponent, Object value)
133 throws ValidatorException
134 {
135 if (value instanceof Number)
136 {
137 return ((Number)value).doubleValue();
138 }
139
140 try
141 {
142 return Double.parseDouble(value.toString());
143 }
144 catch (NumberFormatException e)
145 {
146 Object[] args = {_MessageUtils.getLabel(facesContext, uiComponent)};
147 throw new ValidatorException(_MessageUtils.getErrorMessage(facesContext, TYPE_MESSAGE_ID, args));
148 }
149 }
150
151
152
153
154
155
156
157
158 @JSFProperty(deferredValueType="java.lang.Double")
159 public double getMaximum()
160 {
161 return _maximum != null ? _maximum.doubleValue() : Double.MAX_VALUE;
162 }
163
164 public void setMaximum(double maximum)
165 {
166 _maximum = new Double(maximum);
167 clearInitialState();
168 }
169
170
171
172
173
174 @JSFProperty(deferredValueType="java.lang.Double")
175 public double getMinimum()
176 {
177 return _minimum != null ? _minimum.doubleValue() : Double.MIN_VALUE;
178 }
179
180 public void setMinimum(double minimum)
181 {
182 _minimum = new Double(minimum);
183 clearInitialState();
184 }
185
186
187
188 public Object saveState(FacesContext context)
189 {
190 if (!initialStateMarked())
191 {
192 Object values[] = new Object[2];
193 values[0] = _maximum;
194 values[1] = _minimum;
195 return values;
196 }
197 return null;
198 }
199
200 public void restoreState(FacesContext context,
201 Object state)
202 {
203 if (state != null)
204 {
205 Object values[] = (Object[])state;
206 _maximum = (Double)values[0];
207 _minimum = (Double)values[1];
208 }
209 }
210
211 public boolean isTransient()
212 {
213 return _transient;
214 }
215
216 public void setTransient(boolean transientValue)
217 {
218 _transient = transientValue;
219 }
220
221
222 @Override
223 public boolean equals(Object o)
224 {
225 if (this == o)
226 {
227 return true;
228 }
229 if (!(o instanceof DoubleRangeValidator))
230 {
231 return false;
232 }
233
234 DoubleRangeValidator doubleRangeValidator = (DoubleRangeValidator)o;
235
236 if (_maximum != null ? !_maximum.equals(doubleRangeValidator._maximum) : doubleRangeValidator._maximum != null)
237 {
238 return false;
239 }
240 if (_minimum != null ? !_minimum.equals(doubleRangeValidator._minimum) : doubleRangeValidator._minimum != null)
241 {
242 return false;
243 }
244
245 return true;
246 }
247
248
249
250 private boolean _initialStateMarked = false;
251
252 public void clearInitialState()
253 {
254 _initialStateMarked = false;
255 }
256
257 public boolean initialStateMarked()
258 {
259 return _initialStateMarked;
260 }
261
262 public void markInitialState()
263 {
264 _initialStateMarked = true;
265 }
266
267 @JSFProperty(faceletsOnly=true)
268 private Boolean isDisabled()
269 {
270 return null;
271 }
272
273 @JSFProperty(faceletsOnly=true)
274 private String getFor()
275 {
276 return null;
277 }
278
279 @Override
280 public int hashCode()
281 {
282 int result = _minimum != null ? _minimum.hashCode() : 0;
283 result = 31 * result + (_maximum != null ? _maximum.hashCode() : 0);
284 return result;
285 }
286 }