rdonkin 2004/12/01 11:33:01 Modified: betwixt/src/java/org/apache/commons/betwixt BeanProperty.java betwixt/src/java/org/apache/commons/betwixt/expression MethodUpdater.java Log: Improved introspection support for dynabeans Revision Changes Path 1.11 +2 -1 jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/BeanProperty.java Index: BeanProperty.java =================================================================== RCS file: /home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/BeanProperty.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- BeanProperty.java 8 Nov 2004 22:29:11 -0000 1.10 +++ BeanProperty.java 1 Dec 2004 19:33:01 -0000 1.11 @@ -21,6 +21,7 @@ import org.apache.commons.beanutils.DynaProperty; import org.apache.commons.betwixt.expression.DynaBeanExpression; +import org.apache.commons.betwixt.expression.DynaBeanUpdater; import org.apache.commons.betwixt.expression.Expression; import org.apache.commons.betwixt.expression.IteratorExpression; import org.apache.commons.betwixt.expression.MethodExpression; @@ -97,7 +98,7 @@ this.propertyName = dynaProperty.getName(); this.propertyType = dynaProperty.getType(); this.propertyExpression = new DynaBeanExpression( propertyName ); - // todo: add updater + this.propertyUpdater = new DynaBeanUpdater( propertyName, propertyType ); } /** 1.14 +19 -79 jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/expression/MethodUpdater.java Index: MethodUpdater.java =================================================================== RCS file: /home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/expression/MethodUpdater.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- MethodUpdater.java 13 Jun 2004 21:32:45 -0000 1.13 +++ MethodUpdater.java 1 Dec 2004 19:33:01 -0000 1.14 @@ -15,9 +15,8 @@ */ package org.apache.commons.betwixt.expression; -import java.lang.reflect.Array; + import java.lang.reflect.Method; -import java.util.Collection; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -29,7 +28,7 @@ * @author <a href="mailto:[EMAIL PROTECTED]">James Strachan</a> * @version $Revision$ */ -public class MethodUpdater implements Updater { +public class MethodUpdater extends TypedUpdater { /** Logger */ private static Log log = LogFactory.getLog( MethodUpdater.class ); @@ -44,9 +43,6 @@ /** The method to call on the bean */ private Method method; - /** The type of the first parameter of the method */ - private Class valueType; - /** Base constructor */ public MethodUpdater() { } @@ -60,69 +56,6 @@ } /** - * Updates the current bean context with the given String value - * @param context the Context to be updated - * @param newValue the update to this new value - */ - public void update(Context context, Object newValue) { - Object bean = context.getBean(); - if ( bean != null ) { - if ( newValue instanceof String ) { - // try to convert into primitive types - if ( log.isTraceEnabled() ) { - log.trace("Converting primitive to " + valueType); - } - newValue = context.getObjectStringConverter() - .stringToObject( (String) newValue, valueType, null, context ); - } - if ( newValue != null ) { - // check that it is of the correct type -/* - if ( ! valueType.isAssignableFrom( newValue.getClass() ) ) { - log.warn( - "Cannot call setter method: " + method.getName() + " on bean: " + bean - + " with type: " + bean.getClass().getName() - + " as parameter should be of type: " + valueType.getName() - + " but is: " + newValue.getClass().getName() - ); - return; - } -*/ - } - // special case for collection objects into arrays - if (newValue instanceof Collection && valueType.isArray()) { - Collection valuesAsCollection = (Collection) newValue; - Class componentType = valueType.getComponentType(); - if (componentType != null) { - Object[] valuesAsArray = - (Object[]) Array.newInstance(componentType, valuesAsCollection.size()); - newValue = valuesAsCollection.toArray(valuesAsArray); - } - } - - Object[] arguments = { newValue }; - try { - if ( log.isDebugEnabled() ) { - log.debug( - "Calling setter method: " + method.getName() + " on bean: " + bean - + " with new value: " + newValue - ); - } - method.invoke( bean, arguments ); - - } catch (Exception e) { - String valueTypeName = (newValue != null) ? newValue.getClass().getName() : "null"; - log.warn( - "Cannot evaluate method: " + method.getName() + " on bean: " + bean - + " of type: " + bean.getClass().getName() + " with value: " + newValue - + " of type: " + valueTypeName - ); - handleException(context, e); - } - } - } - - /** * Gets the method which will be invoked by the update * * @return the Method to be invoked by the update @@ -141,20 +74,13 @@ if ( types == null || types.length <= 0 ) { throw new IllegalArgumentException( "The Method must have at least one parameter" ); } - this.valueType = types[0]; + setValueType(types[0]); } // Implementation methods //------------------------------------------------------------------------- - /** - * Strategy method to allow derivations to handle exceptions differently. - * @param context the Context being updated when this exception occured - * @param e the Exception that occured during the update - */ - protected void handleException(Context context, Exception e) { - log.info( "Caught exception: " + e, e ); - } + /** * Returns something useful for logging. @@ -162,5 +88,19 @@ */ public String toString() { return "MethodUpdater [method=" + method + "]"; + } + + /** + * Updates the bean by method invocation. + */ + protected void executeUpdate(Context context, Object bean, Object newValue) throws Exception { + if ( log.isDebugEnabled() ) { + log.debug( + "Calling setter method: " + method.getName() + " on bean: " + bean + + " with new value: " + newValue + ); + } + Object[] arguments = { newValue }; + method.invoke( bean, arguments ); } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]