/*
* This software is distributed under the terms of the FSF
* Gnu Lesser General Public License (see lgpl.txt).
*
* This program is distributed WITHOUT ANY WARRANTY. See the
* GNU General Public License for more details.
*/
package com.scooterframework.common.util;
import java.lang.reflect.Method;
import java.util.StringTokenizer;
import com.scooterframework.common.exception.ExecutionException;
import com.scooterframework.common.exception.MethodCreationException;
/**
* <tt>BeanUtil</tt> class has helper methods on beans.
*
* @author (Fei) John Chen
*/
public class BeanUtil {
/**
* Returns method of an object.
*
* @param clz the class type
* @param methodName the method name of the object
* @return the method object
* @exception MethodCreationException if <tt>bean</tt> or
* <tt>method</tt> is null
*/
public static Method getMethod(Class<?> clz, String methodName) {
if (clz == null) {
throw new IllegalArgumentException("BeanUtil.getMethod(): No bean class specified.");
}
if (methodName == null) {
throw new IllegalArgumentException("BeanUtil.getMethod(): No method name specified.");
}
Method method = null;
Method[] methods = clz.getMethods();
for (Method m : methods) {
if (methodName.equalsIgnoreCase(m.getName())) {
method = m;
break;
}
}
if (method == null) {
throw new MethodCreationException(clz.getName(), methodName);
}
return method;
}
/**
* Executes a method of a bean instance.
*
* @param instance the bean instance
* @param methodName the method to be executed
* @param args input parameters for the method
* @return return value of the method
*/
public static Object execute(Object instance, String methodName, Object[] args) {
if (instance == null) {
throw new IllegalArgumentException("Input bean instance is null.");
}
Object result = null;
try {
Method m = getMethod(instance.getClass(), methodName);
result = m.invoke(instance, args);
}
catch(Exception ex) {
throw new ExecutionException(instance.getClass().getName(), methodName, args, ex);
}
return result;
}
/**
* <p>Gets property of a bean for a <tt>property</tt>. </p>
*
* <pre>
* Examples:
* getBeanProperty(pet, "name") -> pet.getName()
* getBeanProperty(pet, "owner.first_name") -> pet.getOwner().getFirstName()
* </pre>
*
* @param bean the bean instance
* @param property the property name
* @return value of the property
*/
public static Object getBeanProperty(Object bean, String property) {
if (property.indexOf('.') == -1)
return _getBeanPropertyData(bean, property);
StringTokenizer st = new StringTokenizer(property, " .");
Object tmp = bean;
while(st.hasMoreTokens()) {
String token = st.nextToken();
tmp = _getBeanPropertyData(tmp, token);
}
return tmp;
}
private static Object _getBeanPropertyData(Object bean, String property) {
String methodName = "get" + WordUtil.camelize(property);
return execute(bean, methodName, null);
}
}