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
The following commit(s) were added to refs/heads/master by this push: new bbfdda82 Better @throws bbfdda82 is described below commit bbfdda821aeea0d8199ea4f3b94e6f2b8b44ac5f Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Sat Feb 18 12:26:44 2023 -0500 Better @throws --- .../beanutils2/locale/LocaleConvertUtilsBean.java | 19 ++-- .../commons/beanutils2/locale/LocaleConverter.java | 3 +- .../locale/converters/ByteLocaleConverter.java | 2 +- .../locale/converters/DateLocaleConverter.java | 2 +- .../locale/converters/DecimalLocaleConverter.java | 2 +- .../locale/converters/DoubleLocaleConverter.java | 4 +- .../locale/converters/LongLocaleConverter.java | 4 +- .../locale/converters/ShortLocaleConverter.java | 2 +- .../locale/converters/StringLocaleConverter.java | 2 +- .../converters/locale/SqlDateLocaleConverter.java | 3 +- .../converters/locale/SqlTimeLocaleConverter.java | 3 +- .../locale/SqlTimestampLocaleConverter.java | 3 +- .../commons/beanutils2/bugs/Jira347TestCase.java | 124 ++++++++++----------- 13 files changed, 91 insertions(+), 82 deletions(-) diff --git a/src/main/java/org/apache/commons/beanutils2/locale/LocaleConvertUtilsBean.java b/src/main/java/org/apache/commons/beanutils2/locale/LocaleConvertUtilsBean.java index 1cb78ce1..c08b1afa 100644 --- a/src/main/java/org/apache/commons/beanutils2/locale/LocaleConvertUtilsBean.java +++ b/src/main/java/org/apache/commons/beanutils2/locale/LocaleConvertUtilsBean.java @@ -23,6 +23,7 @@ import java.math.BigInteger; import java.util.Locale; import java.util.Map; +import org.apache.commons.beanutils2.ConversionException; import org.apache.commons.beanutils2.WeakFastHashMap; import org.apache.commons.beanutils2.locale.converters.BigDecimalLocaleConverter; import org.apache.commons.beanutils2.locale.converters.BigIntegerLocaleConverter; @@ -123,7 +124,7 @@ public class LocaleConvertUtilsBean { * @param value The Value to be converted * @return the converted value * - * @throws org.apache.commons.beanutils2.ConversionException if thrown by an + * @throws ConversionException if thrown by an * underlying Converter */ public String convert(final Object value) { @@ -139,7 +140,7 @@ public class LocaleConvertUtilsBean { * @param pattern The conversion pattern * @return the converted value * - * @throws org.apache.commons.beanutils2.ConversionException if thrown by an + * @throws ConversionException if thrown by an * underlying Converter */ public String convert(final Object value, final Locale locale, final String pattern) { @@ -155,7 +156,7 @@ public class LocaleConvertUtilsBean { * @param pattern The conversion pattern * @return the converted value * - * @throws org.apache.commons.beanutils2.ConversionException if thrown by an + * @throws ConversionException if thrown by an * underlying Converter */ public String convert(final Object value, final String pattern) { @@ -170,7 +171,7 @@ public class LocaleConvertUtilsBean { * @param clazz The Data type to which this value should be converted. * @return the converted value * - * @throws org.apache.commons.beanutils2.ConversionException if thrown by an + * @throws ConversionException if thrown by an * underlying Converter */ public Object convert(final String value, final Class<?> clazz) { @@ -188,7 +189,7 @@ public class LocaleConvertUtilsBean { * @param pattern The conversion pattern * @return the converted value * - * @throws org.apache.commons.beanutils2.ConversionException if thrown by an + * @throws ConversionException if thrown by an * underlying Converter */ public Object convert(final String value, final Class<?> clazz, final Locale locale, final String pattern) { @@ -222,7 +223,7 @@ public class LocaleConvertUtilsBean { * @param pattern The conversion pattern * @return the converted value * - * @throws org.apache.commons.beanutils2.ConversionException if thrown by an + * @throws ConversionException if thrown by an * underlying Converter */ public Object convert(final String value, final Class<?> clazz, final String pattern) { @@ -237,7 +238,7 @@ public class LocaleConvertUtilsBean { * @param clazz Java array or element class to be converted to * @return the converted value * - * @throws org.apache.commons.beanutils2.ConversionException if thrown by an + * @throws ConversionException if thrown by an * underlying Converter */ public Object convert(final String[] values, final Class<?> clazz) { @@ -255,7 +256,7 @@ public class LocaleConvertUtilsBean { * @param pattern The conversion pattern * @return the converted value * - * @throws org.apache.commons.beanutils2.ConversionException if thrown by an + * @throws ConversionException if thrown by an * underlying Converter */ public <T> T[] convert(final String[] values, final Class<T> clazz, final Locale locale, final String pattern) { @@ -286,7 +287,7 @@ public class LocaleConvertUtilsBean { * @param pattern The conversion pattern * @return the converted value * - * @throws org.apache.commons.beanutils2.ConversionException if thrown by an + * @throws ConversionException if thrown by an * underlying Converter */ public <T> T[] convert(final String[] values, final Class<T> clazz, final String pattern) { diff --git a/src/main/java/org/apache/commons/beanutils2/locale/LocaleConverter.java b/src/main/java/org/apache/commons/beanutils2/locale/LocaleConverter.java index e5b0212a..2a7110ce 100644 --- a/src/main/java/org/apache/commons/beanutils2/locale/LocaleConverter.java +++ b/src/main/java/org/apache/commons/beanutils2/locale/LocaleConverter.java @@ -17,6 +17,7 @@ package org.apache.commons.beanutils2.locale; +import org.apache.commons.beanutils2.ConversionException; import org.apache.commons.beanutils2.Converter; /** @@ -36,7 +37,7 @@ public interface LocaleConverter<T> extends Converter<T> { * @param value The input value to be converted * @param pattern The user-defined pattern is used for the input object formatting. * @return The converted value - * @throws org.apache.commons.beanutils2.ConversionException if conversion cannot be performed successfully or if the target type is not supported + * @throws ConversionException if conversion cannot be performed successfully or if the target type is not supported */ <R> R convert(Class<R> type, Object value, String pattern); } diff --git a/src/main/java/org/apache/commons/beanutils2/locale/converters/ByteLocaleConverter.java b/src/main/java/org/apache/commons/beanutils2/locale/converters/ByteLocaleConverter.java index be79c0ba..e8f8095d 100644 --- a/src/main/java/org/apache/commons/beanutils2/locale/converters/ByteLocaleConverter.java +++ b/src/main/java/org/apache/commons/beanutils2/locale/converters/ByteLocaleConverter.java @@ -60,7 +60,7 @@ public class ByteLocaleConverter extends DecimalLocaleConverter<Byte> { * @param pattern The pattern is used for the conversion * @return The converted value * - * @throws org.apache.commons.beanutils2.ConversionException if conversion cannot be performed successfully + * @throws ConversionException if conversion cannot be performed successfully * @throws ParseException if an error occurs parsing a String to a Number */ @Override 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 6f3ed0a9..012df7c7 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 @@ -193,7 +193,7 @@ public class DateLocaleConverter<D extends Date> extends BaseLocaleConverter<D> * @param value The input object to be converted * @param pattern The pattern is used for the conversion * @return the converted Date value - * @throws org.apache.commons.beanutils2.ConversionException if conversion cannot be performed successfully + * @throws ConversionException if conversion cannot be performed successfully * @throws ParseException if an error occurs parsing */ @Override diff --git a/src/main/java/org/apache/commons/beanutils2/locale/converters/DecimalLocaleConverter.java b/src/main/java/org/apache/commons/beanutils2/locale/converters/DecimalLocaleConverter.java index fe2db381..29c58e40 100644 --- a/src/main/java/org/apache/commons/beanutils2/locale/converters/DecimalLocaleConverter.java +++ b/src/main/java/org/apache/commons/beanutils2/locale/converters/DecimalLocaleConverter.java @@ -86,7 +86,7 @@ public class DecimalLocaleConverter<T extends Number> extends BaseLocaleConverte * @param value The input object to be converted * @param pattern The pattern is used for the conversion * @return The converted value - * @throws org.apache.commons.beanutils2.ConversionException if conversion cannot be performed successfully + * @throws ConversionException if conversion cannot be performed successfully * @throws ParseException if an error occurs parsing a String to a Number */ @Override diff --git a/src/main/java/org/apache/commons/beanutils2/locale/converters/DoubleLocaleConverter.java b/src/main/java/org/apache/commons/beanutils2/locale/converters/DoubleLocaleConverter.java index 03862219..c44ad8b2 100644 --- a/src/main/java/org/apache/commons/beanutils2/locale/converters/DoubleLocaleConverter.java +++ b/src/main/java/org/apache/commons/beanutils2/locale/converters/DoubleLocaleConverter.java @@ -20,6 +20,8 @@ package org.apache.commons.beanutils2.locale.converters; import java.text.ParseException; import java.util.Locale; +import org.apache.commons.beanutils2.ConversionException; + /** * Standard {@link org.apache.commons.beanutils2.locale.LocaleConverter} implementation that converts an incoming locale-sensitive String into a {@link Double} * object, optionally using a default value or throwing a {@link org.apache.commons.beanutils2.ConversionException} if a conversion error occurs. @@ -58,7 +60,7 @@ public class DoubleLocaleConverter extends DecimalLocaleConverter<Double> { * @param pattern The pattern is used for the conversion * @return The converted value * - * @throws org.apache.commons.beanutils2.ConversionException if conversion cannot be performed successfully + * @throws ConversionException if conversion cannot be performed successfully * @throws ParseException if an error occurs parsing a String to a Number */ @Override diff --git a/src/main/java/org/apache/commons/beanutils2/locale/converters/LongLocaleConverter.java b/src/main/java/org/apache/commons/beanutils2/locale/converters/LongLocaleConverter.java index c0c80b76..6e88a4a1 100644 --- a/src/main/java/org/apache/commons/beanutils2/locale/converters/LongLocaleConverter.java +++ b/src/main/java/org/apache/commons/beanutils2/locale/converters/LongLocaleConverter.java @@ -20,6 +20,8 @@ package org.apache.commons.beanutils2.locale.converters; import java.text.ParseException; import java.util.Locale; +import org.apache.commons.beanutils2.ConversionException; + /** * Standard {@link org.apache.commons.beanutils2.locale.LocaleConverter} implementation that converts an incoming locale-sensitive String into a {@link Long} * object, optionally using a default value or throwing a {@link org.apache.commons.beanutils2.ConversionException} if a conversion error occurs. @@ -58,7 +60,7 @@ public class LongLocaleConverter extends DecimalLocaleConverter<Long> { * @param pattern The pattern is used for the conversion * @return The converted value * - * @throws org.apache.commons.beanutils2.ConversionException if conversion cannot be performed successfully + * @throws ConversionException if conversion cannot be performed successfully * @throws ParseException if an error occurs parsing a String to a Number * @since 1.8.0 */ diff --git a/src/main/java/org/apache/commons/beanutils2/locale/converters/ShortLocaleConverter.java b/src/main/java/org/apache/commons/beanutils2/locale/converters/ShortLocaleConverter.java index c462f67d..2668174f 100644 --- a/src/main/java/org/apache/commons/beanutils2/locale/converters/ShortLocaleConverter.java +++ b/src/main/java/org/apache/commons/beanutils2/locale/converters/ShortLocaleConverter.java @@ -65,7 +65,7 @@ public class ShortLocaleConverter extends DecimalLocaleConverter<Short> { * @param pattern The pattern is used for the conversion * @return The converted value * - * @throws org.apache.commons.beanutils2.ConversionException if conversion cannot be performed successfully + * @throws ConversionException if conversion cannot be performed successfully * @throws ParseException if an error occurs parsing a String to a Number * @since 1.8.0 */ diff --git a/src/main/java/org/apache/commons/beanutils2/locale/converters/StringLocaleConverter.java b/src/main/java/org/apache/commons/beanutils2/locale/converters/StringLocaleConverter.java index 15054592..a129eb9f 100644 --- a/src/main/java/org/apache/commons/beanutils2/locale/converters/StringLocaleConverter.java +++ b/src/main/java/org/apache/commons/beanutils2/locale/converters/StringLocaleConverter.java @@ -107,7 +107,7 @@ public class StringLocaleConverter extends BaseLocaleConverter<String> { * @param value The input object to be converted * @param pattern The pattern is used for the conversion * @return The converted value - * @throws org.apache.commons.beanutils2.ConversionException if conversion cannot be performed successfully + * @throws ConversionException if conversion cannot be performed successfully * @throws ParseException if an error occurs */ @Override diff --git a/src/main/java/org/apache/commons/beanutils2/sql/converters/locale/SqlDateLocaleConverter.java b/src/main/java/org/apache/commons/beanutils2/sql/converters/locale/SqlDateLocaleConverter.java index ec8e6e80..5c67f033 100644 --- a/src/main/java/org/apache/commons/beanutils2/sql/converters/locale/SqlDateLocaleConverter.java +++ b/src/main/java/org/apache/commons/beanutils2/sql/converters/locale/SqlDateLocaleConverter.java @@ -21,6 +21,7 @@ import java.sql.Date; import java.text.ParseException; import java.util.Locale; +import org.apache.commons.beanutils2.ConversionException; import org.apache.commons.beanutils2.locale.converters.DateLocaleConverter; /** @@ -62,7 +63,7 @@ public class SqlDateLocaleConverter extends DateLocaleConverter<Date> { * @param value The input object to be converted * @param pattern The pattern is used for the conversion * @return The converted value - * @throws org.apache.commons.beanutils2.ConversionException if conversion cannot be performed successfully + * @throws ConversionException if conversion cannot be performed successfully * @throws ParseException if an error occurs parsing a String to a Number */ @Override diff --git a/src/main/java/org/apache/commons/beanutils2/sql/converters/locale/SqlTimeLocaleConverter.java b/src/main/java/org/apache/commons/beanutils2/sql/converters/locale/SqlTimeLocaleConverter.java index 165143a9..a94017a8 100644 --- a/src/main/java/org/apache/commons/beanutils2/sql/converters/locale/SqlTimeLocaleConverter.java +++ b/src/main/java/org/apache/commons/beanutils2/sql/converters/locale/SqlTimeLocaleConverter.java @@ -21,6 +21,7 @@ import java.sql.Time; import java.text.ParseException; import java.util.Locale; +import org.apache.commons.beanutils2.ConversionException; import org.apache.commons.beanutils2.locale.converters.DateLocaleConverter; /** @@ -62,7 +63,7 @@ public class SqlTimeLocaleConverter extends DateLocaleConverter<Time> { * @param value The input object to be converted * @param pattern The pattern is used for the conversion * @return The converted value - * @throws org.apache.commons.beanutils2.ConversionException if conversion cannot be performed successfully + * @throws ConversionException if conversion cannot be performed successfully * @throws ParseException if an error occurs parsing a String to a Number */ @Override diff --git a/src/main/java/org/apache/commons/beanutils2/sql/converters/locale/SqlTimestampLocaleConverter.java b/src/main/java/org/apache/commons/beanutils2/sql/converters/locale/SqlTimestampLocaleConverter.java index 90937281..f95604dc 100644 --- a/src/main/java/org/apache/commons/beanutils2/sql/converters/locale/SqlTimestampLocaleConverter.java +++ b/src/main/java/org/apache/commons/beanutils2/sql/converters/locale/SqlTimestampLocaleConverter.java @@ -21,6 +21,7 @@ import java.sql.Timestamp; import java.text.ParseException; import java.util.Locale; +import org.apache.commons.beanutils2.ConversionException; import org.apache.commons.beanutils2.locale.converters.DateLocaleConverter; /** @@ -62,7 +63,7 @@ public class SqlTimestampLocaleConverter extends DateLocaleConverter<Timestamp> * @param value The input object to be converted * @param pattern The pattern is used for the conversion * @return The converted value - * @throws org.apache.commons.beanutils2.ConversionException if conversion cannot be performed successfully + * @throws ConversionException if conversion cannot be performed successfully * @throws ParseException if an error occurs parsing a String to a Number */ @Override diff --git a/src/test/java/org/apache/commons/beanutils2/bugs/Jira347TestCase.java b/src/test/java/org/apache/commons/beanutils2/bugs/Jira347TestCase.java index 7067e659..f67cc67b 100644 --- a/src/test/java/org/apache/commons/beanutils2/bugs/Jira347TestCase.java +++ b/src/test/java/org/apache/commons/beanutils2/bugs/Jira347TestCase.java @@ -37,56 +37,29 @@ import junit.framework.TestCase; public class Jira347TestCase extends TestCase { /** - * Tests that MappedPropertyDescriptor does not throw an exception while re-creating a Method reference after it has been garbage collected under the - * following circumstances. - a class has a property 'mappedProperty' - there is no getter for this property - there is method - * setMappedProperty(MappedPropertyTestBean,MappedPropertyTestBean) - * - * In this case getMappedWriteMethod should not throw an exception after the method reference has been garbage collected. It is essential that in both cases - * the same method is returned or in both cases null. If the constructor of the MappedPropertyDescriptor would recognize the situation (of the first param - * not being of type String) this would be fine as well. + * Create a new class loader instance. */ - public void testMappedPropertyDescriptor_AnyArgsProperty() throws Exception { - final String className = "org.apache.commons.beanutils2.MappedPropertyTestBean"; - try (final URLClassLoader loader = newClassLoader()) { - final Class<?> beanClass = loader.loadClass(className); - beanClass.newInstance(); - - // Sanity checks only - assertNotNull("ClassLoader is null", loader); - assertNotNull("BeanClass is null", beanClass); - assertNotSame("ClassLoaders should be different..", getClass().getClassLoader(), beanClass.getClassLoader()); - assertSame("BeanClass ClassLoader incorrect", beanClass.getClassLoader(), loader); + private static URLClassLoader newClassLoader() throws MalformedURLException { - // now start the test - MappedPropertyDescriptor descriptor = null; - try { - descriptor = new MappedPropertyDescriptor("anyMapped", beanClass); - } catch (final IntrospectionException e) { - // this would be fine as well - } + final String dataFilePath = MemoryLeakTestCase.class.getResource("pojotests").getFile(); + // System.out.println("dataFilePath: " + dataFilePath); + final String location = "file://" + + dataFilePath.substring(0, dataFilePath.length() - "org.apache.commons.beanutils2.memoryleaktests.pojotests".length()); + // System.out.println("location: " + location); - if (descriptor != null) { - final String m1 = getMappedWriteMethod(descriptor); - forceGarbageCollection(); - try { - final String m2 = getMappedWriteMethod(descriptor); - assertEquals("Method returned post garbage collection differs from Method returned prior to gc", m1, m2); - } catch (final RuntimeException e) { - fail("getMappedWriteMethod threw an exception after garbage collection " + e); - } + final StringBuilder newString = new StringBuilder(); + for (int i = 0; i < location.length(); i++) { + if (location.charAt(i) == '\\') { + newString.append("/"); + } else { + newString.append(location.charAt(i)); } } - } + final String classLocation = newString.toString(); + // System.out.println("classlocation: " + classLocation); - /** - * Retrieves the string representation of the mapped write method for the given descriptor. This conversion is needed as there must not be strong reference - * to the Method object outside of this method as otherwise the garbage collector will not clean up the soft reference within the MappedPropertyDescriptor. - * - * @return the string representation or null if mapped write method does not exist - */ - private String getMappedWriteMethod(final MappedPropertyDescriptor descriptor) { - final Method m = descriptor.getMappedWriteMethod(); - return m == null ? null : m.toString(); + final URLClassLoader theLoader = URLClassLoader.newInstance(new URL[] { new URL(classLocation) }, null); + return theLoader; } /** @@ -121,28 +94,55 @@ public class Jira347TestCase extends TestCase { } /** - * Create a new class loader instance. + * Retrieves the string representation of the mapped write method for the given descriptor. This conversion is needed as there must not be strong reference + * to the Method object outside of this method as otherwise the garbage collector will not clean up the soft reference within the MappedPropertyDescriptor. + * + * @return the string representation or null if mapped write method does not exist */ - private static URLClassLoader newClassLoader() throws MalformedURLException { + private String getMappedWriteMethod(final MappedPropertyDescriptor descriptor) { + final Method m = descriptor.getMappedWriteMethod(); + return m == null ? null : m.toString(); + } - final String dataFilePath = MemoryLeakTestCase.class.getResource("pojotests").getFile(); - // System.out.println("dataFilePath: " + dataFilePath); - final String location = "file://" - + dataFilePath.substring(0, dataFilePath.length() - "org.apache.commons.beanutils2.memoryleaktests.pojotests".length()); - // System.out.println("location: " + location); + /** + * Tests that MappedPropertyDescriptor does not throw an exception while re-creating a Method reference after it has been garbage collected under the + * following circumstances. - a class has a property 'mappedProperty' - there is no getter for this property - there is method + * setMappedProperty(MappedPropertyTestBean,MappedPropertyTestBean) + * + * In this case getMappedWriteMethod should not throw an exception after the method reference has been garbage collected. It is essential that in both cases + * the same method is returned or in both cases null. If the constructor of the MappedPropertyDescriptor would recognize the situation (of the first param + * not being of type String) this would be fine as well. + */ + public void testMappedPropertyDescriptor_AnyArgsProperty() throws Exception { + final String className = "org.apache.commons.beanutils2.MappedPropertyTestBean"; + try (final URLClassLoader loader = newClassLoader()) { + final Class<?> beanClass = loader.loadClass(className); + beanClass.newInstance(); - final StringBuilder newString = new StringBuilder(); - for (int i = 0; i < location.length(); i++) { - if (location.charAt(i) == '\\') { - newString.append("/"); - } else { - newString.append(location.charAt(i)); + // Sanity checks only + assertNotNull("ClassLoader is null", loader); + assertNotNull("BeanClass is null", beanClass); + assertNotSame("ClassLoaders should be different..", getClass().getClassLoader(), beanClass.getClassLoader()); + assertSame("BeanClass ClassLoader incorrect", beanClass.getClassLoader(), loader); + + // now start the test + MappedPropertyDescriptor descriptor = null; + try { + descriptor = new MappedPropertyDescriptor("anyMapped", beanClass); + } catch (final IntrospectionException e) { + // this would be fine as well } - } - final String classLocation = newString.toString(); - // System.out.println("classlocation: " + classLocation); - final URLClassLoader theLoader = URLClassLoader.newInstance(new URL[] { new URL(classLocation) }, null); - return theLoader; + if (descriptor != null) { + final String m1 = getMappedWriteMethod(descriptor); + forceGarbageCollection(); + try { + final String m2 = getMappedWriteMethod(descriptor); + assertEquals("Method returned post garbage collection differs from Method returned prior to gc", m1, m2); + } catch (final RuntimeException e) { + fail("getMappedWriteMethod threw an exception after garbage collection " + e); + } + } + } } }