Author: niallp
Date: Mon Nov 6 03:30:59 2006
New Revision: 471699
URL: http://svn.apache.org/viewvc?view=rev&rev=471699
Log:
BEANUTILS-41 - Improve error messages - reported by Ralf Hauser
Modified:
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/AbstractConverter.java
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/ArrayConverter.java
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/DateTimeConverter.java
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/NumberConverter.java
Modified:
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/AbstractConverter.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/AbstractConverter.java?view=diff&rev=471699&r1=471698&r2=471699
==============================================================================
---
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/AbstractConverter.java
(original)
+++
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/AbstractConverter.java
Mon Nov 6 03:30:59 2006
@@ -46,6 +46,13 @@
*/
public abstract class AbstractConverter implements Converter {
+ /** Debug logging message to indicate default value configuration */
+ private static final String DEFAULT_CONFIG_MSG =
+ "(N.B. Converters can be configured to use default values to avoid
throwing exceptions)";
+
+ /** Current package name */
+ private static final String PACKAGE =
AbstractConverter.class.getPackage().getName() + ".";
+
/**
* Logging for this instance.
*/
@@ -250,13 +257,15 @@
cex = (ConversionException)ex;
if (log.isDebugEnabled()) {
log.debug(" Re-throwing ConversionException: " +
cex.getMessage());
+ log.debug(" " + DEFAULT_CONFIG_MSG);
}
} else {
- String msg = "Error converting type[" + toString(value.getClass())
+
- "], value '" + value + "' to [" + toString(type) + "]";
+ String msg = "Error converting from '" +
toString(value.getClass()) +
+ "' to '" + toString(type) + "' " + ex.getMessage();
cex = new ConversionException(msg, ex);
if (log.isDebugEnabled()) {
log.debug(" Throwing ConversionException: " + msg);
+ log.debug(" " + DEFAULT_CONFIG_MSG);
}
}
@@ -294,9 +303,11 @@
return value;
}
- ConversionException cex = new ConversionException("No value
specified.");
+ ConversionException cex = new ConversionException("No value specified
for '" +
+ toString(type) + "'");
if (log.isDebugEnabled()) {
log.debug(" Throwing ConversionException: " + cex.getMessage());
+ log.debug(" " + DEFAULT_CONFIG_MSG);
}
throw cex;
@@ -399,6 +410,8 @@
}
if (typeName.startsWith("java.lang.")) {
typeName = typeName.substring("java.lang.".length());
+ } else if (typeName.startsWith(PACKAGE)) {
+ typeName = typeName.substring(PACKAGE.length());
}
return typeName;
}
Modified:
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/ArrayConverter.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/ArrayConverter.java?view=diff&rev=471699&r1=471698&r2=471699
==============================================================================
---
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/ArrayConverter.java
(original)
+++
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/ArrayConverter.java
Mon Nov 6 03:30:59 2006
@@ -180,7 +180,9 @@
Class type = value.getClass();
if (!type.isArray()) {
- throw new ConversionException("Not an array: " + toString(type));
+ throw new ConversionException(toString(getClass())
+ + " cannot handle conversion from '"
+ + toString(type) + "' to String (not an array).");
}
int size = Array.getLength(value);
@@ -217,7 +219,9 @@
protected Object convertToType(Class type, Object value) throws Exception {
if (!type.isArray()) {
- throw new ConversionException("Not an array: " + toString(type));
+ throw new ConversionException(toString(getClass())
+ + " cannot handle conversion to '"
+ + toString(type) + "' (not an array).");
}
// Handle the source
@@ -230,7 +234,7 @@
if (value instanceof Collection) {
collection = (Collection)value;
} else {
- collection = parseElements(value.toString().trim());
+ collection = parseElements(type, value.toString().trim());
}
size = collection.size();
iterator = collection.iterator();
@@ -243,6 +247,8 @@
// Convert and set each element in the new Array
for (int i = 0; i < size; i++) {
Object element = iterator == null ? Array.get(value, i) :
iterator.next();
+ // TODO - probably should catch conversion errors and throw
+ // new exception providing better info back to the user
element = elementConverter.convert(componentType, element);
Array.set(newArray, i, element);
}
@@ -287,6 +293,7 @@
* Within a quoted elements, the normal Java escape sequences are
valid.</li>
* </ul>
*
+ * @param type The type to convert the value to
* @param value String value to be parsed
* @return List of parsed elements.
*
@@ -295,7 +302,7 @@
* @throws NullPointerException if <code>svalue</code>
* is <code>null</code>
*/
- private List parseElements(String value) {
+ private List parseElements(Class type, String value) {
if (log().isDebugEnabled()) {
log().debug("Parsing elements, delimiter=[" + delimiter + "],
value=[" + value + "]");
@@ -331,8 +338,8 @@
} else if (ttype == StreamTokenizer.TT_EOF) {
break;
} else {
- throw new ConversionException
- ("Encountered token of type " + ttype);
+ throw new ConversionException("Encountered token of type "
+ + ttype + " parsing elements to '" + toString(type) +
".");
}
}
@@ -348,7 +355,8 @@
} catch (IOException e) {
- throw new ConversionException("Error parsing elements: " +
e.getMessage(), e);
+ throw new ConversionException("Error converting from String to '"
+ + toString(type) + "': " + e.getMessage(), e);
}
Modified:
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/DateTimeConverter.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/DateTimeConverter.java?view=diff&rev=471699&r1=471698&r2=471699
==============================================================================
---
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/DateTimeConverter.java
(original)
+++
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/DateTimeConverter.java
Mon Nov 6 03:30:59 2006
@@ -292,10 +292,10 @@
if (useLocaleFormat) {
Calendar calendar = null;
if (patterns != null && patterns.length > 0) {
- calendar = parse(stringValue);
+ calendar = parse(type, stringValue);
} else {
DateFormat format = getFormat(locale, timeZone);
- calendar = parse(stringValue, format);
+ calendar = parse(type, stringValue, format);
}
if (Calendar.class.isAssignableFrom(type)) {
return calendar;
@@ -366,8 +366,12 @@
return calendar;
}
- throw new ConversionException("Cannot handle conversion to Date type "
- + toString(type));
+ String msg = toString(getClass()) + " cannot handle conversion to '"
+ + toString(type) + "'";
+ if (log().isWarnEnabled()) {
+ log().warn(" " + msg);
+ }
+ throw new ConversionException(msg);
}
/**
@@ -419,10 +423,11 @@
}
}
- String msg = "String to '" + toString(type) + "' conversion
unsupported.";
+ String msg = toString(getClass()) + " does not support default String
to '"
+ + toString(type) + "' conversion.";
if (log().isWarnEnabled()) {
- log().warn(" " + msg
- + " Change converter configuration or use a different
implementation.");
+ log().warn(" " + msg);
+ log().warn(" (N.B. Re-configure Converter or use alternative
implementation)");
}
throw new ConversionException(msg);
}
@@ -463,18 +468,19 @@
/**
* Parse a String date value using the set of patterns.
+ *
+ * @param type The type to convert the value to
* @param value The String date value.
* @param type The type to convert the value to.
- *
* @return The converted Date object.
* @throws Exception if an error occurs parsing the date.
*/
- private Calendar parse(String value) throws Exception {
+ private Calendar parse(Class type, String value) throws Exception {
Exception firstEx = null;
for (int i = 0; i < patterns.length; i++) {
try {
DateFormat format = getFormat(patterns[i]);
- Calendar calendar = parse(value, format);
+ Calendar calendar = parse(type, value, format);
return calendar;
} catch (Exception ex) {
if (firstEx == null) {
@@ -483,7 +489,7 @@
}
}
if (patterns.length > 1) {
- throw new ConversionException("Can't parse date '" + value
+ throw new ConversionException("Error converting to '" +
toString(type)
+ "' using patterns '" + displayPatterns + "'");
} else {
throw firstEx;
@@ -494,18 +500,19 @@
* Parse a String into a <code>Calendar</code> object
* using the specified <code>DateFormat</code>.
*
+ * @param type The type to convert the value to
* @param value The String date value.
* @param format The DateFormat to parse the String value.
* @return The converted Calendar object.
* @throws ConversionException if the String cannot be converted.
*/
- private Calendar parse(String value, DateFormat format) {
+ private Calendar parse(Class type, String value, DateFormat format) {
logFormat("Parsing", format);
format.setLenient(false);
ParsePosition pos = new ParsePosition(0);
Date parsedDate = format.parse(value, pos); // ignore the result (use
the Calendar)
if (pos.getErrorIndex() >= 0 || pos.getIndex() != value.length() ||
parsedDate == null) {
- String msg = "Error parsing date '" + value + "'";
+ String msg = "Error converting to '" + toString(type) + "'";
if (format instanceof SimpleDateFormat) {
msg += " using pattern '" +
((SimpleDateFormat)format).toPattern() + "'";
}
Modified:
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/NumberConverter.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/NumberConverter.java?view=diff&rev=471699&r1=471698&r2=471699
==============================================================================
---
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/NumberConverter.java
(original)
+++
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/NumberConverter.java
Mon Nov 6 03:30:59 2006
@@ -218,7 +218,7 @@
Number number = null;
if (useLocaleFormat) {
NumberFormat format = getFormat();
- number = parse(format, stringValue);
+ number = parse(type, stringValue, format);
} else {
if (log().isDebugEnabled()) {
log().debug(" No NumberFormat, using default conversion");
@@ -333,8 +333,12 @@
return BigInteger.valueOf(value.longValue());
}
- throw new ConversionException("Cannot handle conversion to Number type
"
- + toString(type));
+ String msg = toString(getClass()) + " cannot handle conversion to '"
+ + toString(type) + "'";
+ if (log().isWarnEnabled()) {
+ log().warn(" " + msg);
+ }
+ throw new ConversionException(msg);
}
@@ -399,8 +403,12 @@
return new BigInteger(value);
}
- throw new ConversionException("Cannot handle conversion from String to
type "
- + toString(type));
+ String msg = toString(getClass())
+ + " cannot handle conversion from String to '" + toString(type) +
"'";
+ if (log().isWarnEnabled()) {
+ log().warn(" " + msg);
+ }
+ throw new ConversionException(msg);
}
/**
@@ -446,20 +454,23 @@
/**
* Convert a String into a <code>Number</code> object.
*
+ * @param type The type to convert the value to
* @param value The String date value.
* @param format The NumberFormat to parse the String value.
* @return The converted Number object.
* @throws ConversionException if the String cannot be converted.
*/
- private Number parse(NumberFormat format, String value) {
+ private Number parse(Class type, String value, NumberFormat format) {
ParsePosition pos = new ParsePosition(0);
Number parsedNumber = (Number)format.parse(value, pos);
if (pos.getErrorIndex() >= 0 || pos.getIndex() != value.length() ||
parsedNumber == null) {
- String msg = "Error parsing number '" + value + "'";
+ String msg = "Error converting to '" + toString(type) + "'";
if (format instanceof DecimalFormat) {
msg += " using pattern '" +
((DecimalFormat)format).toPattern() + "'";
}
- msg += (locale == null ? " for the default locale" : " for
locale=[" + locale + "]");
+ if (locale != null) {
+ msg += " for locale=[" + locale + "]";
+ }
if (log().isDebugEnabled()) {
log().debug(" " + msg);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]