View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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      // Implementation methods
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 }