001 /*
002 @license.text@
003 */
004 package biz.hammurapi.config;
005
006 import java.lang.reflect.Field;
007 import java.lang.reflect.InvocationTargetException;
008 import java.lang.reflect.Method;
009
010 import biz.hammurapi.convert.CompositeConverter;
011
012 /**
013 * Populates a bean with parameters from HttpRequest.
014 * @author Pavel Vlasov
015 *
016 * @version $Revision: 1.3 $
017 */
018 public class BeanContext implements Context {
019 private Object bean;
020
021 public BeanContext(Object bean) {
022 super();
023 this.bean=bean;
024 }
025
026 public Object get(String name) {
027 String[] ni=split(name);
028 Method[] ma=bean.getClass().getMethods();
029
030 for (int i=0; i<ma.length; i++) {
031 Method candidate = ma[i];
032 Class[] cpt = candidate.getParameterTypes();
033 if (cpt.length==ni.length-1 && !candidate.getReturnType().equals(void.class)) {
034 String mname = candidate.getName();
035 if (mname.startsWith("get") && mname.length()>=4) {
036 String pName = mname.length()==4 ? mname.substring(3).toLowerCase() : mname.substring(3, 4).toLowerCase() + mname.substring(4);
037 if (ni[0].equals(pName)) {
038 try {
039 CompositeConverter converter = CompositeConverter.getDefaultConverter();
040 Object[] args=new Object[ni.length-1];
041 for (int j=0; j<args.length; j++) {
042 args[j]=converter.convert(ni[j+1], cpt[j], false);
043 }
044 return candidate.invoke(bean, args);
045 } catch (IllegalAccessException e) {
046 throw new RuntimeConfigurationException("Cannot invoke method "+candidate, e);
047 } catch (InvocationTargetException e) {
048 throw new RuntimeConfigurationException("Cannot invoke method "+candidate, e);
049 }
050 }
051 }
052 }
053 }
054
055 if (ni.length==1) {
056 Field[] fa=bean.getClass().getFields();
057 for (int i=0; i<fa.length; i++) {
058 if (fa[i].getName().equals(ni[0])) {
059 try {
060 return fa[i].get(bean);
061 } catch (IllegalAccessException e) {
062 throw new RuntimeConfigurationException("Cannot get field "+fa[i]+" value", e);
063 }
064 }
065 }
066 }
067
068 return null;
069 }
070
071 /**
072 * Splits property name into getter name and indexes.
073 * Override this method to achieve desired functionality.
074 * @param name Property name.
075 * @return Name split into getter name and indexes, new String[] {name} if not overriden.
076 */
077 protected String[] split(String name) {
078 return new String [] {name};
079 }
080
081 }