Index: ibatis-dbl-2/src/com/ibatis/sqlmap/engine/accessplan/PropertyAccessPlan.java =================================================================== RCS file: /cvsroot/ibatisdb/ibatis-dbl-2/src/com/ibatis/sqlmap/engine/accessplan/PropertyAccessPlan.java,v retrieving revision 1.3 diff -u -r1.3 PropertyAccessPlan.java --- ibatis-dbl-2/src/com/ibatis/sqlmap/engine/accessplan/PropertyAccessPlan.java 6 Aug 2004 20:17:52 -0000 1.3 +++ ibatis-dbl-2/src/com/ibatis/sqlmap/engine/accessplan/PropertyAccessPlan.java 11 May 2005 21:31:45 -0000 @@ -37,9 +37,10 @@ } public void setProperties(Object object, Object[] values) { + int i = 0; try { Object[] arg = new Object[1]; - for (int i = 0; i < propertyNames.length; i++) { + for (;i < propertyNames.length; i++) { arg[0] = values[i]; try { setters[i].invoke(object, arg); @@ -48,15 +49,17 @@ } } } catch (Throwable t) { - throw new NestedRuntimeException("Error setting properties of '" + object + "'. Cause: " + t, t); + throw new NestedRuntimeException("Error setting property '" + setters[i].getName() + + "(" + firstArgType(setters[i]) + "=" + argToString(values[i]) + ")' of '" + object + "'. Cause: " + t, t); } } public Object[] getProperties(Object object) { + int i = 0; Object[] values = new Object[propertyNames.length]; try { //Object[] arg = new Object[1]; - for (int i = 0; i < propertyNames.length; i++) { + for (; i < propertyNames.length; i++) { try { values[i] = getters[i].invoke(object, NO_ARGUMENTS); } catch (Throwable t) { @@ -64,9 +67,41 @@ } } } catch (Throwable t) { - throw new NestedRuntimeException("Error getting properties of '" + object + "'. Cause: " + t, t); + throw new NestedRuntimeException("Error getting property '" + getters[i].getName() + + "(" + firstArgType(setters[i]) + "=" + argToString(values[i]) + ")' of '" + object + "'. Cause: " + t, t); } return values; } + /** + * return a String representation of the object: its value and class + */ + private static final String argToString(Object arg) { + if (arg == null) { + return "null"; + } + StringBuffer buffer = new StringBuffer(arg.toString()); + buffer.append(" ").append(arg.getClass().getName()); + Class[] interfaces = arg.getClass().getInterfaces(); + if (interfaces.length > 0) { + buffer.append(" implements "); + for (int i = 0; i < interfaces.length; i++) { + if (i > 0) { + buffer.append(" "); + } + buffer.append(interfaces[i]); + } + } + return buffer.toString(); + } + + /** + * return a String representation version of the Method's first argument type + * @param m the method, must be non null + * @throws NullPointerException if m is null + */ + private static final String firstArgType(Method m) { + Class[] parameterTypes = m.getParameterTypes(); + return parameterTypes.length == 0 ? "" : parameterTypes[0].getName(); + } }