You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2023/02/09 14:57:16 UTC

[commons-beanutils] 02/02: Add and use ConversionException.format(String, Object...).

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-beanutils.git

commit 0861a8d0f3ad9d9a209df1ccc34fcb841344196d
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Thu Feb 9 09:57:01 2023 -0500

    Add and use ConversionException.format(String, Object...).
---
 src/changes/changes.xml                            |  5 +++-
 .../apache/commons/beanutils2/BasicDynaBean.java   |  7 ++----
 .../commons/beanutils2/ConversionException.java    | 12 ++++++++++
 .../apache/commons/beanutils2/LazyDynaBean.java    |  7 ++----
 .../beanutils2/converters/AbstractConverter.java   |  6 ++---
 .../beanutils2/converters/ArrayConverter.java      |  7 ++----
 .../beanutils2/converters/DateTimeConverter.java   |  3 +--
 .../beanutils2/converters/NumberConverter.java     | 28 ++++++++--------------
 .../locale/converters/DateLocaleConverter.java     | 25 +++++++++----------
 .../locale/converters/FloatLocaleConverter.java    | 14 +++++------
 .../converters/DateLocaleConverterTestCase.java    |  4 ++--
 11 files changed, 55 insertions(+), 63 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 6d7df5b9..674e1c48 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -108,9 +108,12 @@
         Fix SpotBugs [ERROR] Medium: org.apache.commons.beanutils2.WrapDynaClass.getDynaProperties() may expose internal representation by returning WrapDynaClass.properties [org.apache.commons.beanutils2.WrapDynaClass] At WrapDynaClass.java:[line 172] EI_EXPOSE_REP.
       </action>
       <!-- ADD -->
-      <action dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">
+      <action dev="ggregory" type="add" due-to="Dependabot, Gary Gregory">
         Add github/codeql-action #118.
       </action>
+      <action dev="ggregory" type="add" due-to="Dependabot, Gary Gregory">
+        Add and use ConversionException.format(String, Object...).
+      </action>
       <!--  UPDATES -->
       <action dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">
         Bump actions/cache from 2 to 3.0.11 #77, #89, #103, #111. #137, #141.
diff --git a/src/main/java/org/apache/commons/beanutils2/BasicDynaBean.java b/src/main/java/org/apache/commons/beanutils2/BasicDynaBean.java
index 4217ab14..f2515b5c 100644
--- a/src/main/java/org/apache/commons/beanutils2/BasicDynaBean.java
+++ b/src/main/java/org/apache/commons/beanutils2/BasicDynaBean.java
@@ -298,11 +298,8 @@ public class BasicDynaBean implements DynaBean, Serializable {
                         ("Primitive value for '" + name + "'");
             }
         } else if (!isAssignable(descriptor.getType(), value.getClass())) {
-            throw new ConversionException
-                    ("Cannot assign value of type '" +
-                    value.getClass().getName() +
-                    "' to property '" + name + "' of type '" +
-                    descriptor.getType().getName() + "'");
+            throw ConversionException.format("Cannot assign value of type '%s' to property '%s' of type '%s'", value.getClass().getName(), name,
+                    descriptor.getType().getName());
         }
         values.put(name, value);
 
