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.2 $
017     */
018    public class Bean2ContextConfigurableAdapter implements ContextConfigurable {
019            private Object bean;
020    
021            public Bean2ContextConfigurableAdapter(Object bean) {
022                    super();
023                    this.bean=bean;
024            }
025            
026            public void configure(Context context, CompositeConverter converter) throws ConfigurationException {
027                    Method[] ma=bean.getClass().getMethods();
028                    for (int i=0; i<ma.length; i++) {
029                            String mname = ma[i].getName();
030                            if (mname.startsWith("set") && mname.length()>=4 && ma[i].getParameterTypes().length==1 && ma[i].getReturnType().equals(void.class)) {                               
031                                    String pName = mname.length()==4 ? mname.toLowerCase().substring(3) : mname.substring(3, 4).toLowerCase() + mname.substring(4);
032                                    Object value=context.get(pName);
033                                    if (value!=null) {
034                                            try {
035                                                    ma[i].invoke(bean, new Object[] {converter.convert(value, ma[i].getParameterTypes()[0], false)});
036                                            } catch (IllegalAccessException e) {
037                                                    throw new ConfigurationException("Cannot invoke method "+ma[i]+" to set parameter value "+value, e);
038                                            } catch (InvocationTargetException e) {
039                                                    throw new ConfigurationException("Cannot invoke method "+ma[i]+" to set parameter value "+value, e);
040                                            }
041                                    }
042                            }
043                    }
044                    
045                    Field[] fa=bean.getClass().getFields();
046                    for (int i=0; i<fa.length; i++) {
047                            Object value=context.get(fa[i].getName());
048                            if (value!=null) {
049                                    try {
050                                            fa[i].set(bean, converter.convert(value, fa[i].getType(), false));
051                                    } catch (IllegalAccessException e) {
052                                            throw new ConfigurationException("Cannot set field "+fa[i]+" to value "+value, e);
053                                    }
054                            }
055                    }               
056            }
057    }