1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.betwixt.expression;
18
19
20 import java.lang.reflect.Method;
21
22 import org.apache.commons.logging.Log;
23 import org.apache.commons.logging.LogFactory;
24
25 /*** <p><code>MethodUpdater</code> updates the current bean context
26 * by calling a WriteMethod with the String value from the XML attribute
27 * or element.</p>
28 *
29 * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
30 * @version $Revision: 438373 $
31 */
32 public class MethodUpdater extends TypedUpdater {
33
34 /*** Logger */
35 private static Log log = LogFactory.getLog( MethodUpdater.class );
36
37 /***
38 * Programmatically set log
39 * @param aLog the implementation to which this class should log
40 */
41 public static void setLog( Log aLog ) {
42 log = aLog;
43 }
44
45 /*** The method to call on the bean */
46 private Method method;
47 /*** Base constructor */
48 public MethodUpdater() {
49 }
50
51 /***
52 * Convenience constructor sets method property
53 * @param method the Method to be invoked on the context's bean in the update
54 */
55 public MethodUpdater(Method method) {
56 setMethod( method );
57 }
58
59 /***
60 * Gets the method which will be invoked by the update
61 *
62 * @return the Method to be invoked by the update
63 */
64 public Method getMethod() {
65 return method;
66 }
67
68 /***
69 * Sets the constant value of this expression
70 * @param method the Method to be invoked by the update
71 */
72 public void setMethod(Method method) {
73 this.method = method;
74 Class[] types = method.getParameterTypes();
75 if ( types == null || types.length <= 0 ) {
76 throw new IllegalArgumentException( "The Method must have at least one parameter" );
77 }
78 setValueType(types[0]);
79 }
80
81
82
83
84
85
86 /***
87 * Returns something useful for logging.
88 * @return something useful for logging
89 */
90 public String toString() {
91 return "MethodUpdater [method=" + method + "]";
92 }
93
94 /***
95 * Updates the bean by method invocation.
96 * @since 0.7
97 */
98 protected void executeUpdate(Context context, Object bean, Object newValue) throws Exception {
99 if ( log.isDebugEnabled() ) {
100 log.debug(
101 "Calling setter method: " + method.getName() + " on bean: " + bean
102 + " with new value: " + newValue
103 );
104 }
105 Object[] arguments = { newValue };
106 try
107 {
108 method.invoke( bean, arguments );
109 }
110 catch (IllegalAccessException e)
111 {
112 method.setAccessible(true);
113 method.invoke( bean, arguments );
114 }
115 }
116 }