diff --git a/src/main/java/org/apache/commons/beanutils2/ConversionException.java b/src/main/java/org/apache/commons/beanutils2/ConversionException.java
index 8f43ed01..707ab98f 100644
--- a/src/main/java/org/apache/commons/beanutils2/ConversionException.java
+++ b/src/main/java/org/apache/commons/beanutils2/ConversionException.java
@@ -25,6 +25,18 @@ package org.apache.commons.beanutils2;
  */
 public class ConversionException extends RuntimeException {
 
+    /**
+     * Constructs a new instance with a message formatted using {@link String#format(String, Object...)}.
+     *
+     * @param format See {@link String#format(String, Object...)}.
+     * @param args   See {@link String#format(String, Object...)}.
+     * @return a new instance with a message formatted using {@link String#format(String, Object...)}.
+     * @since 2.0.0
+     */
+    public static ConversionException format(final String format, final Object... args) {
+        return new ConversionException(String.format(format, args));
+    }
+
     private static final long serialVersionUID = 1L;
 
     /**
diff --git a/src/main/java/org/apache/commons/beanutils2/LazyDynaBean.java b/src/main/java/org/apache/commons/beanutils2/LazyDynaBean.java
index 242eb308..9433d4c7 100644
--- a/src/main/java/org/apache/commons/beanutils2/LazyDynaBean.java
+++ b/src/main/java/org/apache/commons/beanutils2/LazyDynaBean.java
@@ -481,11 +481,8 @@ public class LazyDynaBean implements DynaBean, Serializable {
                         ("Primitive value for '" + name + "'");
             }
         } else if (!isAssignable(descriptor.getType(), value.getClass())) {
-            throw new ConversionException
-                    ("Cannot assign value of type '" +
-                    value.getClass().getName() +
-                    "' to property '" + name + "' of type '" +
-                    descriptor.getType().getName() + "'");
+            throw ConversionException.format
+                    ("Cannot assign value of type '%s' to property '%s' of type '%s'", value.getClass().getName(), name, descriptor.getType().getName());
         }
 
         // Set the property's value
diff --git a/src/main/java/org/apache/commons/beanutils2/converters/AbstractConverter.java b/src/main/java/org/apache/commons/beanutils2/converters/AbstractConverter.java
index 7a9acd8c..98a936c2 100644
--- a/src/main/java/org/apache/commons/beanutils2/converters/AbstractConverter.java
+++ b/src/main/java/org/apache/commons/beanutils2/converters/AbstractConverter.java
@@ -142,8 +142,7 @@ public abstract class AbstractConverter<D> implements Converter<D> {
      * @since 1.9
      */
     protected ConversionException conversionException(final Class<?> type, final Object value) {
-        return new ConversionException("Can't convert value '" + value
-                + "' to type " + type);
+        return ConversionException.format("Can't convert value '%s' to type %s", value, type);
     }
 
     /**
@@ -385,8 +384,7 @@ public abstract class AbstractConverter<D> implements Converter<D> {
             return type.cast(value);
         }
 
-        final ConversionException cex =  new ConversionException("No value specified for '" +
-                toString(type) + "'");
+        final ConversionException cex = ConversionException.format("No value specified for '%s'", toString(type));
         if (log().isDebugEnabled()) {
             log().debug("    Throwing ConversionException: " + cex.getMessage());
             log().debug("    " + DEFAULT_CONFIG_MSG);
diff --git a/src/main/java/org/apache/commons/beanutils2/converters/ArrayConverter.java b/src/main/java/org/apache/commons/beanutils2/converters/ArrayConverter.java
index dead1958..aaf73db9 100644
--- a/src/main/java/org/apache/commons/beanutils2/converters/ArrayConverter.java
+++ b/src/main/java/org/apache/commons/beanutils2/converters/ArrayConverter.java
@@ -281,9 +281,7 @@ public class ArrayConverter<C> extends AbstractConverter<C> {
     @Override
     protected <T> T convertToType(final Class<T> type, final Object value) throws Throwable {
         if (!type.isArray()) {
-            throw new ConversionException(toString(getClass())
-                    + " cannot handle conversion to '"
-                    + toString(type) + "' (not an array).");
+            throw ConversionException.format("%s cannot handle conversion to '%s' (not an array).", toString(getClass()), toString(type));
         }
 
         // Handle the source
@@ -463,8 +461,7 @@ public class ArrayConverter<C> extends AbstractConverter<C> {
                 } else if (ttype == StreamTokenizer.TT_EOF) {
                     break;
                 } else {
-                    throw new ConversionException("Encountered token of type "
-                        + ttype + " parsing elements to '" + typeName + ".");
+                    throw ConversionException.format("Encountered token of type %s parsing elements to '%s'.", ttype, typeName);
                 }
             }
 
diff --git a/src/main/java/org/apache/commons/beanutils2/converters/DateTimeConverter.java b/src/main/java/org/apache/commons/beanutils2/converters/DateTimeConverter.java
index af6ebc23..123dd508 100644
--- a/src/main/java/org/apache/commons/beanutils2/converters/DateTimeConverter.java
+++ b/src/main/java/org/apache/commons/beanutils2/converters/DateTimeConverter.java
@@ -591,8 +591,7 @@ public abstract class DateTimeConverter<D> extends AbstractConverter<D> {
             }
         }
         if (patterns.length > 1) {
-            throw new ConversionException("Error converting '" + toString(sourceType) + "' to '" + toString(targetType)
-                    + "' using  patterns '" + displayPatterns + "'");
+            throw ConversionException.format("Error converting '%s' to '%s' using  patterns '%s'", toString(sourceType), toString(targetType), displayPatterns);
         }
         throw firstEx;
     }
diff --git a/src/main/java/org/apache/commons/beanutils2/converters/NumberConverter.java b/src/main/java/org/apache/commons/beanutils2/converters/NumberConverter.java
index 8c14f3e3..f0df51d6 100644
--- a/src/main/java/org/apache/commons/beanutils2/converters/NumberConverter.java
+++ b/src/main/java/org/apache/commons/beanutils2/converters/NumberConverter.java
@@ -301,12 +301,10 @@ public abstract class NumberConverter<N extends Number> extends AbstractConverte
         if (targetType.equals(Byte.class)) {
             final long longValue = value.longValue();
             if (longValue > Byte.MAX_VALUE) {
-                throw new ConversionException(toString(sourceType) + " value '" + value
-                        + "' is too large for " + toString(targetType));
+                throw ConversionException.format("%s value '%s' is too large for %s", toString(sourceType), value, toString(targetType));
             }
             if (longValue < Byte.MIN_VALUE) {
-                throw new ConversionException(toString(sourceType) + " value '" + value
-                        + "' is too small " + toString(targetType));
+                throw ConversionException.format("%s value '%s' is too small %s", toString(sourceType), value, toString(targetType));
             }
             return targetType.cast(Byte.valueOf(value.byteValue()));
         }
@@ -315,12 +313,10 @@ public abstract class NumberConverter<N extends Number> extends AbstractConverte
         if (targetType.equals(Short.class)) {
             final long longValue = value.longValue();
             if (longValue > Short.MAX_VALUE) {
-                throw new ConversionException(toString(sourceType) + " value '" + value
-                        + "' is too large for " + toString(targetType));
+                throw ConversionException.format("%s value '%s' is too large for %s", toString(sourceType), value, toString(targetType));
             }
             if (longValue < Short.MIN_VALUE) {
-                throw new ConversionException(toString(sourceType) + " value '" + value
-                        + "' is too small " + toString(targetType));
+                throw ConversionException.format("%s value '%s' is too small %s", toString(sourceType), value, toString(targetType));
             }
             return targetType.cast(Short.valueOf(value.shortValue()));
         }
@@ -329,12 +325,10 @@ public abstract class NumberConverter<N extends Number> extends AbstractConverte
         if (targetType.equals(Integer.class)) {
             final long longValue = value.longValue();
             if (longValue > Integer.MAX_VALUE) {
-                throw new ConversionException(toString(sourceType) + " value '" + value
-                        + "' is too large for " + toString(targetType));
+                throw ConversionException.format("%s value '%s' is too large for %s", toString(sourceType), value, toString(targetType));
             }
             if (longValue < Integer.MIN_VALUE) {
-                throw new ConversionException(toString(sourceType) + " value '" + value
-                        + "' is too small " + toString(targetType));
+                throw ConversionException.format("%s value '%s' is too small %s", toString(sourceType), value, toString(targetType));
             }
             return targetType.cast(Integer.valueOf(value.intValue()));
         }
@@ -347,8 +341,7 @@ public abstract class NumberConverter<N extends Number> extends AbstractConverte
         // Float
         if (targetType.equals(Float.class)) {
             if (value.doubleValue() > Float.MAX_VALUE) {
-                throw new ConversionException(toString(sourceType) + " value '" + value
-                        + "' is too large for " + toString(targetType));
+                throw ConversionException.format("%s value '%s' is too large for %s", toString(sourceType), value, toString(targetType));
             }
             return targetType.cast(Float.valueOf(value.floatValue()));
         }
@@ -364,7 +357,7 @@ public abstract class NumberConverter<N extends Number> extends AbstractConverte
                 return targetType.cast(new BigDecimal(value.toString()));
             }
             if (value instanceof BigInteger) {
-                return targetType.cast(new BigDecimal((BigInteger)value));
+                return targetType.cast(new BigDecimal((BigInteger) value));
             }
             if (value instanceof BigDecimal) {
                 return targetType.cast(new BigDecimal(value.toString()));
@@ -375,13 +368,12 @@ public abstract class NumberConverter<N extends Number> extends AbstractConverte
         // BigInteger
         if (targetType.equals(BigInteger.class)) {
             if (value instanceof BigDecimal) {
-                return targetType.cast(((BigDecimal)value).toBigInteger());
+                return targetType.cast(((BigDecimal) value).toBigInteger());
             }
             return targetType.cast(BigInteger.valueOf(value.longValue()));
         }
 
-        final String msg = toString(getClass()) + " cannot handle conversion to '"
-                   + toString(targetType) + "'";
+        final String msg = toString(getClass()) + " cannot handle conversion to '" + toString(targetType) + "'";
         if (log().isWarnEnabled()) {
             log().warn("    " + msg);
         }
diff --git a/src/main/java/org/apache/commons/beanutils2/locale/converters/DateLocaleConverter.java b/src/main/java/org/apache/commons/beanutils2/locale/converters/DateLocaleConverter.java
index 8ce314b0..b9548441 100644
--- a/src/main/java/org/apache/commons/beanutils2/locale/converters/DateLocaleConverter.java
+++ b/src/main/java/org/apache/commons/beanutils2/locale/converters/DateLocaleConverter.java
@@ -242,33 +242,30 @@ public class DateLocaleConverter extends BaseLocaleConverter<Date> {
 
         // Handle Calendar
         if (value instanceof java.util.Calendar) {
-            return ((java.util.Calendar)value).getTime();
+            return ((java.util.Calendar) value).getTime();
         }
 
-         if (localizedPattern) {
-             pattern = convertLocalizedPattern(pattern, locale);
-         }
+        if (localizedPattern) {
+            pattern = convertLocalizedPattern(pattern, locale);
+        }
 
-         // Create Formatter - use default if pattern is null
-         final DateFormat formatter = pattern == null ? DateFormat.getDateInstance(DateFormat.SHORT, locale)
-                                                : new SimpleDateFormat(pattern, locale);
-         formatter.setLenient(isLenient);
+        // Create Formatter - use default if pattern is null
+        final DateFormat formatter = pattern == null ? DateFormat.getDateInstance(DateFormat.SHORT, locale) : new SimpleDateFormat(pattern, locale);
+        formatter.setLenient(isLenient);
 
-         // Parse the Date
+        // Parse the Date
         final ParsePosition pos = new ParsePosition(0);
         final String strValue = value.toString();
         final Object parsedValue = formatter.parseObject(strValue, pos);
         if (pos.getErrorIndex() > -1) {
-            throw new ConversionException("Error parsing date '" + value +
-                    "' at position="+ pos.getErrorIndex());
+            throw ConversionException.format("Error parsing date '%s' at position = %s", value, pos.getErrorIndex());
         }
         if (pos.getIndex() < strValue.length()) {
-            throw new ConversionException("Date '" + value +
-                    "' contains unparsed characters from position=" + pos.getIndex());
+            throw ConversionException.format("Date '%s' contains unparsed characters from position = %s", value, pos.getIndex());
         }
 
         return parsedValue;
-     }
+    }
 
      /**
       * Convert a pattern from a localized format to the default format.
diff --git a/src/main/java/org/apache/commons/beanutils2/locale/converters/FloatLocaleConverter.java b/src/main/java/org/apache/commons/beanutils2/locale/converters/FloatLocaleConverter.java
index 9b7961e1..f9f83e2e 100644
--- a/src/main/java/org/apache/commons/beanutils2/locale/converters/FloatLocaleConverter.java
+++ b/src/main/java/org/apache/commons/beanutils2/locale/converters/FloatLocaleConverter.java
@@ -197,12 +197,12 @@ public class FloatLocaleConverter extends DecimalLocaleConverter<Float> {
     */
    @Override
    protected Object parse(final Object value, final String pattern) throws ParseException {
-      final Number parsed = (Number) super.parse(value, pattern);
-      final double doubleValue = parsed.doubleValue();
-      final double posDouble = doubleValue >= 0 ? doubleValue : doubleValue * -1;
-      if (posDouble != 0 && (posDouble < Float.MIN_VALUE || posDouble > Float.MAX_VALUE)) {
-          throw new ConversionException("Supplied number is not of type Float: "+parsed);
-      }
-      return Float.valueOf(parsed.floatValue()); // unlike superclass it returns Float type
+       final Number parsed = (Number) super.parse(value, pattern);
+       final double doubleValue = parsed.doubleValue();
+       final double posDouble = doubleValue >= 0 ? doubleValue : doubleValue * -1;
+       if (posDouble != 0 && (posDouble < Float.MIN_VALUE || posDouble > Float.MAX_VALUE)) {
+           throw new ConversionException("Supplied number is not of type Float: " + parsed);
+       }
+       return Float.valueOf(parsed.floatValue()); // unlike superclass it returns Float type
    }
 }
