001 // Copyright 2005 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry.valid;
016
017 import org.apache.tapestry.form.IFormComponent;
018
019 /**
020 * Base class for a number of implementations of {@link org.apache.tapestry.valid.IValidator},
021 * meant to replace the awkward {@link org.apache.tapestry.valid.NumberValidator}.
022 *
023 * @author Howard M. Lewis Ship
024 */
025 public abstract class AbstractNumericValidator extends BaseValidator
026 {
027 private boolean _zeroIsNull;
028
029 private String _scriptPath = getDefaultScriptPath();
030
031 private String _invalidNumericFormatMessage;
032
033 private String _invalidIntegerFormatMessage;
034
035 private String _numberTooSmallMessage;
036
037 private String _numberTooLargeMessage;
038
039 private String _numberRangeMessage;
040
041 public AbstractNumericValidator()
042 {
043 super();
044 }
045
046 public AbstractNumericValidator(String initializer)
047 {
048 super(initializer);
049 }
050
051 public AbstractNumericValidator(boolean required)
052 {
053 super(required);
054 }
055
056 /**
057 * If true, then when rendering, a zero is treated as a non-value, and null is returned. If
058 * false, the default, then zero is rendered as zero.
059 */
060
061 public boolean getZeroIsNull()
062 {
063 return _zeroIsNull;
064 }
065
066 public void setZeroIsNull(boolean zeroIsNull)
067 {
068 _zeroIsNull = zeroIsNull;
069 }
070
071 /**
072 * @since 2.2
073 */
074 public String getScriptPath()
075 {
076 return _scriptPath;
077 }
078
079 /**
080 * Allows a developer to use the existing validation logic with a different client-side script.
081 * This is often sufficient to allow application-specific error presentation (perhaps by using
082 * DHTML to update the content of a <span> tag, or to use a more sophisticated pop-up
083 * window than <code>window.alert()</code>).
084 *
085 * @since 2.2
086 */
087 public void setScriptPath(String scriptPath)
088 {
089 _scriptPath = scriptPath;
090 }
091
092 /** @since 3.0 */
093 public String getInvalidNumericFormatMessage()
094 {
095 return _invalidNumericFormatMessage;
096 }
097
098 /** @since 3.0 */
099 public String getInvalidIntegerFormatMessage()
100 {
101 return _invalidIntegerFormatMessage;
102 }
103
104 /** @since 3.0 */
105 public String getNumberRangeMessage()
106 {
107 return _numberRangeMessage;
108 }
109
110 /** @since 3.0 */
111 public String getNumberTooLargeMessage()
112 {
113 return _numberTooLargeMessage;
114 }
115
116 /** @since 3.0 */
117 public String getNumberTooSmallMessage()
118 {
119 return _numberTooSmallMessage;
120 }
121
122 /**
123 * Overrides the <code>invalid-numeric-format</code> bundle key. Parameter {0} is the display
124 * name of the field.
125 *
126 * @since 3.0
127 */
128 public void setInvalidNumericFormatMessage(String string)
129 {
130 _invalidNumericFormatMessage = string;
131 }
132
133 /**
134 * Overrides the <code>invalid-int-format</code> bundle key. Parameter {0} is the display name
135 * of the field.
136 *
137 * @since 3.0
138 */
139 public void setInvalidIntegerFormatMessage(String string)
140 {
141 _invalidIntegerFormatMessage = string;
142 }
143
144 /**
145 * Overrides the <code>number-range</code> bundle key. Parameter [0} is the display name of
146 * the field. Parameter {1} is the minimum value. Parameter {2} is the maximum value.
147 *
148 * @since 3.0
149 */
150 public void setNumberRangeMessage(String string)
151 {
152 _numberRangeMessage = string;
153 }
154
155 /**
156 * Overrides the <code>number-too-large</code> bundle key. Parameter {0} is the display name
157 * of the field. Parameter {1} is the maximum allowed value.
158 *
159 * @since 3.0
160 */
161 public void setNumberTooLargeMessage(String string)
162 {
163 _numberTooLargeMessage = string;
164 }
165
166 /**
167 * Overrides the <code>number-too-small</code> bundle key. Parameter {0} is the display name
168 * of the field. Parameter {1} is the minimum allowed value.
169 *
170 * @since 3.0
171 */
172 public void setNumberTooSmallMessage(String string)
173 {
174 _numberTooSmallMessage = string;
175 }
176
177 /** @since 3.0 */
178 protected String buildInvalidNumericFormatMessage(IFormComponent field)
179 {
180 String pattern = getPattern(
181 getInvalidNumericFormatMessage(),
182 "invalid-numeric-format",
183 field.getPage().getLocale());
184
185 return formatString(pattern, field.getDisplayName());
186 }
187
188 protected String buildNumberTooSmallMessage(IFormComponent field, Number minimum)
189 {
190 String pattern = getPattern(getNumberTooSmallMessage(), "number-too-small", field.getPage()
191 .getLocale());
192
193 return formatString(pattern, field.getDisplayName(), minimum);
194 }
195
196 /** @since 3.0 */
197 protected String buildInvalidIntegerFormatMessage(IFormComponent field)
198 {
199 String pattern = getPattern(getInvalidIntegerFormatMessage(), "invalid-int-format", field
200 .getPage().getLocale());
201
202 return formatString(pattern, field.getDisplayName());
203 }
204
205 /**
206 * @since 3.0
207 */
208 protected String buildNumberTooLargeMessage(IFormComponent field, Number maximum)
209 {
210 String pattern = getPattern(getNumberTooLargeMessage(), "number-too-large", field.getPage()
211 .getLocale());
212
213 return formatString(pattern, field.getDisplayName(), maximum);
214 }
215
216 protected String buildNumberRangeMessage(IFormComponent field, Number mininum, Number maximum)
217 {
218 String pattern = getPattern(getNumberRangeMessage(), "number-range", field.getPage()
219 .getLocale());
220
221 return formatString(pattern, new Object[]
222 { field.getDisplayName(), mininum, maximum });
223 }
224
225 protected String buildRangeMessage(IFormComponent field, Number minimum, Number maximum)
226 {
227 if (minimum != null && maximum != null)
228 return buildNumberRangeMessage(field, minimum, maximum);
229
230 if (maximum != null)
231 return buildNumberTooLargeMessage(field, maximum);
232
233 return buildNumberTooSmallMessage(field, minimum);
234 }
235
236 protected abstract String getDefaultScriptPath();
237 }