001 package org.apache.camel.spring.builder; 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 }