diff --git a/src/test/java/org/apache/commons/beanutils2/converters/DateLocaleConverterTestCase.java b/src/test/java/org/apache/commons/beanutils2/converters/DateLocaleConverterTestCase.java
index 90044a05..375ff741 100644
--- a/src/test/java/org/apache/commons/beanutils2/converters/DateLocaleConverterTestCase.java
+++ b/src/test/java/org/apache/commons/beanutils2/converters/DateLocaleConverterTestCase.java
@@ -408,13 +408,13 @@ public class DateLocaleConverterTestCase extends BaseLocaleConverterTestCase<Dat
         try {
             converter.convert("01/10/2004", "dd-MM-yyyy");
         } catch (final ConversionException e) {
-            assertEquals("Parse Error", "Error parsing date '01/10/2004' at position=2", e.getMessage());
+            assertEquals("Parse Error", "Error parsing date '01/10/2004' at position = 2", e.getMessage());
         }
 
         try {
             converter.convert("01-10-2004X", "dd-MM-yyyy");
         } catch (final ConversionException e) {
-            assertEquals("Parse Length", "Date '01-10-2004X' contains unparsed characters from position=10", e.getMessage());
+            assertEquals("Parse Length", "Date '01-10-2004X' contains unparsed characters from position = 10", e.getMessage());
         }
 
     }