001    package org.apache.camel.spring;
002    
003    import java.lang.reflect.InvocationTargetException;
004    import java.util.HashMap;
005    import java.util.Map;
006    
007    import org.springframework.beans.SimpleTypeConverter;
008    import org.springframework.beans.factory.BeanFactory;
009    import org.springframework.beans.factory.config.RuntimeBeanReference;
010    
011    public class BuilderAction {
012    
013            private final MethodInfo methodInfo;
014            private final HashMap<String, Object> parameterValues;
015    
016            public BuilderAction(MethodInfo methodInfo, HashMap<String, Object> parameterValues) {
017                    this.methodInfo = methodInfo;
018                    this.parameterValues = parameterValues;
019            }
020    
021            public Object invoke(BeanFactory beanFactory, Object rootBuilder, Object contextBuilder) {
022                    SimpleTypeConverter converter = new SimpleTypeConverter();
023                    Object args[] = new Object[methodInfo.parameters.size()];
024                    int pos=0;
025                    for (Map.Entry<String, Class> entry :  methodInfo.parameters.entrySet()) {
026                            String paramName = entry.getKey();
027                            Class paramClass = entry.getValue();
028                            Object value = parameterValues.get(paramName);
029                            if( value != null ) {
030                                    if( value.getClass() == RuntimeBeanReference.class ) {
031                                            value = beanFactory.getBean(((RuntimeBeanReference)value).getBeanName());
032                                    }
033                                    if( value.getClass() == BuilderStatement.class ) {
034                                            BuilderStatement bs = (BuilderStatement) value;
035                                            value = bs.create(beanFactory, rootBuilder);
036                                    }                               
037                                    args[pos] = converter.convertIfNecessary(value, paramClass);                            
038                            }
039                            
040                    }
041                    
042                    try {
043                            return methodInfo.method.invoke(contextBuilder, args);
044                    } catch (InvocationTargetException e) {
045                            throw new IllegalArgumentException(e.getCause());
046                    } catch (RuntimeException e) {
047                            throw e;
048                    } catch (Throwable e) {
049                            throw new IllegalArgumentException(e);
050                    }
051                    
052            }
053    
054            public String getName() {
055                    return methodInfo.getName();
056            }
057    
058            public MethodInfo getMethodInfo() {
059                    return methodInfo;
060            }
061    }