001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.commons.beanutils.locale.converters;
019
020 import org.apache.commons.beanutils.locale.BaseLocaleConverter;
021 import org.apache.commons.logging.Log;
022 import org.apache.commons.logging.LogFactory;
023
024 import java.math.BigDecimal;
025 import java.math.BigInteger;
026 import java.text.DecimalFormat;
027 import java.text.NumberFormat;
028 import java.text.ParseException;
029 import java.text.SimpleDateFormat;
030 import java.util.Date;
031 import java.util.Locale;
032
033
034 /**
035 * <p>Standard {@link org.apache.commons.beanutils.locale.LocaleConverter}
036 * implementation that converts an incoming
037 * locale-sensitive object into a <code>java.lang.String</code> object,
038 * optionally using a default value or throwing a
039 * {@link org.apache.commons.beanutils.ConversionException}
040 * if a conversion error occurs.</p>
041 *
042 * @author Yauheny Mikulski
043 */
044
045 public class StringLocaleConverter extends BaseLocaleConverter {
046
047 // ----------------------------------------------------- Instance Variables
048
049 /** All logging goes through this logger */
050 private Log log = LogFactory.getLog(StringLocaleConverter.class); //msz fix
051
052
053 // ----------------------------------------------------------- Constructors
054
055 /**
056 * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
057 * that will throw a {@link org.apache.commons.beanutils.ConversionException}
058 * if a conversion error occurs. The locale is the default locale for
059 * this instance of the Java Virtual Machine and an unlocalized pattern is used
060 * for the convertion.
061 *
062 */
063 public StringLocaleConverter() {
064
065 this(false);
066 }
067
068 /**
069 * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
070 * that will throw a {@link org.apache.commons.beanutils.ConversionException}
071 * if a conversion error occurs. The locale is the default locale for
072 * this instance of the Java Virtual Machine.
073 *
074 * @param locPattern Indicate whether the pattern is localized or not
075 */
076 public StringLocaleConverter(boolean locPattern) {
077
078 this(Locale.getDefault(), locPattern);
079 }
080
081 /**
082 * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
083 * that will throw a {@link org.apache.commons.beanutils.ConversionException}
084 * if a conversion error occurs. An unlocalized pattern is used for the convertion.
085 *
086 * @param locale The locale
087 */
088 public StringLocaleConverter(Locale locale) {
089
090 this(locale, false);
091 }
092
093 /**
094 * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
095 * that will throw a {@link org.apache.commons.beanutils.ConversionException}
096 * if a conversion error occurs.
097 *
098 * @param locale The locale
099 * @param locPattern Indicate whether the pattern is localized or not
100 */
101 public StringLocaleConverter(Locale locale, boolean locPattern) {
102
103 this(locale, (String) null, locPattern);
104 }
105
106 /**
107 * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
108 * that will throw a {@link org.apache.commons.beanutils.ConversionException}
109 * if a conversion error occurs. An unlocalized pattern is used for the convertion.
110 *
111 * @param locale The locale
112 * @param pattern The convertion pattern
113 */
114 public StringLocaleConverter(Locale locale, String pattern) {
115
116 this(locale, pattern, false);
117 }
118
119 /**
120 * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
121 * that will throw a {@link org.apache.commons.beanutils.ConversionException}
122 * if a conversion error occurs.
123 *
124 * @param locale The locale
125 * @param pattern The convertion pattern
126 * @param locPattern Indicate whether the pattern is localized or not
127 */
128 public StringLocaleConverter(Locale locale, String pattern, boolean locPattern) {
129
130 super(locale, pattern, locPattern);
131 }
132
133 /**
134 * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
135 * that will return the specified default value
136 * if a conversion error occurs. The locale is the default locale for
137 * this instance of the Java Virtual Machine and an unlocalized pattern is used
138 * for the convertion.
139 *
140 * @param defaultValue The default value to be returned
141 */
142 public StringLocaleConverter(Object defaultValue) {
143
144 this(defaultValue, false);
145 }
146
147 /**
148 * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
149 * that will return the specified default value
150 * if a conversion error occurs. The locale is the default locale for
151 * this instance of the Java Virtual Machine.
152 *
153 * @param defaultValue The default value to be returned
154 * @param locPattern Indicate whether the pattern is localized or not
155 */
156 public StringLocaleConverter(Object defaultValue, boolean locPattern) {
157
158 this(defaultValue, Locale.getDefault(), locPattern);
159 }
160
161 /**
162 * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
163 * that will return the specified default value
164 * if a conversion error occurs. An unlocalized pattern is used for the convertion.
165 *
166 * @param defaultValue The default value to be returned
167 * @param locale The locale
168 */
169 public StringLocaleConverter(Object defaultValue, Locale locale) {
170
171 this(defaultValue, locale, false);
172 }
173
174 /**
175 * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
176 * that will return the specified default value
177 * if a conversion error occurs.
178 *
179 * @param defaultValue The default value to be returned
180 * @param locale The locale
181 * @param locPattern Indicate whether the pattern is localized or not
182 */
183 public StringLocaleConverter(Object defaultValue, Locale locale, boolean locPattern) {
184
185 this(defaultValue, locale, null, locPattern);
186 }
187
188 /**
189 * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
190 * that will return the specified default value
191 * if a conversion error occurs. An unlocalized pattern is used for the convertion.
192 *
193 * @param defaultValue The default value to be returned
194 * @param locale The locale
195 * @param pattern The convertion pattern
196 */
197 public StringLocaleConverter(Object defaultValue, Locale locale, String pattern) {
198
199 this(defaultValue, locale, pattern, false);
200 }
201
202 /**
203 * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
204 * that will return the specified default value
205 * if a conversion error occurs.
206 *
207 * @param defaultValue The default value to be returned
208 * @param locale The locale
209 * @param pattern The convertion pattern
210 * @param locPattern Indicate whether the pattern is localized or not
211 */
212 public StringLocaleConverter(Object defaultValue, Locale locale, String pattern, boolean locPattern) {
213
214 super(defaultValue, locale, pattern, locPattern);
215 }
216
217 // --------------------------------------------------------- Methods
218
219 /**
220 * Convert the specified locale-sensitive input object into an output object of the
221 * specified type.
222 *
223 * @param value The input object to be converted
224 * @param pattern The pattern is used for the convertion
225 * @return The converted value
226 *
227 * @exception org.apache.commons.beanutils.ConversionException if conversion
228 * cannot be performed successfully
229 * @throws ParseException if an error occurs
230 */
231 protected Object parse(Object value, String pattern) throws ParseException {
232
233 String result = null;
234
235 if ((value instanceof Integer) ||
236 (value instanceof Long) ||
237 (value instanceof BigInteger) ||
238 (value instanceof Byte) ||
239 (value instanceof Short)) {
240
241 result = getDecimalFormat(locale, pattern).format(((Number) value).longValue());
242 }
243 else if ((value instanceof Double) ||
244 (value instanceof BigDecimal) ||
245 (value instanceof Float)) {
246
247 result = getDecimalFormat(locale, pattern).format(((Number) value).doubleValue());
248 }
249 else if (value instanceof Date) { // java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp
250
251 SimpleDateFormat dateFormat =
252 new SimpleDateFormat(pattern, locale);
253
254 result = dateFormat.format(value);
255 }
256 else {
257 result = value.toString();
258 }
259
260 return result;
261 }
262
263 /**
264 * Make an instance of DecimalFormat.
265 *
266 * @param locale The locale
267 * @param pattern The pattern is used for the convertion
268 * @return The format for the locale and pattern
269 *
270 * @exception ConversionException if conversion cannot be performed
271 * successfully
272 * @throws ParseException if an error occurs parsing a String to a Number
273 */
274 private DecimalFormat getDecimalFormat(Locale locale, String pattern) {
275
276 DecimalFormat numberFormat = (DecimalFormat) NumberFormat.getInstance(locale);
277
278 // if some constructors default pattern to null, it makes only sense to handle null pattern gracefully
279 if (pattern != null) {
280 if (locPattern) {
281 numberFormat.applyLocalizedPattern(pattern);
282 } else {
283 numberFormat.applyPattern(pattern);
284 }
285 } else {
286 log.debug("No pattern provided, using default.");
287 }
288
289 return numberFormat;
290 }
291 }