You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by oh...@apache.org on 2013/11/08 22:08:33 UTC
svn commit: r1540186 [1/6] - in /commons/proper/beanutils/trunk: ./
src/changes/ src/main/java/org/apache/commons/beanutils/
src/main/java/org/apache/commons/beanutils/converters/
src/main/java/org/apache/commons/beanutils/locale/ src/test/java/org/apa...
Author: oheger
Date: Fri Nov 8 21:08:30 2013
New Revision: 1540186
URL: http://svn.apache.org/r1540186
Log:
Merged java5 branch back into trunk.
Added:
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BaseDynaBeanMapDecorator.java
- copied unchanged from r1540184, commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/BaseDynaBeanMapDecorator.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/DynaBeanPropertyMapDecorator.java
- copied unchanged from r1540184, commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/DynaBeanPropertyMapDecorator.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/StringConverterTestCase.java
- copied unchanged from r1540184, commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/converters/StringConverterTestCase.java
Modified:
commons/proper/beanutils/trunk/ (props changed)
commons/proper/beanutils/trunk/pom.xml
commons/proper/beanutils/trunk/src/changes/changes.xml
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BasicDynaBean.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BasicDynaClass.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanComparator.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanMap.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanUtils.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanUtilsBean.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanUtilsBean2.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConstructorUtils.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ContextClassLoaderLocal.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConvertUtils.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConvertUtilsBean.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConvertUtilsBean2.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/Converter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/DynaBeanMapDecorator.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/DynaProperty.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/JDBCDynaClass.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/LazyDynaBean.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/LazyDynaClass.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/LazyDynaList.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/LazyDynaMap.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/MappedPropertyDescriptor.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/MethodUtils.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/MutableDynaClass.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/PropertyUtils.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/PropertyUtilsBean.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ResultSetDynaClass.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ResultSetIterator.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/RowSetDynaClass.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/WeakFastHashMap.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/WrapDynaClass.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/AbstractConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/ArrayConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/BigDecimalConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/BigIntegerConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/BooleanConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/ByteConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/CalendarConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/CharacterConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/ClassConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/ConverterFacade.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/DateConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/DateTimeConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/DoubleConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/FileConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/FloatConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/IntegerConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/LongConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/NumberConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/ShortConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/SqlDateConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/SqlTimeConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/SqlTimestampConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/StringConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/converters/URLConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/locale/BaseLocaleConverter.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/locale/LocaleBeanUtils.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/locale/LocaleBeanUtilsBean.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/locale/LocaleConvertUtils.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/locale/LocaleConvertUtilsBean.java
commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/locale/LocaleConverter.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/BeanComparatorTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/BeanMapTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/BeanUtilsBenchCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/BeanUtilsTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/BeanificationTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/ConstructorUtilsTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/ConvertUtilsTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/DynaBeanMapDecoratorTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/DynaBeanUtilsTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/DynaPropertyUtilsTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/DynaResultSetTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/DynaRowSetTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/ExtendMapBean.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/IndexedPropertyTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/IndexedTestBean.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/LazyDynaBeanTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/LazyDynaListTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/LazyDynaMapTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/MappedPropertyTestBean.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/MappedPropertyTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/PropertyUtilsBenchCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/PropertyUtilsTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/PropsFirstPropertyUtilsBean.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/TestBean.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/TestResultSet.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/TestResultSetMetaData.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/ThrowExceptionConverter.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/WrapDynaBeanTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/bugs/Jira157TestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/bugs/Jira298TestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/bugs/Jira339TestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/bugs/Jira347TestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/bugs/Jira357TestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/bugs/Jira381TestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/bugs/Jira422TestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/bugs/Jira61TestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/bugs/other/Jira18BeanFactory.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/bugs/other/Jira61BeanFactory.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/ArrayConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/BigDecimalConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/BigIntegerConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/BooleanConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/ByteConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/CalendarConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/CharacterConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/ClassConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/ClassReloader.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/ClassReloaderTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/DateConverterTestBase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/DateConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/DoubleConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/FileConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/FloatConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/IntegerConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/LongConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/MemoryTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/NumberConverterTestBase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/ShortConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/SqlDateConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/SqlTimeConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/SqlTimestampConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/converters/URLConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/locale/LocaleBeanificationTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/locale/LocaleConvertUtilsTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/locale/converters/BaseLocaleConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/locale/converters/BigDecimalLocaleConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/locale/converters/BigIntegerLocaleConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/locale/converters/ByteLocaleConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/locale/converters/DateLocaleConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/locale/converters/DoubleLocaleConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/locale/converters/FloatLocaleConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/locale/converters/IntegerLocaleConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/locale/converters/LongLocaleConverterTestCase.java
commons/proper/beanutils/trunk/src/test/java/org/apache/commons/beanutils/locale/converters/ShortLocaleConverterTestCase.java
Propchange: commons/proper/beanutils/trunk/
------------------------------------------------------------------------------
svn:mergeinfo = /commons/proper/beanutils/branches/java5:1532038-1540184
Modified: commons/proper/beanutils/trunk/pom.xml
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/trunk/pom.xml?rev=1540186&r1=1540185&r2=1540186&view=diff
==============================================================================
--- commons/proper/beanutils/trunk/pom.xml (original)
+++ commons/proper/beanutils/trunk/pom.xml Fri Nov 8 21:08:30 2013
@@ -308,6 +308,8 @@
- so we will just exclude it until someone comes up with a solution.
-->
<exclude>**/*MemoryTestCase.java</exclude>
+ <!-- Temporarily disabled long-running test case -->
+ <exclude>**/MemoryLeakTestCase.java</exclude>
</excludes>
<!-- Configure Logging -->
Modified: commons/proper/beanutils/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/trunk/src/changes/changes.xml?rev=1540186&r1=1540185&r2=1540186&view=diff
==============================================================================
--- commons/proper/beanutils/trunk/src/changes/changes.xml (original)
+++ commons/proper/beanutils/trunk/src/changes/changes.xml Fri Nov 8 21:08:30 2013
@@ -40,6 +40,25 @@ The <action> type attribute can be add,u
<body>
<release version="1.9.0" date="tba" description="Upgrade to Java 5 including generics where possible">
+ <action dev="oheger" type="update" issue="BEANUTILS-452" >
+ Add generics
+ </action>
+ <action dev="oheger" type="update" issue="BEANUTILS-449" >
+ LocaleConverters do not take the target type into account
+ </action>
+ <action dev="oheger" type="update" issue="BEANUTILS-448" >
+ LocaleConverters do not check their default value
+ </action>
+ <action dev="oheger" type="update" issue="BEANUTILS-447" >
+ LazyDynaList.toArray() is not conform to the contract defined by the
+ Collection interface
+ </action>
+ <action dev="oheger" type="update" issue="BEANUTILS-446" >
+ Some of the converters ignore the passed in target type
+ </action>
+ <action dev="oheger" type="update" issue="BEANUTILS-445" >
+ Converters can return an invalid result object if a default value is set
+ </action>
<action dev="britter" type="update" issue="BEANUTILS-436" >
Replace package.html with package-info.java
</action>
Modified: commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BasicDynaBean.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BasicDynaBean.java?rev=1540186&r1=1540185&r2=1540186&view=diff
==============================================================================
--- commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BasicDynaBean.java (original)
+++ commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BasicDynaBean.java Fri Nov 8 21:08:30 2013
@@ -73,10 +73,10 @@ public class BasicDynaBean implements Dy
/**
* The set of property values for this DynaBean, keyed by property name.
*/
- protected HashMap values = new HashMap();
+ protected HashMap<String, Object> values = new HashMap<String, Object>();
/** Map decorator for this DynaBean */
- private transient Map mapDecorator;
+ private transient Map<String, Object> mapDecorator;
/**
* Return a Map representation of this DynaBean.
@@ -88,11 +88,11 @@ public class BasicDynaBean implements Dy
* @return a Map representation of this DynaBean
* @since 1.8.0
*/
- public Map getMap() {
+ public Map<String, Object> getMap() {
// cache the Map
if (mapDecorator == null) {
- mapDecorator = new DynaBeanMapDecorator(this);
+ mapDecorator = new DynaBeanPropertyMapDecorator(this);
}
return mapDecorator;
@@ -120,7 +120,7 @@ public class BasicDynaBean implements Dy
throw new NullPointerException
("No mapped value for '" + name + "(" + key + ")'");
} else if (value instanceof Map) {
- return (((Map) value).containsKey(key));
+ return (((Map<?, ?>) value).containsKey(key));
} else {
throw new IllegalArgumentException
("Non-mapped property for '" + name + "(" + key + ")'");
@@ -147,7 +147,7 @@ public class BasicDynaBean implements Dy
}
// Return a null value for a non-primitive property
- Class type = getDynaProperty(name).getType();
+ Class<?> type = getDynaProperty(name).getType();
if (!type.isPrimitive()) {
return (value);
}
@@ -201,7 +201,7 @@ public class BasicDynaBean implements Dy
} else if (value.getClass().isArray()) {
return (Array.get(value, index));
} else if (value instanceof List) {
- return ((List) value).get(index);
+ return ((List<?>) value).get(index);
} else {
throw new IllegalArgumentException
("Non-indexed property for '" + name + "[" + index + "]'");
@@ -230,7 +230,7 @@ public class BasicDynaBean implements Dy
throw new NullPointerException
("No mapped value for '" + name + "(" + key + ")'");
} else if (value instanceof Map) {
- return (((Map) value).get(key));
+ return (((Map<?, ?>) value).get(key));
} else {
throw new IllegalArgumentException
("Non-mapped property for '" + name + "(" + key + ")'");
@@ -270,7 +270,7 @@ public class BasicDynaBean implements Dy
throw new NullPointerException
("No mapped value for '" + name + "(" + key + ")'");
} else if (value instanceof Map) {
- ((Map) value).remove(key);
+ ((Map<?, ?>) value).remove(key);
} else {
throw new IllegalArgumentException
("Non-mapped property for '" + name + "(" + key + ")'");
@@ -338,7 +338,11 @@ public class BasicDynaBean implements Dy
Array.set(prop, index, value);
} else if (prop instanceof List) {
try {
- ((List) prop).set(index, value);
+ @SuppressWarnings("unchecked")
+ // This is safe to cast because list properties are always
+ // of type Object
+ List<Object> list = (List<Object>) prop;
+ list.set(index, value);
} catch (ClassCastException e) {
throw new ConversionException(e.getMessage());
}
@@ -371,7 +375,11 @@ public class BasicDynaBean implements Dy
throw new NullPointerException
("No mapped value for '" + name + "(" + key + ")'");
} else if (prop instanceof Map) {
- ((Map) prop).put(key, value);
+ @SuppressWarnings("unchecked")
+ // This is safe to cast because mapped properties are always
+ // maps of types String -> Object
+ Map<String, Object> map = (Map<String, Object>) prop;
+ map.put(key, value);
} else {
throw new IllegalArgumentException
("Non-mapped property for '" + name + "(" + key + ")'");
@@ -412,7 +420,7 @@ public class BasicDynaBean implements Dy
* @return <code>true</code> if the source class is assignable to the
* destination class, otherwise <code>false</code>
*/
- protected boolean isAssignable(Class dest, Class source) {
+ protected boolean isAssignable(Class<?> dest, Class<?> source) {
if (dest.isAssignableFrom(source) ||
((dest == Boolean.TYPE) && (source == Boolean.class)) ||
Modified: commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BasicDynaClass.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BasicDynaClass.java?rev=1540186&r1=1540185&r2=1540186&view=diff
==============================================================================
--- commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BasicDynaClass.java (original)
+++ commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BasicDynaClass.java Fri Nov 8 21:08:30 2013
@@ -58,7 +58,7 @@ public class BasicDynaClass implements D
* @param name Name of this DynaBean class
* @param dynaBeanClass The implementation class for new instances
*/
- public BasicDynaClass(String name, Class dynaBeanClass) {
+ public BasicDynaClass(String name, Class<?> dynaBeanClass) {
this(name, dynaBeanClass, null);
@@ -72,7 +72,7 @@ public class BasicDynaClass implements D
* @param dynaBeanClass The implementation class for new intances
* @param properties Property descriptors for the supported properties
*/
- public BasicDynaClass(String name, Class dynaBeanClass,
+ public BasicDynaClass(String name, Class<?> dynaBeanClass,
DynaProperty[] properties) {
super();
@@ -97,14 +97,14 @@ public class BasicDynaClass implements D
* The constructor of the <code>dynaBeanClass</code> that we will use
* for creating new instances.
*/
- protected transient Constructor constructor = null;
+ protected transient Constructor<?> constructor = null;
/**
* The method signature of the constructor we will use to create
* new DynaBean instances.
*/
- protected static Class[] constructorTypes = { DynaClass.class };
+ protected static Class<?>[] constructorTypes = { DynaClass.class };
/**
@@ -118,7 +118,7 @@ public class BasicDynaClass implements D
* The <code>DynaBean</code> implementation class we will use for
* creating new instances.
*/
- protected Class dynaBeanClass = BasicDynaBean.class;
+ protected Class<?> dynaBeanClass = BasicDynaBean.class;
/**
@@ -138,7 +138,7 @@ public class BasicDynaClass implements D
* keyed by the property name. Individual descriptor instances will
* be the same instances as those in the <code>properties</code> list.
*/
- protected HashMap propertiesMap = new HashMap();
+ protected HashMap<String, DynaProperty> propertiesMap = new HashMap<String, DynaProperty>();
// ------------------------------------------------------ DynaClass Methods
@@ -175,7 +175,7 @@ public class BasicDynaClass implements D
throw new IllegalArgumentException
("No property name specified");
}
- return ((DynaProperty) propertiesMap.get(name));
+ return propertiesMap.get(name);
}
@@ -237,7 +237,7 @@ public class BasicDynaClass implements D
*
* @return The class of the {@link DynaBean}
*/
- public Class getDynaBeanClass() {
+ public Class<?> getDynaBeanClass() {
return (this.dynaBeanClass);
@@ -257,7 +257,7 @@ public class BasicDynaClass implements D
* @exception IllegalArgumentException if the specified Class does not
* implement the <code>DynaBean</code> interface
*/
- protected void setDynaBeanClass(Class dynaBeanClass) {
+ protected void setDynaBeanClass(Class<?> dynaBeanClass) {
// Validate the argument type specified
if (dynaBeanClass.isInterface()) {
Modified: commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanComparator.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanComparator.java?rev=1540186&r1=1540185&r2=1540186&view=diff
==============================================================================
--- commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanComparator.java (original)
+++ commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanComparator.java Fri Nov 8 21:08:30 2013
@@ -17,9 +17,10 @@
package org.apache.commons.beanutils;
-import java.lang.reflect.InvocationTargetException;
import java.io.Serializable;
+import java.lang.reflect.InvocationTargetException;
import java.util.Comparator;
+
import org.apache.commons.collections.comparators.ComparableComparator;
/**
@@ -35,14 +36,20 @@ import org.apache.commons.collections.co
* specified in the constructor. If you are comparing two beans based
* on a property that could contain "null" values, a suitable <code>Comparator</code>
* or <code>ComparatorChain</code> should be supplied in the constructor.
+ * Note that the passed in {@code Comparator} must be able to handle the
+ * passed in objects. Because the type of the property to be compared is not
+ * known at compile time no type checks can be performed by the compiler.
+ * Thus {@code ClassCastException} exceptions can be thrown if unexpected
+ * property values occur.
* </p>
*
+ * @param <B> the type of beans to be compared by this {@code Comparator}
* @version $Id$
*/
-public class BeanComparator implements Comparator, Serializable {
+public class BeanComparator<B> implements Comparator<B>, Serializable {
private String property;
- private Comparator comparator;
+ private final Comparator<?> comparator;
/**
* <p>Constructs a Bean Comparator without a property set.
@@ -96,7 +103,7 @@ public class BeanComparator implements C
* contains null values, a suitable comparator
* may be supplied in this constructor.
*/
- public BeanComparator( String property, Comparator comparator ) {
+ public BeanComparator( String property, Comparator<?> comparator ) {
setProperty( property );
if (comparator != null) {
this.comparator = comparator;
@@ -132,7 +139,7 @@ public class BeanComparator implements C
*
* @return the Comparator being used to compare beans
*/
- public Comparator getComparator() {
+ public Comparator<?> getComparator() {
return comparator;
}
@@ -145,17 +152,17 @@ public class BeanComparator implements C
* @param o2 Object The second bean to get data from to compare
* @return int negative or positive based on order
*/
- public int compare( Object o1, Object o2 ) {
+ public int compare( B o1, B o2 ) {
if ( property == null ) {
// compare the actual objects
- return comparator.compare( o1, o2 );
+ return internalCompare( o1, o2 );
}
try {
Object value1 = PropertyUtils.getProperty( o1, property );
Object value2 = PropertyUtils.getProperty( o2, property );
- return comparator.compare( value1, value2 );
+ return internalCompare( value1, value2 );
}
catch ( IllegalAccessException iae ) {
throw new RuntimeException( "IllegalAccessException: " + iae.toString() );
@@ -184,7 +191,7 @@ public class BeanComparator implements C
return false;
}
- final BeanComparator beanComparator = (BeanComparator) o;
+ final BeanComparator<?> beanComparator = (BeanComparator<?>) o;
if (!comparator.equals(beanComparator.comparator)) {
return false;
@@ -213,4 +220,20 @@ public class BeanComparator implements C
result = comparator.hashCode();
return result;
}
+
+ /**
+ * Compares the given values using the internal {@code Comparator}.
+ * <em>Note</em>: This comparison cannot be performed in a type-safe way; so
+ * {@code ClassCastException} exceptions may be thrown.
+ *
+ * @param val1 the first value to be compared
+ * @param val2 the second value to be compared
+ * @return the result of the comparison
+ */
+ private int internalCompare(Object val1, Object val2) {
+ @SuppressWarnings("rawtypes")
+ // to make the compiler happy
+ Comparator c = comparator;
+ return c.compare(val1, val2);
+ }
}
Modified: commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanMap.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanMap.java?rev=1540186&r1=1540185&r2=1540186&view=diff
==============================================================================
--- commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanMap.java (original)
+++ commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanMap.java Fri Nov 8 21:08:30 2013
@@ -33,10 +33,9 @@ import java.util.Iterator;
import java.util.Map;
import java.util.Set;
-import org.apache.commons.collections.list.UnmodifiableList;
+import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.keyvalue.AbstractMapEntry;
import org.apache.commons.collections.set.UnmodifiableSet;
-import org.apache.commons.collections.Transformer;
/**
* An implementation of Map for JavaBeans which uses introspection to
@@ -47,7 +46,7 @@ import org.apache.commons.collections.Tr
*
* @version $Id$
*/
-public class BeanMap extends AbstractMap implements Cloneable {
+public class BeanMap extends AbstractMap<Object, Object> implements Cloneable {
private transient Object bean;
@@ -499,8 +498,11 @@ public class BeanMap extends AbstractMap
* @return BeanMap keys. The Set returned by this method is not
* modifiable.
*/
+ @SuppressWarnings("unchecked")
+ // The set actually contains strings; however, because it cannot be
+ // modified there is no danger in selling it as Set<Object>
@Override
- public Set keySet() {
+ public Set<Object> keySet() {
return UnmodifiableSet.decorate(readMethods.keySet());
}
@@ -512,10 +514,10 @@ public class BeanMap extends AbstractMap
* @return the unmodifiable set of mappings
*/
@Override
- public Set entrySet() {
- return UnmodifiableSet.decorate(new AbstractSet() {
+ public Set<Map.Entry<Object, Object>> entrySet() {
+ return Collections.unmodifiableSet(new AbstractSet<Map.Entry<Object, Object>>() {
@Override
- public Iterator iterator() {
+ public Iterator<Map.Entry<Object, Object>> iterator() {
return entryIterator();
}
@Override
@@ -532,12 +534,12 @@ public class BeanMap extends AbstractMap
* modifiable.
*/
@Override
- public Collection values() {
- ArrayList answer = new ArrayList( readMethods.size() );
- for ( Iterator iter = valueIterator(); iter.hasNext(); ) {
+ public Collection<Object> values() {
+ ArrayList<Object> answer = new ArrayList<Object>( readMethods.size() );
+ for ( Iterator<Object> iter = valueIterator(); iter.hasNext(); ) {
answer.add( iter.next() );
}
- return UnmodifiableList.decorate(answer);
+ return Collections.unmodifiableList(answer);
}
@@ -551,7 +553,7 @@ public class BeanMap extends AbstractMap
* @return the type of the property, or <code>null</code> if no such
* property exists
*/
- public Class getType(String name) {
+ public Class<?> getType(String name) {
return types.get( name );
}
@@ -562,7 +564,7 @@ public class BeanMap extends AbstractMap
*
* @return an iterator over the keys
*/
- public Iterator keyIterator() {
+ public Iterator<String> keyIterator() {
return readMethods.keySet().iterator();
}
@@ -571,9 +573,9 @@ public class BeanMap extends AbstractMap
*
* @return an iterator over the values
*/
- public Iterator valueIterator() {
- final Iterator iter = keyIterator();
- return new Iterator() {
+ public Iterator<Object> valueIterator() {
+ final Iterator<?> iter = keyIterator();
+ return new Iterator<Object>() {
public boolean hasNext() {
return iter.hasNext();
}
@@ -592,16 +594,20 @@ public class BeanMap extends AbstractMap
*
* @return an iterator over the entries
*/
- public Iterator entryIterator() {
- final Iterator iter = keyIterator();
- return new Iterator() {
+ public Iterator<Map.Entry<Object, Object>> entryIterator() {
+ final Iterator<String> iter = keyIterator();
+ return new Iterator<Map.Entry<Object, Object>>() {
public boolean hasNext() {
return iter.hasNext();
}
- public Object next() {
+ public Map.Entry<Object, Object> next() {
Object key = iter.next();
Object value = get(key);
- return new Entry( BeanMap.this, key, value );
+ @SuppressWarnings("unchecked")
+ // This should not cause any problems; the key is actually a
+ // string, but it does no harm to expose it as Object
+ Map.Entry<Object, Object> tmpEntry = new Entry( BeanMap.this, key, value );
+ return tmpEntry;
}
public void remove() {
throw new UnsupportedOperationException( "remove() not supported for BeanMap" );
@@ -857,7 +863,7 @@ public class BeanMap extends AbstractMap
* @throws IllegalAccessException never
* @throws IllegalArgumentException never
*/
- protected Object convertType( Class newType, Object value )
+ protected Object convertType( Class<?> newType, Object value )
throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
// try call constructor
@@ -884,7 +890,7 @@ public class BeanMap extends AbstractMap
* @return a transformer that will convert strings into that type,
* or null if the given type is not a primitive type
*/
- protected Transformer getTypeTransformer( Class aType ) {
+ protected Transformer getTypeTransformer( Class<?> aType ) {
return typeTransformers.get( aType );
}
Modified: commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanUtils.java?rev=1540186&r1=1540185&r2=1540186&view=diff
==============================================================================
--- commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanUtils.java (original)
+++ commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanUtils.java Fri Nov 8 21:08:30 2013
@@ -176,7 +176,7 @@ public class BeanUtils {
* property cannot be found
* @see BeanUtilsBean#describe
*/
- public static Map describe(Object bean)
+ public static Map<String, String> describe(Object bean)
throws IllegalAccessException, InvocationTargetException,
NoSuchMethodException {
@@ -425,7 +425,7 @@ public class BeanUtils {
* throws an exception
* @see BeanUtilsBean#populate
*/
- public static void populate(Object bean, Map properties)
+ public static void populate(Object bean, Map<String, ? extends Object> properties)
throws IllegalAccessException, InvocationTargetException {
BeanUtilsBean.getInstance().populate(bean, properties);
@@ -468,11 +468,13 @@ public class BeanUtils {
/**
* Create a cache.
+ * @param <K> the key type of the cache
+ * @param <V> the value type of the cache
* @return a new cache
* @since 1.8.0
*/
- public static Map createCache() {
- return new WeakFastHashMap();
+ public static <K, V> Map<K, V> createCache() {
+ return new WeakFastHashMap<K, V>();
}
/**
@@ -481,9 +483,9 @@ public class BeanUtils {
* @return Whether it is fast or not.
* @since 1.8.0
*/
- public static boolean getCacheFast(Map map) {
+ public static boolean getCacheFast(Map<?, ?> map) {
if (map instanceof WeakFastHashMap) {
- return ((WeakFastHashMap)map).getFast();
+ return ((WeakFastHashMap<?, ?>) map).getFast();
} else {
return false;
}
@@ -495,9 +497,9 @@ public class BeanUtils {
* @param fast Whether it should be fast or not.
* @since 1.8.0
*/
- public static void setCacheFast(Map map, boolean fast) {
+ public static void setCacheFast(Map<?, ?> map, boolean fast) {
if (map instanceof WeakFastHashMap) {
- ((WeakFastHashMap)map).setFast(fast);
+ ((WeakFastHashMap<?, ?>)map).setFast(fast);
}
}
}
Modified: commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanUtilsBean.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanUtilsBean.java?rev=1540186&r1=1540185&r2=1540186&view=diff
==============================================================================
--- commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanUtilsBean.java (original)
+++ commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanUtilsBean.java Fri Nov 8 21:08:30 2013
@@ -27,7 +27,6 @@ import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.Map;
import org.apache.commons.beanutils.expression.Resolver;
@@ -56,11 +55,11 @@ public class BeanUtilsBean {
/**
* Contains <code>BeanUtilsBean</code> instances indexed by context classloader.
*/
- private static final ContextClassLoaderLocal
- BEANS_BY_CLASSLOADER = new ContextClassLoaderLocal() {
+ private static final ContextClassLoaderLocal<BeanUtilsBean>
+ BEANS_BY_CLASSLOADER = new ContextClassLoaderLocal<BeanUtilsBean>() {
// Creates the default instance used when the context classloader is unavailable
@Override
- protected Object initialValue() {
+ protected BeanUtilsBean initialValue() {
return new BeanUtilsBean();
}
};
@@ -73,7 +72,7 @@ public class BeanUtilsBean {
* @return The (pseudo-singleton) BeanUtils bean instance
*/
public static BeanUtilsBean getInstance() {
- return (BeanUtilsBean) BEANS_BY_CLASSLOADER.get();
+ return BEANS_BY_CLASSLOADER.get();
}
/**
@@ -258,10 +257,11 @@ public class BeanUtilsBean {
}
}
} else if (orig instanceof Map) {
- Iterator entries = ((Map) orig).entrySet().iterator();
- while (entries.hasNext()) {
- Map.Entry entry = (Map.Entry) entries.next();
- String name = (String)entry.getKey();
+ @SuppressWarnings("unchecked")
+ // Map properties are always of type <String, Object>
+ Map<String, Object> propMap = (Map<String, Object>) orig;
+ for (Map.Entry<String, Object> entry : propMap.entrySet()) {
+ String name = entry.getKey();
if (getPropertyUtils().isWriteable(dest, name)) {
copyProperty(dest, name, entry.getValue());
}
@@ -370,7 +370,7 @@ public class BeanUtilsBean {
// Declare local variables we will require
String propName = resolver.getProperty(name); // Simple name of target property
- Class type = null; // Java type of target property
+ Class<?> type = null; // Java type of target property
int index = resolver.getIndex(name); // Indexed subscript value (if any)
String key = resolver.getKey(name); // Mapped key value (if any)
@@ -381,7 +381,7 @@ public class BeanUtilsBean {
if (dynaProperty == null) {
return; // Skip this property setter
}
- type = dynaProperty.getType();
+ type = dynaPropertyType(dynaProperty, value);
} else {
PropertyDescriptor descriptor = null;
try {
@@ -479,20 +479,20 @@ public class BeanUtilsBean {
* @exception NoSuchMethodException if an accessor method for this
* property cannot be found
*/
- public Map describe(Object bean)
+ public Map<String, String> describe(Object bean)
throws IllegalAccessException, InvocationTargetException,
NoSuchMethodException {
if (bean == null) {
// return (Collections.EMPTY_MAP);
- return (new java.util.HashMap());
+ return (new java.util.HashMap<String, String>());
}
if (log.isDebugEnabled()) {
log.debug("Describing bean: " + bean.getClass().getName());
}
- Map description = new HashMap();
+ Map<String, String> description = new HashMap<String, String>();
if (bean instanceof DynaBean) {
DynaProperty[] descriptors =
((DynaBean) bean).getDynaClass().getDynaProperties();
@@ -503,7 +503,7 @@ public class BeanUtilsBean {
} else {
PropertyDescriptor[] descriptors =
getPropertyUtils().getPropertyDescriptors(bean);
- Class clazz = bean.getClass();
+ Class<?> clazz = bean.getClass();
for (int i = 0; i < descriptors.length; i++) {
String name = descriptors[i].getName();
if (getPropertyUtils().getReadMethod(clazz, descriptors[i]) != null) {
@@ -539,18 +539,16 @@ public class BeanUtilsBean {
if (value == null) {
return (null);
} else if (value instanceof Collection) {
- ArrayList values = new ArrayList();
- Iterator items = ((Collection) value).iterator();
- while (items.hasNext()) {
- Object item = items.next();
+ ArrayList<String> values = new ArrayList<String>();
+ for (Object item : (Collection<?>) value) {
if (item == null) {
- values.add((String) null);
+ values.add(null);
} else {
// convert to string using convert utils
values.add(getConvertUtils().convert(item));
}
}
- return ((String[]) values.toArray(new String[values.size()]));
+ return (values.toArray(new String[values.size()]));
} else if (value.getClass().isArray()) {
int n = Array.getLength(value);
String[] results = new String[n];
@@ -799,7 +797,7 @@ public class BeanUtilsBean {
* @exception InvocationTargetException if the property accessor method
* throws an exception
*/
- public void populate(Object bean, Map properties)
+ public void populate(Object bean, Map<String, ? extends Object> properties)
throws IllegalAccessException, InvocationTargetException {
// Do nothing unless both arguments have been specified
@@ -812,12 +810,9 @@ public class BeanUtilsBean {
}
// Loop through the property name/value pairs to be set
- Iterator entries = properties.entrySet().iterator();
- while (entries.hasNext()) {
-
+ for(Map.Entry<String, ? extends Object> entry : properties.entrySet()) {
// Identify the property name and value(s) to be assigned
- Map.Entry entry = (Map.Entry)entries.next();
- String name = (String) entry.getKey();
+ String name = entry.getKey();
if (name == null) {
continue;
}
@@ -912,7 +907,7 @@ public class BeanUtilsBean {
// Declare local variables we will require
String propName = resolver.getProperty(name); // Simple name of target property
- Class type = null; // Java type of target property
+ Class<?> type = null; // Java type of target property
int index = resolver.getIndex(name); // Indexed subscript value (if any)
String key = resolver.getKey(name); // Mapped key value (if any)
@@ -923,7 +918,7 @@ public class BeanUtilsBean {
if (dynaProperty == null) {
return; // Skip this property setter
}
- type = dynaProperty.getType();
+ type = dynaPropertyType(dynaProperty, value);
} else if (target instanceof Map) {
type = Object.class;
} else if (target != null && target.getClass().isArray() && index >= 0) {
@@ -1070,7 +1065,7 @@ public class BeanUtilsBean {
* @exception ConversionException if thrown by an underlying Converter
* @since 1.8.0
*/
- protected Object convert(Object value, Class type) {
+ protected Object convert(Object value, Class<?> type) {
Converter converter = getConvertUtils().lookup(type);
if (converter != null) {
log.trace(" USING CONVERTER " + converter);
@@ -1091,7 +1086,7 @@ public class BeanUtilsBean {
*/
private static Method getInitCauseMethod() {
try {
- Class[] paramsClasses = new Class[] { Throwable.class };
+ Class<?>[] paramsClasses = new Class<?>[] { Throwable.class };
return Throwable.class.getMethod("initCause", paramsClasses);
} catch (NoSuchMethodException e) {
Log log = LogFactory.getLog(BeanUtils.class);
@@ -1107,4 +1102,20 @@ public class BeanUtilsBean {
return null;
}
}
+
+ /**
+ * Determines the type of a {@code DynaProperty}. Here a special treatment
+ * is needed for mapped properties.
+ *
+ * @param dynaProperty the property descriptor
+ * @param value the value object to be set for this property
+ * @return the type of this property
+ */
+ private static Class<?> dynaPropertyType(DynaProperty dynaProperty,
+ Object value) {
+ if (!dynaProperty.isMapped()) {
+ return dynaProperty.getType();
+ }
+ return (value == null) ? String.class : value.getClass();
+ }
}
Modified: commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanUtilsBean2.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanUtilsBean2.java?rev=1540186&r1=1540185&r2=1540186&view=diff
==============================================================================
--- commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanUtilsBean2.java (original)
+++ commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/BeanUtilsBean2.java Fri Nov 8 21:08:30 2013
@@ -70,7 +70,7 @@ public class BeanUtilsBean2 extends Bean
* @return The converted value
*/
@Override
- protected Object convert(Object value, Class type) {
+ protected Object convert(Object value, Class<?> type) {
return getConvertUtils().convert(value, type);
}
}
Modified: commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConstructorUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConstructorUtils.java?rev=1540186&r1=1540185&r2=1540186&view=diff
==============================================================================
--- commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConstructorUtils.java (original)
+++ commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConstructorUtils.java Fri Nov 8 21:08:30 2013
@@ -42,7 +42,7 @@ public class ConstructorUtils {
// --------------------------------------------------------- Private Members
/** An empty class array */
- private static final Class[] EMPTY_CLASS_PARAMETERS = new Class[0];
+ private static final Class<?>[] EMPTY_CLASS_PARAMETERS = new Class<?>[0];
/** An empty object array */
private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
@@ -55,6 +55,7 @@ public class ConstructorUtils {
*
* <p>The signatures should be assignment compatible.</p>
*
+ * @param <T> the type of the object to be constructed
* @param klass the class to be constructed.
* @param arg the actual argument. May be null (this will result in calling the default constructor).
* @return new instance of <code>klazz</code>
@@ -66,7 +67,7 @@ public class ConstructorUtils {
*
* @see #invokeConstructor(java.lang.Class, java.lang.Object[], java.lang.Class[])
*/
- public static Object invokeConstructor(Class klass, Object arg)
+ public static <T> T invokeConstructor(Class<T> klass, Object arg)
throws
NoSuchMethodException,
IllegalAccessException,
@@ -84,6 +85,7 @@ public class ConstructorUtils {
*
* <p>The signatures should be assignment compatible.</p>
*
+ * @param <T> the type of the object to be constructed
* @param klass the class to be constructed.
* @param args actual argument array. May be null (this will result in calling the default constructor).
* @return new instance of <code>klazz</code>
@@ -95,7 +97,7 @@ public class ConstructorUtils {
*
* @see #invokeConstructor(java.lang.Class, java.lang.Object[], java.lang.Class[])
*/
- public static Object invokeConstructor(Class klass, Object[] args)
+ public static <T> T invokeConstructor(Class<T> klass, Object[] args)
throws
NoSuchMethodException,
IllegalAccessException,
@@ -106,7 +108,7 @@ public class ConstructorUtils {
args = EMPTY_OBJECT_ARRAY;
}
int arguments = args.length;
- Class parameterTypes[] = new Class[arguments];
+ Class<?> parameterTypes[] = new Class<?>[arguments];
for (int i = 0; i < arguments; i++) {
parameterTypes[i] = args[i].getClass();
}
@@ -119,6 +121,7 @@ public class ConstructorUtils {
*
* <p>The signatures should be assignment compatible.</p>
*
+ * @param <T> the type of the object to be constructed
* @param klass the class to be constructed.
* @param args actual argument array. May be null (this will result in calling the default constructor).
* @param parameterTypes parameter types array
@@ -130,10 +133,10 @@ public class ConstructorUtils {
* @throws InstantiationException thrown on the constructor's invocation
* @see Constructor#newInstance
*/
- public static Object invokeConstructor(
- Class klass,
+ public static <T> T invokeConstructor(
+ Class<T> klass,
Object[] args,
- Class[] parameterTypes)
+ Class<?>[] parameterTypes)
throws
NoSuchMethodException,
IllegalAccessException,
@@ -147,7 +150,7 @@ public class ConstructorUtils {
args = EMPTY_OBJECT_ARRAY;
}
- Constructor ctor =
+ Constructor<T> ctor =
getMatchingAccessibleConstructor(klass, parameterTypes);
if (null == ctor) {
throw new NoSuchMethodException(
@@ -164,6 +167,7 @@ public class ConstructorUtils {
*
* <p>The signatures should match exactly.</p>
*
+ * @param <T> the type of the object to be constructed
* @param klass the class to be constructed.
* @param arg the actual argument. May be null (this will result in calling the default constructor).
* @return new instance of <code>klazz</code>
@@ -175,7 +179,7 @@ public class ConstructorUtils {
*
* @see #invokeExactConstructor(java.lang.Class, java.lang.Object[], java.lang.Class[])
*/
- public static Object invokeExactConstructor(Class klass, Object arg)
+ public static <T> T invokeExactConstructor(Class<T> klass, Object arg)
throws
NoSuchMethodException,
IllegalAccessException,
@@ -193,6 +197,7 @@ public class ConstructorUtils {
*
* <p>The signatures should match exactly.</p>
*
+ * @param <T> the type of the object to be constructed
* @param klass the class to be constructed.
* @param args actual argument array. May be null (this will result in calling the default constructor).
* @return new instance of <code>klazz</code>
@@ -204,7 +209,7 @@ public class ConstructorUtils {
*
* @see #invokeExactConstructor(java.lang.Class, java.lang.Object[], java.lang.Class[])
*/
- public static Object invokeExactConstructor(Class klass, Object[] args)
+ public static <T> T invokeExactConstructor(Class<T> klass, Object[] args)
throws
NoSuchMethodException,
IllegalAccessException,
@@ -215,7 +220,7 @@ public class ConstructorUtils {
args = EMPTY_OBJECT_ARRAY;
}
int arguments = args.length;
- Class parameterTypes[] = new Class[arguments];
+ Class<?> parameterTypes[] = new Class[arguments];
for (int i = 0; i < arguments; i++) {
parameterTypes[i] = args[i].getClass();
}
@@ -229,6 +234,7 @@ public class ConstructorUtils {
*
* <p>The signatures should match exactly.</p>
*
+ * @param <T> the type of the object to be constructed
* @param klass the class to be constructed.
* @param args actual argument array. May be null (this will result in calling the default constructor).
* @param parameterTypes parameter types array
@@ -240,10 +246,10 @@ public class ConstructorUtils {
* @throws InstantiationException thrown on the constructor's invocation
* @see Constructor#newInstance
*/
- public static Object invokeExactConstructor(
- Class klass,
+ public static <T> T invokeExactConstructor(
+ Class<T> klass,
Object[] args,
- Class[] parameterTypes)
+ Class<?>[] parameterTypes)
throws
NoSuchMethodException,
IllegalAccessException,
@@ -258,7 +264,7 @@ public class ConstructorUtils {
parameterTypes = EMPTY_CLASS_PARAMETERS;
}
- Constructor ctor = getAccessibleConstructor(klass, parameterTypes);
+ Constructor<T> ctor = getAccessibleConstructor(klass, parameterTypes);
if (null == ctor) {
throw new NoSuchMethodException(
"No such accessible constructor on object: " + klass.getName());
@@ -268,17 +274,18 @@ public class ConstructorUtils {
/**
* Returns a constructor with single argument.
+ * @param <T> the type of the constructor
* @param klass the class to be constructed
* @param parameterType The constructor parameter type
* @return null if matching accessible constructor can not be found.
* @see Class#getConstructor
* @see #getAccessibleConstructor(java.lang.reflect.Constructor)
*/
- public static Constructor getAccessibleConstructor(
- Class klass,
- Class parameterType) {
+ public static <T> Constructor<T> getAccessibleConstructor(
+ Class<T> klass,
+ Class<?> parameterType) {
- Class[] parameterTypes = { parameterType };
+ Class<?>[] parameterTypes = { parameterType };
return getAccessibleConstructor(klass, parameterTypes);
}
@@ -290,9 +297,9 @@ public class ConstructorUtils {
* @see Class#getConstructor
* @see #getAccessibleConstructor(java.lang.reflect.Constructor)
*/
- public static Constructor getAccessibleConstructor(
- Class klass,
- Class[] parameterTypes) {
+ public static <T> Constructor<T> getAccessibleConstructor(
+ Class<T> klass,
+ Class<?>[] parameterTypes) {
try {
return getAccessibleConstructor(
@@ -304,11 +311,12 @@ public class ConstructorUtils {
/**
* Returns accessible version of the given constructor.
+ * @param <T> the type of the constructor
* @param ctor prototype constructor object.
* @return <code>null</code> if accessible constructor can not be found.
* @see java.lang.SecurityManager
*/
- public static Constructor getAccessibleConstructor(Constructor ctor) {
+ public static <T> Constructor<T> getAccessibleConstructor(Constructor<T> ctor) {
// Make sure we have a method to check
if (ctor == null) {
@@ -321,7 +329,7 @@ public class ConstructorUtils {
}
// If the declaring class is public, we are done
- Class clazz = ctor.getDeclaringClass();
+ Class<T> clazz = ctor.getDeclaringClass();
if (Modifier.isPublic(clazz.getModifiers())) {
return (ctor);
}
@@ -350,17 +358,18 @@ public class ConstructorUtils {
* are assignment compatible with the parameter types.
* The first matching constructor is returned.</p>
*
+ * @param <T> the type of the class to be inspected
* @param clazz find constructor for this class
* @param parameterTypes find method with compatible parameters
* @return a valid Constructor object. If there's no matching constructor, returns <code>null</code>.
*/
- private static Constructor getMatchingAccessibleConstructor(
- Class clazz,
- Class[] parameterTypes) {
+ private static <T> Constructor<T> getMatchingAccessibleConstructor(
+ Class<T> clazz,
+ Class<?>[] parameterTypes) {
// see if we can find the method directly
// most of the time this works and it's much faster
try {
- Constructor ctor = clazz.getConstructor(parameterTypes);
+ Constructor<T> ctor = clazz.getConstructor(parameterTypes);
try {
//
// XXX Default access superclass workaround
@@ -389,10 +398,10 @@ public class ConstructorUtils {
// search through all methods
int paramSize = parameterTypes.length;
- Constructor[] ctors = clazz.getConstructors();
+ Constructor<?>[] ctors = clazz.getConstructors();
for (int i = 0, size = ctors.length; i < size; i++) {
// compare parameters
- Class[] ctorParams = ctors[i].getParameterTypes();
+ Class<?>[] ctorParams = ctors[i].getParameterTypes();
int ctorParamSize = ctorParams.length;
if (ctorParamSize == paramSize) {
boolean match = true;
@@ -408,7 +417,7 @@ public class ConstructorUtils {
if (match) {
// get accessible version of method
- Constructor ctor = getAccessibleConstructor(ctors[i]);
+ Constructor<?> ctor = getAccessibleConstructor(ctors[i]);
if (ctor != null) {
try {
ctor.setAccessible(true);
@@ -417,7 +426,11 @@ public class ConstructorUtils {
* TODO: Why?
*/
}
- return ctor;
+ @SuppressWarnings("unchecked")
+ // Class.getConstructors() actually returns constructors
+ // of type T, so it is safe to cast.
+ Constructor<T> typedCtor = (Constructor<T>) ctor;
+ return typedCtor;
}
}
}
Modified: commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ContextClassLoaderLocal.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ContextClassLoaderLocal.java?rev=1540186&r1=1540185&r2=1540186&view=diff
==============================================================================
--- commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ContextClassLoaderLocal.java (original)
+++ commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ContextClassLoaderLocal.java Fri Nov 8 21:08:30 2013
@@ -50,14 +50,14 @@ import java.util.WeakHashMap;
* <p>Expected usage is as follows:<br>
* <pre>
* public class SomeClass {
- * private static final ContextClassLoaderLocal global
- * = new ContextClassLoaderLocal() {
- * protected Object initialValue() {
+ * private static final ContextClassLoaderLocal<String> global
+ * = new ContextClassLoaderLocal<String>() {
+ * protected String initialValue() {
* return new String("Initial value");
* };
*
* public void testGlobal() {
- * String s = (String) global.get();
+ * String s = global.get();
* System.out.println("global value:" + s);
* buf.set("New Value");
* }
@@ -97,13 +97,14 @@ import java.util.WeakHashMap;
* containers required each component to load the full set of classes it
* needs, ie avoided providing classes loaded via a "shared" classloader.</p>
*
+ * @param <T> the type of data stored in an instance
* @version $Id$
* @see java.lang.Thread#getContextClassLoader
*/
-public class ContextClassLoaderLocal {
- private final Map valueByClassLoader = new WeakHashMap();
+public class ContextClassLoaderLocal<T> {
+ private final Map<ClassLoader, T> valueByClassLoader = new WeakHashMap<ClassLoader, T>();
private boolean globalValueInitialized = false;
- private Object globalValue;
+ private T globalValue;
/**
* Construct a context classloader instance
@@ -125,7 +126,7 @@ public class ContextClassLoaderLocal {
*
* @return a new Object to be used as an initial value for this ContextClassLoaderLocal
*/
- protected Object initialValue() {
+ protected T initialValue() {
return null;
}
@@ -135,7 +136,7 @@ public class ContextClassLoaderLocal {
* This mechanism provides isolation for web apps deployed in the same container.
* @return the object currently associated with the context-classloader of the current thread.
*/
- public synchronized Object get() {
+ public synchronized T get() {
// synchronizing the whole method is a bit slower
// but guarantees no subtle threading problems, and there's no
// need to synchronize valueByClassLoader
@@ -147,7 +148,7 @@ public class ContextClassLoaderLocal {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
if (contextClassLoader != null) {
- Object value = valueByClassLoader.get(contextClassLoader);
+ T value = valueByClassLoader.get(contextClassLoader);
if ((value == null)
&& !valueByClassLoader.containsKey(contextClassLoader)) {
value = initialValue();
@@ -173,7 +174,7 @@ public class ContextClassLoaderLocal {
*
* @param value the object to be associated with the entrant thread's context classloader
*/
- public synchronized void set(Object value) {
+ public synchronized void set(T value) {
// synchronizing the whole method is a bit slower
// but guarentees no subtle threading problems
Modified: commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConvertUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConvertUtils.java?rev=1540186&r1=1540185&r2=1540186&view=diff
==============================================================================
--- commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConvertUtils.java (original)
+++ commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConvertUtils.java Fri Nov 8 21:08:30 2013
@@ -247,7 +247,7 @@ public class ConvertUtils {
*
* @see ConvertUtilsBean#convert(String, Class)
*/
- public static Object convert(String value, Class clazz) {
+ public static Object convert(String value, Class<?> clazz) {
return ConvertUtilsBean.getInstance().convert(value, clazz);
}
@@ -264,7 +264,7 @@ public class ConvertUtils {
*
* @see ConvertUtilsBean#convert(String[], Class)
*/
- public static Object convert(String[] values, Class clazz) {
+ public static Object convert(String[] values, Class<?> clazz) {
return ConvertUtilsBean.getInstance().convert(values, clazz);
}
@@ -278,7 +278,7 @@ public class ConvertUtils {
*
* @exception ConversionException if thrown by an underlying Converter
*/
- public static Object convert(Object value, Class targetType) {
+ public static Object convert(Object value, Class<?> targetType) {
return ConvertUtilsBean.getInstance().convert(value, targetType);
}
@@ -304,7 +304,7 @@ public class ConvertUtils {
* @param clazz Class for which to remove a registered Converter
* @see ConvertUtilsBean#deregister(Class)
*/
- public static void deregister(Class clazz) {
+ public static void deregister(Class<?> clazz) {
ConvertUtilsBean.getInstance().deregister(clazz);
}
@@ -320,7 +320,7 @@ public class ConvertUtils {
* @return The registered {@link Converter} or <code>null</code> if not found
* @see ConvertUtilsBean#lookup(Class)
*/
- public static Converter lookup(Class clazz) {
+ public static Converter lookup(Class<?> clazz) {
return ConvertUtilsBean.getInstance().lookup(clazz);
}
@@ -333,7 +333,7 @@ public class ConvertUtils {
* @param targetType Class of the value to be converted to
* @return The registered {@link Converter} or <code>null</code> if not found
*/
- public static Converter lookup(Class sourceType, Class targetType) {
+ public static Converter lookup(Class<?> sourceType, Class<?> targetType) {
return ConvertUtilsBean.getInstance().lookup(sourceType, targetType);
}
@@ -348,8 +348,46 @@ public class ConvertUtils {
* Converter
* @see ConvertUtilsBean#register(Converter, Class)
*/
- public static void register(Converter converter, Class clazz) {
+ public static void register(Converter converter, Class<?> clazz) {
ConvertUtilsBean.getInstance().register(converter, clazz);
}
+
+ /**
+ * Change primitive Class types to the associated wrapper class. This is
+ * useful for concrete converter implementations which typically treat
+ * primitive types like their corresponding wrapper types.
+ *
+ * @param type The class type to check.
+ * @return The converted type.
+ * @since 1.9
+ */
+ // All type casts are safe because the TYPE members of the wrapper types
+ // return their own class.
+ @SuppressWarnings("unchecked")
+ public static <T> Class<T> primitiveToWrapper(Class<T> type) {
+ if (type == null || !type.isPrimitive()) {
+ return type;
+ }
+
+ if (type == Integer.TYPE) {
+ return (Class<T>) Integer.class;
+ } else if (type == Double.TYPE) {
+ return (Class<T>) Double.class;
+ } else if (type == Long.TYPE) {
+ return (Class<T>) Long.class;
+ } else if (type == Boolean.TYPE) {
+ return (Class<T>) Boolean.class;
+ } else if (type == Float.TYPE) {
+ return (Class<T>) Float.class;
+ } else if (type == Short.TYPE) {
+ return (Class<T>) Short.class;
+ } else if (type == Byte.TYPE) {
+ return (Class<T>) Byte.class;
+ } else if (type == Character.TYPE) {
+ return (Class<T>) Character.class;
+ } else {
+ return type;
+ }
+ }
}
Modified: commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConvertUtilsBean.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConvertUtilsBean.java?rev=1540186&r1=1540185&r2=1540186&view=diff
==============================================================================
--- commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConvertUtilsBean.java (original)
+++ commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConvertUtilsBean.java Fri Nov 8 21:08:30 2013
@@ -145,7 +145,8 @@ public class ConvertUtilsBean {
* The set of {@link Converter}s that can be used to convert Strings
* into objects of a specified Class, keyed by the destination Class.
*/
- private final WeakFastHashMap converters = new WeakFastHashMap();
+ private final WeakFastHashMap<Class<?>, Converter> converters =
+ new WeakFastHashMap<Class<?>, Converter>();
/**
* The <code>Log</code> instance for this class.
@@ -454,11 +455,11 @@ public class ConvertUtilsBean {
return null;
} else {
Converter converter = lookup(String.class);
- return ((String) converter.convert(String.class, value));
+ return (converter.convert(String.class, value));
}
} else {
Converter converter = lookup(String.class);
- return ((String) converter.convert(String.class, value));
+ return (converter.convert(String.class, value));
}
}
@@ -468,13 +469,14 @@ public class ConvertUtilsBean {
* Convert the specified value to an object of the specified class (if
* possible). Otherwise, return a String representation of the value.
*
+ * @param <T> The desired target type of the conversion
* @param value Value to be converted (may be null)
* @param clazz Java class to be converted to (must not be null)
* @return The converted value
*
* @exception ConversionException if thrown by an underlying Converter
*/
- public Object convert(String value, Class clazz) {
+ public Object convert(String value, Class<?> clazz) {
if (log.isDebugEnabled()) {
log.debug("Convert string '" + value + "' to class '" +
@@ -505,9 +507,9 @@ public class ConvertUtilsBean {
*
* @exception ConversionException if thrown by an underlying Converter
*/
- public Object convert(String[] values, Class clazz) {
+ public Object convert(String[] values, Class<?> clazz) {
- Class type = clazz;
+ Class<?> type = clazz;
if (clazz.isArray()) {
type = clazz.getComponentType();
}
@@ -532,8 +534,9 @@ public class ConvertUtilsBean {
/**
- * <p>Convert the value to an object of the specified class (if
- * possible).</p>
+ * Convert the value to an object of the specified class (if
+ * possible). If no converter for the desired target type is registered,
+ * the passed in object is returned unchanged.
*
* @param value Value to be converted (may be null)
* @param targetType Class of the value to be converted to (must not be null)
@@ -541,9 +544,9 @@ public class ConvertUtilsBean {
*
* @exception ConversionException if thrown by an underlying Converter
*/
- public Object convert(Object value, Class targetType) {
+ public Object convert(Object value, Class<?> targetType) {
- Class sourceType = value == null ? null : value.getClass();
+ Class<?> sourceType = value == null ? null : value.getClass();
if (log.isDebugEnabled()) {
if (value == null) {
@@ -563,7 +566,7 @@ public class ConvertUtilsBean {
}
converted = converter.convert(targetType, value);
}
- if (targetType == String.class && converted != null &&
+ if (String.class.equals(targetType) && converted != null &&
!(converted instanceof String)) {
// NOTE: For backwards compatibility, if the Converter
@@ -789,9 +792,9 @@ public class ConvertUtilsBean {
* value used in the event of a conversion error
* @param defaultArraySize The size of the default array
*/
- private void registerArrayConverter(Class componentType, Converter componentConverter,
+ private void registerArrayConverter(Class<?> componentType, Converter componentConverter,
boolean throwException, int defaultArraySize) {
- Class arrayType = Array.newInstance(componentType, 0).getClass();
+ Class<?> arrayType = Array.newInstance(componentType, 0).getClass();
Converter arrayConverter = null;
if (throwException) {
arrayConverter = new ArrayConverter(arrayType, componentConverter);
@@ -802,7 +805,7 @@ public class ConvertUtilsBean {
}
/** strictly for convenience since it has same parameter order as Map.put */
- private void register(Class clazz, Converter converter) {
+ private void register(Class<?> clazz, Converter converter) {
register(new ConverterFacade(converter), clazz);
}
@@ -812,7 +815,7 @@ public class ConvertUtilsBean {
*
* @param clazz Class for which to remove a registered Converter
*/
- public void deregister(Class clazz) {
+ public void deregister(Class<?> clazz) {
converters.remove(clazz);
@@ -827,9 +830,9 @@ public class ConvertUtilsBean {
* @param clazz Class for which to return a registered Converter
* @return The registered {@link Converter} or <code>null</code> if not found
*/
- public Converter lookup(Class clazz) {
+ public Converter lookup(Class<?> clazz) {
- return ((Converter) converters.get(clazz));
+ return (converters.get(clazz));
}
@@ -842,7 +845,7 @@ public class ConvertUtilsBean {
* @param targetType Class of the value to be converted to
* @return The registered {@link Converter} or <code>null</code> if not found
*/
- public Converter lookup(Class sourceType, Class targetType) {
+ public Converter lookup(Class<?> sourceType, Class<?> targetType) {
if (targetType == null) {
throw new IllegalArgumentException("Target type is missing");
@@ -888,7 +891,7 @@ public class ConvertUtilsBean {
* @param clazz Destination class for conversions performed by this
* Converter
*/
- public void register(Converter converter, Class clazz) {
+ public void register(Converter converter, Class<?> clazz) {
converters.put(clazz, converter);
Modified: commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConvertUtilsBean2.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConvertUtilsBean2.java?rev=1540186&r1=1540185&r2=1540186&view=diff
==============================================================================
--- commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConvertUtilsBean2.java (original)
+++ commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/ConvertUtilsBean2.java Fri Nov 8 21:08:30 2013
@@ -56,7 +56,7 @@ public class ConvertUtilsBean2 extends C
* @see ConvertUtilsBean#convert(String[], Class)
*/
@Override
- public Object convert(String value, Class clazz) {
+ public Object convert(String value, Class<?> clazz) {
return convert((Object)value, clazz);
}
@@ -71,7 +71,7 @@ public class ConvertUtilsBean2 extends C
* @see ConvertUtilsBean#convert(String[], Class)
*/
@Override
- public Object convert(String[] value, Class clazz) {
+ public Object convert(String[] value, Class<?> clazz) {
return convert((Object)value, clazz);
}
Modified: commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/Converter.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/Converter.java?rev=1540186&r1=1540185&r2=1540186&view=diff
==============================================================================
--- commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/Converter.java (original)
+++ commons/proper/beanutils/trunk/src/main/java/org/apache/commons/beanutils/Converter.java Fri Nov 8 21:08:30 2013
@@ -43,6 +43,7 @@ public interface Converter {
* Convert the specified input object into an output object of the
* specified type.
*
+ * @param <T> the desired result type
* @param type Data type to which this value should be converted
* @param value The input value to be converted
* @return The converted value
@@ -50,7 +51,7 @@ public interface Converter {
* @exception ConversionException if conversion cannot be performed
* successfully
*/
- public Object convert(Class type, Object value);
+ public <T> T convert(Class<T> type, Object value);
}