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]

Reply via email to