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 }